blob: 8b2f48c89e05c75ff06b8f79f56e88fe038c86f2 [file] [log] [blame]
use strict;
use Cwd qw(abs_path getcwd);
my $flag_print = 0;
my $flag_create = 2;
my $flag_modis = 0;
if ($ARGV[0] =~ /^--append$/i) {
$flag_create = 1;
shift @ARGV;
} elsif ($ARGV[0] =~ /^--extract$/i) {
$flag_create = 0;
shift @ARGV;
} elsif ($ARGV[0] =~ /^--modis$/i) {
$flag_modis = 2;
shift @ARGV;
}
if ($#ARGV < 3) {
die "Usage: pack_dep_gen.pl output.dep target.obj input/parse/dir regular_expression [file_prefix]\n";
}
my $depFile = shift @ARGV;
my $objFile = shift @ARGV;
my $depDirs = shift @ARGV;
my $filters = shift @ARGV;
my $preDirs = shift @ARGV;
my $current = getcwd();
$current =~ s/\\/\//g;
$current =~ s/\/$//g;
$current = quotemeta($current);
$preDirs .= "/" if ($preDirs ne "");
if ($flag_create > 0) {
my @cgenDep;
&CollectDepend(\@cgenDep, $depFile, $depDirs, $filters);
print "\n" if ($flag_modis == 0);
&WriteDepend(\@cgenDep, $depFile, $objFile, $preDirs);
} else {
&ExtractDepend($depFile, $depDirs);
}
sub CollectDepend {
my $refArray = shift;
my $outputDep = shift;
my $inputDir = shift;
my $exprRule = shift;
my $DIRHANDLE;
my $FILEHANDLE;
if (opendir($DIRHANDLE, $inputDir)) {
} else {
print "Skip for opendir " . $inputDir . "\n";
return 0;
}
my @fileDep = readdir $DIRHANDLE;
closedir $DIRHANDLE;
print "Processing" if ($flag_modis == 0);
foreach my $dep (@fileDep) {
next if ($dep !~ /$exprRule\b/i);
if ($outputDep =~ /\b${dep}$/) {
next if ($flag_create != 1);
}
print " " . $dep if ($flag_modis == 0);
my $line;
open $FILEHANDLE, "<$inputDir/$dep";
if ($dep =~ /\.lis$/i) {
# for cgen.exe -src or xcopy
while ($line = <$FILEHANDLE>) {
if ($line =~ /^(\S+\.\w+)\s*$/i) {
my $src = $1;
push @$refArray, $src;
}
}
}
elsif ($dep =~ /mmi_copy\.log$/i) {
# for ResGenerator_OP
my $log_flag;
my $path;
while ($line = <$FILEHANDLE>) {
my $src;
if ($line =~ /^\s*(.+?)\s*copied from (\S+) to \S+/i) {
my $line2 = $1;
$path = $2;
$log_flag = "";
if ($line2 =~ /^.*?\((\w+\.\w+)\)$/) {
$src = $1;
} elsif ($line2 =~ /^\w+\.\w+$/) {
$src = $line2;
} elsif ($line2 =~ /^.*?\(\*\.(\w+)\)$/) {
$log_flag = $1;
}
} elsif ($log_flag ne "") {
if ($line =~ /(\S+?\.$log_flag)\s*$/i) {
$src = $1;
}
} else {
$log_flag = "";
$path = "";
}
if (($src ne "") && ($path ne "")) {
$path =~ s/^\\//;
$src = $path . "\\" . $src;
push @$refArray, $src;
}
}
} elsif ($dep =~ /\.log$/i) {
# for MoDIS cl.exe or pregen log
while ($line = <$FILEHANDLE>) {
my $line2;
$line =~ s/[\r\n]//g;
if ($line =~ /\[Dependency\]\s*(.*?)\s*$/i) {
$line2 = $1;
} elsif ($line =~ /Note: including file:\s*(.*?)\s*$/i) {
$line2 = $1;
} elsif ($line =~ /Parsing\s+File\s*:\s*(.*?)\s*$/i) {
$line2 = $1;
} elsif ($line =~ /Processing archive:\s*(.*?)\s*$/i) {
$line2 = $1;
} elsif ($line =~ /^Res:\s*(\S+\.\w+)\s*$/i) {
$line2 = $1;
} elsif ($line =~ /^==VenusXML Begin==\s+\[(\S+\.\w+)\]\s*$/i) {
$line2 = $1;
}
next if ($line2 =~ /(Program Files)|(Microsoft Visual Studio)/i);
foreach my $src (split(/\s+/, $line2)) {
#if (($src ne "") && ($src !~ /\.obj$/i))
if ($src =~ /\.(c|cpp)$/i) {
unshift(@$refArray, $src);
} elsif ($src ne "") {
push(@$refArray, $src);
}
}
if ($line2 =~ /\\(Audio|Image)\.zip$/i) {
# for resgen
$line2 =~ s/\\(Audio|Image)\.zip$//i;
print "\n" if ($flag_modis == 0);
my @resDep;
&CollectDepend(\@resDep, $outputDep, $line2, "_file_list\.ini");
$line2 =~ s/^(\w+mmi\\+Customer\\+ResGenerator\\+).*$/$1/i;
foreach my $src (@resDep) {
if ($src =~ /\\+Customer\\+Images\\+\w+\\+(Main|Sub)LCD\\+/i) {
} elsif ($src =~ /\\+Customer\\+Audio\\+(PLUTO|NEPTUNE)\\+\w+\\+/i) {
} else {
push @$refArray, $line2 . $src;
}
}
}
}
} elsif ($dep =~ /\.ini$/i) {
# for audio_file_list.ini binary_file_list.ini images_file_list.ini
while ($line = <$FILEHANDLE>) {
next if ($line =~ /^\[.+\]\s*$/i);
if ($line =~ /^file name\s*\w+\s*=\s*(.*?)\s*$/i) {
push @$refArray, $1;
}
}
} else {
# for Target armcc.exe
while ($line = <$FILEHANDLE>) {
next if ($line =~ /(Program Files)|(Microsoft Visual Studio)/i);
next if ($line =~ /^\#/i);
$line =~ s/[\r\n]//g;
$line =~ s/^\s*(\S+\:)?\s*(.*?)\s*(\\)$/$2/;
foreach my $src (split(/\s+/, $line)) {
next if ($src =~ /mcd[\\\/]include[\\\/]mcd_l3\.h/i);
if (($src ne "") && ($src !~ /[\\\/]~/) && ($src !~ /^~/)) {
if ($src =~ /\.(c|cpp)$/i) {
unshift(@$refArray, $src);
} else {
push(@$refArray, $src);
}
}
}
}
}
close $FILEHANDLE;
}
}
sub WriteDepend {
my $refArray = shift;
my $outputDep = shift;
my $targetDep = shift;
my $prefixDir = shift;
my $objFirst = 1;
my $targetFirst = 1;
my $outText;
my %saw;
my @fileDep = grep (!$saw{$_}++, @$refArray);
my %fileSrc;
my %fileObj;
my $pre_dep;
my %hash_dep;
foreach my $dep (@fileDep) {
if ($dep ne "") {
$dep = $prefixDir . $dep if ($dep !~ /^[a-zA-Z]:\\/);
$dep =~ s/[\\\/]+/\//g;
$dep =~ s/\/\.\//\//g;
$dep =~ s/^\.\///;
while ($dep =~ /\w+\/\.\.\//) {
$dep =~ s/\w+\/\.\.\///;
}
while ($dep =~ /^(\/)?\.\.\// and $dep !~ /^(\/)?\.\.\/common\//) {
$dep =~ s/^(\/)?\.\.\///;# remove "..\" except universal common
}
while ($dep =~ /^\w\:\/\.\.\//) {
$dep =~ s/^(\w\:\/)\.\.\//$1/;# remove "k:\..\"
}
$dep =~ s/^$current\///i;
if ($flag_modis) {
$dep =~ s/^[k-z]\:[\/]+//i;# for subst
if ($dep =~ /.+\/(\S+?)\.(c|cpp)$/i) {
$fileSrc{lc($1)} = $dep;
if ($^O eq "MSWin32") {
$fileSrc{lc($1)} =~ s/\//\\/g;
}
next;
} elsif ($dep =~ /.+\/(\S+?)\.obj$/i) {
$fileObj{lc($1)} = $fileSrc{lc($1)};
next;
} elsif ($dep =~ /\/auto_header\.h/i) {
next;
}
}
# no need to do anything for xxxx.h:
if (! ($dep =~ /(\S+)\:/) ) {
next if (! -e $dep);
}
if (($^O eq "MSWin32") && ($flag_modis)) {
$dep =~ s/\//\\/g;
}
if ($objFirst) {
$outText .= " $dep";
$objFirst = 0;
} else {
if (! ($dep =~ /(\S+)\:/) ) {
$outText .= " \\\n $dep";
}
}
#remove ":" from target and push to hash
$dep =~ s/\://;
$hash_dep{$dep} = 1;
}
}
#creating make target for every prerequisite files
$outText .= "\n";
for (sort(keys %hash_dep)) {
$outText .= "\n$_:";
}
my $FILEHANDLE;
open $FILEHANDLE, ">$outputDep" or die "Fail to write $outputDep\n";
if ($flag_modis) {
foreach my $key (keys %fileSrc) {
next if (exists $fileObj{$key});
my $value = $fileSrc{$key};
$outText .= " \\\n $value";
print "include " . $value . " for " . $key ."\n" if ($flag_print);
}
foreach my $key (sort keys %fileObj) {
print $FILEHANDLE "#UPDATE#\n";
print $FILEHANDLE $key . ".obj: " . $fileObj{$key} . " \\\n ";
print $FILEHANDLE $outText . "\n";
print $FILEHANDLE "#ENDUPDATE#\n";
}
} else {
print $FILEHANDLE $targetDep . ":";
print $FILEHANDLE $outText . "\n";
}
close $FILEHANDLE;
}
sub ExtractDepend {
my $inputDep = shift;
my $outputDir = shift;
my $FILEHANDLE;
open $FILEHANDLE, "<$inputDep" or die "Fail to open $inputDep\n";
my @fileDep = <$FILEHANDLE>;
close $FILEHANDLE;
my $targetDep;
foreach my $line (@fileDep) {
if ($line =~ /\#UPDATE\#/i) {
} elsif ($line =~ /^(\S+?):\s*(\S+)\s*\\/) {
if ($targetDep ne "") {
close $FILEHANDLE;
$targetDep = "";
}
$targetDep = $1;
$targetDep =~ s/^.*\\//;
$targetDep =~ s/\.\w+$/.det/;
open $FILEHANDLE, ">$outputDir/$targetDep" or die "Fail to write $outputDir/$targetDep\n";
print $FILEHANDLE "\#UPDATE\#\n";
print $FILEHANDLE $line;
}
elsif ($line =~ /^\s*(\S+)\s*\\?/)
{
print $FILEHANDLE $line;
}
}
if ($targetDep ne "")
{
close $FILEHANDLE;
$targetDep = "";
}
}