pack_dep_gen.pl 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. #!/usr/bin/env perl
  2. use strict;
  3. use Cwd qw(abs_path getcwd);
  4. use File::Basename;
  5. use File::Path;
  6. my $flag_print = 0;
  7. my $flag_create = 2;
  8. my $flag_modis = 0;
  9. my $flag_overwrite = 0;
  10. if ($ARGV[0] =~ /^--append$/i)
  11. {
  12. $flag_create = 1;
  13. shift @ARGV;
  14. }
  15. elsif ($ARGV[0] =~ /^--extract$/i)
  16. {
  17. $flag_create = 0;
  18. shift @ARGV;
  19. }
  20. elsif ($ARGV[0] =~ /^--modis$/i)
  21. {
  22. $flag_modis = 2;
  23. shift @ARGV;
  24. }
  25. elsif ($ARGV[0] =~ /^--overwrite$/i)
  26. {
  27. $flag_overwrite = 1;
  28. shift @ARGV;
  29. }
  30. if ($#ARGV < 3)
  31. {
  32. die "Usage: pack_dep_gen.pl output.dep target.obj input/parse/dir regular_expression [file_prefix]\n";
  33. }
  34. my $depFile = shift @ARGV;
  35. my $objFile = shift @ARGV;
  36. my $depDirs = shift @ARGV;
  37. my $filters = shift @ARGV;
  38. my $preDirs = shift @ARGV;
  39. my $current = getcwd();
  40. #$current =~ s/\\/\//g;
  41. $current =~ s/\/$//g;
  42. $current = quotemeta($current);
  43. $preDirs .= "/" if ($preDirs ne "");
  44. $preDirs =~ s/\/\//\//g;
  45. if ($flag_create > 0)
  46. {
  47. my @cgenDep;
  48. &CollectDepend(\@cgenDep, $depFile, $depDirs, $filters);
  49. #print "\n" if ($flag_modis == 0);
  50. &WriteDepend(\@cgenDep, $depFile, $objFile, $preDirs);
  51. }
  52. else
  53. {
  54. &ExtractDepend($depFile, $depDirs);
  55. }
  56. sub CollectDepend
  57. {
  58. my $refArray = shift;
  59. my $outputDep = shift;
  60. my $inputDir = shift;
  61. my $exprRule = shift;
  62. my $DIRHANDLE;
  63. my $FILEHANDLE;
  64. if (opendir($DIRHANDLE, $inputDir))
  65. {
  66. }
  67. else
  68. {
  69. #print "Skip for opendir " . $inputDir . "\n";
  70. return 0;
  71. }
  72. my @fileDep = readdir $DIRHANDLE;
  73. closedir $DIRHANDLE;
  74. #print "Processing" if ($flag_modis == 0);
  75. foreach my $dep (@fileDep)
  76. {
  77. next if ($dep !~ /$exprRule\b/i);
  78. if ($outputDep =~ /\b${dep}$/)
  79. {
  80. next if ($flag_create != 1);
  81. }
  82. #print " " . $dep if ($flag_modis == 0);
  83. my $line;
  84. open $FILEHANDLE, "<$inputDir/$dep";
  85. if ($dep =~ /\.lis$/i)
  86. {
  87. # for cgen.exe -src or xcopy
  88. while ($line = <$FILEHANDLE>)
  89. {
  90. if ($line =~ /^(\S+\.\w+)\s*$/i)
  91. {
  92. my $src = $1;
  93. push @$refArray, $src;
  94. }
  95. }
  96. }
  97. elsif ($dep =~ /\.log$/i)
  98. {
  99. # for MoDIS cl.exe or pregen log
  100. while ($line = <$FILEHANDLE>)
  101. {
  102. my $line2;
  103. $line =~ s/[\r\n]//g;
  104. if ($line =~ /\[Dependency\]\s*(.*?)\s*$/i)
  105. {
  106. $line2 = $1;
  107. # workaround for filename with space
  108. $line2 =~ s/\\ /\?/g;
  109. }
  110. elsif ($line =~ /Note: including file:\s*(.*?)\s*$/i)
  111. {
  112. $line2 = $1;
  113. }
  114. foreach my $src (split(/\s+/, $line2))
  115. {
  116. #if (($src ne "") && ($src !~ /\.obj$/i))
  117. if ($src =~ /\.(c|cpp)$/i)
  118. {
  119. unshift(@$refArray, $src);
  120. }
  121. elsif ($src ne "")
  122. {
  123. push(@$refArray, $src);
  124. }
  125. }
  126. }
  127. }
  128. else
  129. {
  130. # for Target armcc.exe
  131. while ($line = <$FILEHANDLE>)
  132. {
  133. next if ($line =~ /^\#/i);
  134. $line =~ s/[\r\n]//g;
  135. $line =~ s/^\s*(\S+\:)?\s*(.*?)\s*(\\)?$/$2/;
  136. foreach my $src (split(/\s+/, $line))
  137. {
  138. if (($src ne "") && ($src !~ /[\\\/]~/) && ($src !~ /^~/))
  139. {
  140. if ($src =~ /\.(c|cpp)$/i)
  141. {
  142. unshift(@$refArray, $src);
  143. }
  144. else
  145. {
  146. push(@$refArray, $src);
  147. }
  148. }
  149. }
  150. }
  151. }
  152. close $FILEHANDLE;
  153. }
  154. }
  155. sub WriteDepend
  156. {
  157. my $refArray = shift;
  158. my $outputDep = shift;
  159. my $targetDep = shift;
  160. my $prefixDir = shift;
  161. my $objFirst = 1;
  162. my $outText;
  163. my $outTail = "\n";
  164. my %saw;
  165. my @fileDep = grep (!$saw{$_}++, @$refArray);
  166. my %fileSrc;
  167. my %fileObj;
  168. foreach my $dep (@fileDep)
  169. {
  170. if ($dep ne "")
  171. {
  172. $dep = $prefixDir . $dep if ($dep !~ /^[a-zA-Z]:\\/);
  173. $dep =~ s/[\\\/]+/\//g;
  174. $dep =~ s/\/\.\//\//g;
  175. $dep =~ s/^\.\///;
  176. while ($dep =~ /\w+\/\.\.\//)
  177. {
  178. $dep =~ s/\w+\/\.\.\///;
  179. }
  180. while ($dep =~ /^(\/)?\.\.\//)
  181. {
  182. $dep =~ s/^(\/)?\.\.\///;# remove "..\"
  183. }
  184. while ($dep =~ /^\w\:\/\.\.\//)
  185. {
  186. $dep =~ s/^(\w\:\/)\.\.\//$1/;# remove "k:\..\"
  187. }
  188. $dep =~ s/^$current\///i;
  189. if ($flag_modis)
  190. {
  191. $dep =~ s/^[k-z]\:[\/]+//i;# for subst
  192. if ($dep =~ /.+\/(\S+?)\.(c|cpp)$/i)
  193. {
  194. $fileSrc{lc($1)} = $dep;
  195. if ($^O eq "MSWin32")
  196. {
  197. $fileSrc{lc($1)} =~ s/\//\\/g;
  198. }
  199. next;
  200. }
  201. elsif ($dep =~ /.+\/(\S+?)\.obj$/i)
  202. {
  203. $fileObj{lc($1)} = $fileSrc{lc($1)};
  204. next;
  205. }
  206. elsif ($dep =~ /\/auto_header\.h/i)
  207. {
  208. next;
  209. }
  210. }
  211. if ($dep =~ /\?/)
  212. {
  213. my $dep_tmp = $dep;
  214. $dep_tmp =~ s/\?/ /g;
  215. next if (! -e $dep_tmp);
  216. $dep =~ s/\?/\\ /g;
  217. }
  218. else
  219. {
  220. next if (! -e $dep);
  221. }
  222. # skip temp file
  223. if ($objFirst)
  224. {
  225. #$outText .= " $dep";
  226. $outText .= " \\\n $dep";
  227. $objFirst = 0;
  228. }
  229. else
  230. {
  231. $outText .= " \\\n $dep";
  232. }
  233. $outTail .= "$dep:\n";
  234. }
  235. }
  236. my $FILEHANDLE;
  237. my $outputDir = dirname($outputDep);
  238. mkpath($outputDir) if (! -d $outputDir);
  239. if ($flag_overwrite)
  240. {
  241. open $FILEHANDLE, ">>$outputDep" or die "Fail to append $outputDep\n";
  242. }
  243. else
  244. {
  245. open $FILEHANDLE, ">$outputDep" or die "Fail to write $outputDep\n";
  246. }
  247. if ($flag_modis)
  248. {
  249. foreach my $key (keys %fileSrc)
  250. {
  251. next if (exists $fileObj{$key});
  252. my $value = $fileSrc{$key};
  253. $outText .= " \\\n $value";
  254. print "include " . $value . " for " . $key ."\n" if ($flag_print);
  255. }
  256. foreach my $key (sort keys %fileObj)
  257. {
  258. print $FILEHANDLE "#UPDATE#\n";
  259. print $FILEHANDLE $key . ".obj: " . $fileObj{$key} . " \\\n ";
  260. print $FILEHANDLE $outText . "\n";
  261. print $FILEHANDLE "#ENDUPDATE#\n";
  262. }
  263. }
  264. else
  265. {
  266. print $FILEHANDLE $targetDep . ":";
  267. print $FILEHANDLE $outText . "\n";
  268. print $FILEHANDLE $outTail . "\n";
  269. }
  270. close $FILEHANDLE;
  271. }
  272. sub ExtractDepend
  273. {
  274. my $inputDep = shift;
  275. my $outputDir = shift;
  276. my $FILEHANDLE;
  277. open $FILEHANDLE, "<$inputDep" or die "Fail to open $inputDep\n";
  278. my @fileDep = <$FILEHANDLE>;
  279. close $FILEHANDLE;
  280. my $targetDep;
  281. foreach my $line (@fileDep)
  282. {
  283. if ($line =~ /\#UPDATE\#/i)
  284. {
  285. }
  286. elsif ($line =~ /^(\S+?):\s*(\S+)\s*\\?/)
  287. {
  288. if ($targetDep ne "")
  289. {
  290. close $FILEHANDLE;
  291. $targetDep = "";
  292. }
  293. $targetDep = $1;
  294. $targetDep =~ s/^.*\\//;
  295. $targetDep =~ s/\.\w+$/.det/;
  296. open $FILEHANDLE, ">$outputDir/$targetDep" or die "Fail to write $outputDir/$targetDep\n";
  297. print $FILEHANDLE "\#UPDATE\#\n";
  298. print $FILEHANDLE $line;
  299. }
  300. elsif ($line =~ /^\s*(\S+)\s*\\?/)
  301. {
  302. print $FILEHANDLE $line;
  303. }
  304. }
  305. if ($targetDep ne "")
  306. {
  307. close $FILEHANDLE;
  308. $targetDep = "";
  309. }
  310. }