diff -r 22486c9c7b15 -r 378360dbbdba imgtools/buildrom/tools/buildrom.pm --- a/imgtools/buildrom/tools/buildrom.pm Wed Jun 23 17:27:59 2010 +0800 +++ b/imgtools/buildrom/tools/buildrom.pm Wed Jun 30 11:35:58 2010 +0800 @@ -65,7 +65,7 @@ my $enforceFeatureManager = 0; # Flag to make Feature Manager mandatory if SYMBIAN_FEATURE_MANAGER macro is defined. my $BuildromMajorVersion = 3 ; -my $BuildromMinorVersion = 24; +my $BuildromMinorVersion = 26; my $BuildromPatchVersion = 0; @@ -150,7 +150,7 @@ -I -- Use for the referenced IBY/OBY files -argfile=xxx -- specify argument-file name containing list of command-line arguments to buildrom -lowmem -- use memory-mapped file for image build to reduce physical memory consumption - -chechcase -- check character case of path/name in oby/iby files, + -checkcase -- check character case of path/name in oby/iby files, the result will be checkcase.log, this option is only valid on windows. -workdir=xxx -- specify a directory to contain generated files. @@ -226,7 +226,7 @@ my $thisdir=cwd; $thisdir=~s-\\-\/-go; # separator from Perl 5.005_02+ is forward slash $thisdir.= "\/" unless $thisdir =~ /\/$/; -$thisdir=~s-^(.:)?\/--o; # remove drive letter and leading backslash +$thisdir =~ s-\/-\\-g if (&is_windows); my $rominclude = $epocroot."epoc32\/rom\/include\/"; $rominclude = &get_epocdrive().$rominclude unless $rominclude =~ /^.:/; @@ -341,7 +341,7 @@ my $checkcase = 0; my $checkcase_platform = ""; my $checkcase_test = 0; -my $invokecmddir = ""; +my $opt_workdir = 0; sub match_obyfile { @@ -354,7 +354,6 @@ # search for the oby file in the list of include directories my @otherDirs = ($rominclude); - push (@otherDirs, $invokecmddir) if ($invokecmddir ne ""); if ($featureVariant{'VALID'}) { @@ -762,28 +761,7 @@ if ( $arg =~ /^-k$/i || $arg =~ /^-keepgoing$/i ) { $opt_k = 1; - next; - }elsif ($arg =~ /^-workdir=(.*)/) - { - my $workdir=$1; - if( $workdir =~ m/ / ) - { - print "* Warning: $workdir contains whitespace, hence the files will be created in default location \n"; - $workdir = ""; - } - if ($workdir ne "") - { - $invokecmddir = cwd; - $invokecmddir=~s-\\-\/-go; # separator from Perl 5.005_02+ is forward slash - $invokecmddir.= "\/" unless $invokecmddir =~ /\/$/; - $workdir =~ s-\\-\/-g; - chdir "$workdir" or die "cannot change to directory $workdir\n"; - $thisdir=cwd; - $thisdir=~s-\\-\/-go; # separator from Perl 5.005_02+ is forward slash - $thisdir.= "\/" unless $thisdir =~ /\/$/; - $thisdir=~s-^(.:)?\/--o; # remove drive letter and leading backslash - } - next; + last; } } foreach my $arg (@argList) @@ -1023,6 +1001,22 @@ } if ($arg =~ /^-workdir=(.*)/) { + my $workdir = $1; + if (!-d $workdir) + { + die "directory $workdir does not exist\n"; + } + my $currentdir = cwd; + chdir "$workdir" or die "cannot change to directory $workdir\n"; + $thisdir=cwd; + $thisdir=~s-\\-\/-go; # separator from Perl 5.005_02+ is forward slash + $thisdir.= "\/" unless $thisdir =~ /\/$/; + if(&is_windows) + { + $thisdir =~ s-\/-\\-g; + } + $opt_workdir = 1; + chdir "$currentdir"; next; } if($arg =~/^-c(.*)/) @@ -1253,7 +1247,8 @@ sub preprocessing_phase { - unlink "tmp1.oby"; + my $temp1OBYFile = $thisdir."tmp1.oby"; + unlink "$temp1OBYFile"; # Macro "ROM_FEATURE_MANAGEMENT" is defined when "-f|fr" or "-fm" is used if (defined ($featureXml)) @@ -1283,14 +1278,13 @@ { # no feature variant so use the standard includes $cppargs .= " -I. -I \"$rominclude\""; - $cppargs .= " -I \"$invokecmddir\"" if ($invokecmddir ne ""); } - print "* cpp -Wno-endif-labels -o tmp1.oby $cppargs\n" if ($opt_v); + print "* cpp -Wno-endif-labels -o $temp1OBYFile $cppargs\n" if ($opt_v); is_existinpath("cpp", romutl::DIE_NOT_FOUND); $errors = 0; - open CPP, "| cpp -Wno-endif-labels -o tmp1.oby $cppargs" or die "* Can't execute cpp"; + open CPP, "| cpp -Wno-endif-labels -o $temp1OBYFile $cppargs" or die "* Can't execute cpp"; foreach my $arg (@obyfiles) { print CPP "\n#line 1 \"$arg\"\n"; @@ -1312,9 +1306,8 @@ } close CPP; my $cpp_status = $?; - die "* cpp failed\n" if ($cpp_status != 0 || !-f "tmp1.oby"); - - my $temp1OBYFile = "tmp1.oby"; + die "* cpp failed\n" if ($cpp_status != 0 || !-f "$temp1OBYFile"); + if( defined ($image_content)) { #Read the OBY file that was generated by the pre-processor @@ -1400,11 +1393,11 @@ @substitutionOrder = ("TODAY", "RIGHT_NOW", "EPOCROOT"); } + my $temp1OBYFile = $thisdir."tmp1.oby"; - open TMP1, "tmp1.oby" or die("* Can't open tmp1.oby\n"); + open TMP1, "$temp1OBYFile" or die("* Can't open $temp1OBYFile\n"); while ($line=) { - if(($line =~ /^\s*romsize\s*=/i) || ( $line=~ /^\s*rom_image/i) || ($line =~ /^\s*data_image/i)) { $onlysmrimage = 0; @@ -1415,7 +1408,7 @@ if ($enforceFeatureManager && (!$featuremanager) && (!$noFeatureManager) ) { my $defaultFeatureDbFlag = 0; - open TMP1, "tmp1.oby" or die("* Can't open tmp1.oby\n"); + open TMP1, "$temp1OBYFile" or die("* Can't open $temp1OBYFile\n"); while ($line=) { if ($line=~/^\s*defaultfeaturedb\s*=?\s*(\S+)/i) @@ -1439,11 +1432,20 @@ } } - open TMP1, "tmp1.oby" or die("* Can't open tmp1.oby\n"); + open TMP1, "$temp1OBYFile" or die("* Can't open $temp1OBYFile\n"); while ($line=) { track_source($line); $line =~ s-\\-\/-g; + + my $tempstring = $epocroot."epoc32"; + if(($line !~ /^\s*\#/) && ($line =~ /\/epoc32/i) + && ($line !~ /EPOCROOT##\/?epoc32/i) && ($line !~ /$tempstring/i)) + { + print "add EPOCROOT for line: $line\n" if ($opt_v); + $line =~ s-\/epoc32-EPOCROOT##epoc32-ig; + } + # # Recognise keywords in lines that we process before substitution # @@ -1802,6 +1804,7 @@ sub dump_obydata { my ($dumpfile, $comment) = @_; + $dumpfile = $thisdir.$dumpfile; unlink($dumpfile); open DUMPFILE, ">$dumpfile" or die("* Can't create $dumpfile\n"); print "* Writing $dumpfile - $comment\n"; @@ -2536,7 +2539,7 @@ } } my @spiargs; #arguments passed to createSpi - push @spiargs, ("-t$targetspi", "-d\/$thisdir", "-hide@hidedatainspi"); + push @spiargs, ("-t$targetspi", "-d$thisdir", "-hide@hidedatainspi"); if($existingspi ne "") { push @spiargs, $existingspi; } &spitool::createSpi(@spiargs, @dataforspi); # external call to } @@ -2702,7 +2705,7 @@ while(defined $spiarray[$imageIdx][$spiIdx]) { if($spiarray[$imageIdx][$spiIdx]{spifile} =~ /(.+)\.(.*)$/) { my $targetspi="$1-$imageIdx-$spiIdx\.$2"; - push @newobydata, "data=" . "\/$thisdir" . $targetspi . " \"" . $spiarray[$imageIdx][$spiIdx]{spi} . "\"\n"; + push @newobydata, "data=" . "$thisdir" . $targetspi . " \"" . $spiarray[$imageIdx][$spiIdx]{spi} . "\"\n"; } $spiIdx++; } @@ -2729,7 +2732,7 @@ while(defined $spiarray[0][$k]) { if($spiarray[0][$k]{spifile} =~ /(.+)\.(.*)$/) { my $targetspi="$1-0-$k\.$2"; - push @newobydata, "data=" . "\/$thisdir" . $targetspi . " \"" . $spiarray[0][$k]{spidir} . $targetspi . "\"\n"; + push @newobydata, "data=" . "$thisdir" . $targetspi . " \"" . $spiarray[0][$k]{spidir} . $targetspi . "\"\n"; } $k++; } @@ -2739,7 +2742,7 @@ while(defined $spiarray[$romimage][$j]) { #put in SPI files for current ROM_IMAGE if($spiarray[$romimage][$j]{spifile} =~ /(.+)\.(.*)$/) { my $targetspi="$1-$romimage-$j\.$2"; - push @newobydata, "data=" . "\/$thisdir" . $targetspi . " \"" . $spiarray[$romimage][$j]{spidir} . $targetspi . "\"\n"; + push @newobydata, "data=" . "$thisdir" . $targetspi . " \"" . $spiarray[$romimage][$j]{spidir} . $targetspi . "\"\n"; } $j++; } @@ -2749,7 +2752,7 @@ while(defined $spiarray[0][$k]) { if($spiarray[0][$k]{spifile} =~ /(.+)\.(.*)$/) { my $targetspi="$1-0-$k\.$2"; - push @newobydata, "data=" . "\/$thisdir" . $targetspi . " \"" . $spiarray[0][$k]{spidir} . $targetspi . "\"\n"; + push @newobydata, "data=" . "$thisdir" . $targetspi . " \"" . $spiarray[0][$k]{spidir} . $targetspi . "\"\n"; } $k++; } @@ -2766,7 +2769,7 @@ while(defined $spiarray[0][$k]) { if($spiarray[0][$k]{spifile} =~ /(.+)\.(.*)$/) { my $targetspi="$1-0-$k\.$2"; - push @newobydata, "data=" . "\/$thisdir" . $targetspi . " \"" . $spiarray[0][$k]{spidir} . $targetspi . "\"\n"; + push @newobydata, "data=" . "$thisdir" . $targetspi . " \"" . $spiarray[0][$k]{spidir} . $targetspi . "\"\n"; } $k++; } @@ -2940,7 +2943,7 @@ my $j=0; while(defined $featurefilearray[$i][$j]) { - my $targetfeaturefile = $featurefilearray[$i][$j]{cfgfile}; + my $targetfeaturefile = $thisdir.$featurefilearray[$i][$j]{cfgfile}; if (!(&featuresutil::createFeatureFile($i,$j,$targetfeaturefile,\@featureslist,$featuremanager))) { $featurefilearray[$i][$j]{cfgfile}= undef; @@ -2971,7 +2974,7 @@ my $targetfeaturefile=$featurefilearray[0][$k]{cfgfile}; if (defined $targetfeaturefile) { - push @newobydata, "data=" . "\/$thisdir" . $targetfeaturefile . " \"" . $featurefilearray[0][$k]{cfgdir} . $targetfeaturefile . "\"\n"; + push @newobydata, "data=" . "$thisdir" . $targetfeaturefile . " \"" . $featurefilearray[0][$k]{cfgdir} . $targetfeaturefile . "\"\n"; } $k++; } @@ -2994,7 +2997,7 @@ if (defined $targetfeaturefile) { - push @newobydata, "data=" . "\/$thisdir" . $targetfeaturefile . " \"" . $featurefilearray[$romimage][$j]{cfgdir} . $destinationfeaturefile . "\"\t\t" . $exattribute . "\n"; + push @newobydata, "data=" . "$thisdir" . $targetfeaturefile . " \"" . $featurefilearray[$romimage][$j]{cfgdir} . $destinationfeaturefile . "\"\t\t" . $exattribute . "\n"; } $j++; } @@ -3015,7 +3018,7 @@ my $targetfeaturefile = $featurefilearray[0][$k]{cfgfile}; if (defined $targetfeaturefile) { - push @newobydata, "data=" . "\/$thisdir" . $targetfeaturefile . " \"" . $featurefilearray[0][$k]{cfgdir} . $targetfeaturefile . "\"\n"; + push @newobydata, "data=" . "$thisdir" . $targetfeaturefile . " \"" . $featurefilearray[0][$k]{cfgdir} . $targetfeaturefile . "\"\n"; } $k++; } @@ -3128,14 +3131,6 @@ } last if $fileExists; } - # for -workdir option, to support relative path to the call path - if (!$fileExists && ($invokecmddir ne "") && ($filename !~ /^([\\\/]|.:)/)) - { - if (-e $invokecmddir.$filename) - { - $fileExists = $invokecmddir.$filename; - } - } # edit the OBY line to use the actual file name which we found. # (maybe) warn if an alternative to the original was selected. @@ -3160,7 +3155,7 @@ # it is a manatory ROMBUILD keyword, in which case it is better # to let ROMBUILD report the missing file rather than report the # missing keyword. - if ($what !~ /^bootbinary|variant|primary|secondary|hide/i) + if ($what !~ /^bootbinary|variant|primary|secondary|hide|dir/i) { $line = "REM MISSING " . $line; print_source_error("Missing file: '$filename' in statement '$what='"); @@ -3502,6 +3497,10 @@ { return $line; } + elsif($line =~ /^\s*dir\s*=.*/i) + { + return $line; + } elsif($line =~ /^\s*bootbinary\s*=(.*)/i) { } @@ -3521,7 +3520,8 @@ $romfile = $4; $tail = $5; } - elsif ($line =~ /(\S+)\s*=\s*"([^"]+)"\s+"\/?(.*)"(.*)$/) + elsif ($line =~ /(\S+)\s*=\s*"([^"]+)"\s+"\/?(.*)"(.*)$/ + || $line =~ /(\S+)\s*=\s*"([^"]+)"\s+\/?(\S+)(.*)$/) { if ($line !~ /^REM MISSING/i) { @@ -3810,8 +3810,8 @@ if($opt_v) { - my $logWin = "logwin.oby"; - my $logLinux = "loglinux.oby"; + my $logWin = $thisdir."logwin.oby"; + my $logLinux = $thisdir."loglinux.oby"; unlink($logWin); unlink($logLinux); open LOGWIN, ">$logWin" or die("* Can't create $logWin\n"); @@ -3847,7 +3847,7 @@ # # Track ROMNAME, allowing overrides # - if ($line=~/romname\s*=\s*"?(\S+)\.(\S+)"?\s*/i) + if ($line=~/romname\s*[=\s]\s*"?(\S+)\.(\S+)"?\s*/i) { if ($romname ne "" && $opt_o eq "") { @@ -3855,6 +3855,11 @@ } $rombasename = $1; $romname = "$1.$2"; + if ($opt_workdir) + { + $rombasename = $thisdir.$rombasename; + $romname = $thisdir.$romname; + } next; } # @@ -3899,6 +3904,17 @@ # Handle ROMNAME and possible -o override if ($opt_o ne "") { + if ($opt_workdir && $opt_o !~ /^[\\\/]/ && $opt_o !~ /^.:/) + { + $opt_o = $thisdir.$opt_o; + } + if (&is_windows) + { + $opt_o =~ s-\/-\\-g; + }else + { + $opt_o =~ s-\\-\/-g; + } $romname=$opt_o; if ($opt_o=~/(\S+)\.(\S+)/) { @@ -4669,7 +4685,7 @@ } if( $aDllFile =~ /(.*)\.[^.]+$/ ){ my $proxydsofile = "$1.dso"; - $proxydsofile =~ s-$abiDir\/(.*)\/-armv5\/LIB\/-ig; + $proxydsofile =~ s-$abiDir\/(.*)\/-armv5\/lib\/-ig; open PIPE, "getexports -d $proxydsofile|" or die "Can't open file $proxydsofile\n"; while (){ my $line = $_;