diff -r fa7a3cc6effd -r 6d08f4a05d93 imgtools/buildrom/tools/experimental/metarombuild.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imgtools/buildrom/tools/experimental/metarombuild.pl Fri Jun 25 18:11:34 2010 +0800 @@ -0,0 +1,298 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# +#! perl + +# This script builds ROMs which are specified in a supplied XML file +# To use this script \epoc32\tools\buildrom must be installed on the drive +# with \epoc32\tools in the path + +# Note: The TargetBoard attribute is no longer used but is still needed because of the structure of this script! + +use strict; +use XML::Simple; +use Getopt::Long; +use Cwd; +use Cwd 'abs_path'; +use File::Copy; +use File::Path; + +# Get command line arguments +my ($romspec, $boards, $roms, $logdir, $buildnum, $publish, $help, $version) = ProcessCommandLine(); + +Usage() if ($help); +Version() if ($version); + +die "Romspec xml file must be specified using the -romspec option\n" if (!$romspec); + +# Construct arrays of boards and roms if they were specified +my @boards = split /,/, $boards if ($boards); +my @roms = split /,/, $roms if ($roms); + +# Use the XML::Simple module to parse the romspec and pass the result +# into the $Roms hash reference +my $xml = new XML::Simple; +my $Roms = $xml->XMLin($romspec); + +my $RomList = %$Roms->{'Rom'}; + +my $RomBuildStage = 1; + +foreach my $rom (sort keys %$RomList) +{ + my $board = $RomList->{$rom}->{'TargetBoard'}; + if( (@boards == 0 and @roms == 0) or grep $rom, @roms or grep $board, @boards) + { + BuildRom($RomBuildStage, $RomList, $rom, $logdir, $buildnum ,$publish); + $RomBuildStage++; + } +} + +##################################################### +#### Run buildrom on the specified ROM using ######## +#### info from the romspec.xml ######## +##################################################### +sub BuildRom +{ + my $Stage = shift; # BuildRom stage + my $RomList = shift; # Hash of the romspec.xml + my $rom = shift; # Rom to be built + my $logdir = shift; # logs directory + my $buildnum = shift; # build number + my $publish = shift; # Publish Location + my $type = $ENV{Type}; # type of Build Master or Release + my $builddir = $ENV{BuildDir}; # Build Directory + my $Epocroot = $ENV{EPOCROOT}; # EpocRoot; + my $InFileList=""; # i.e. Platsec, Techview, obyfiles + my $XmlFileList=""; + my $MacroList=""; # for the buildrom -D option + my $TargetBoard = $RomList->{$rom}->{'TargetBoard'}; + my $ImageFile = " -o".$RomList->{$rom}->{'ImageFile'}->{'name'}; # for the buildrom -o option + + # Construct the list of InFiles to pass to buildrom + my $InFiles = %$RomList->{$rom}->{'InFile'}; + foreach my $infile (sort keys %$InFiles) + { + if ($infile eq "name") + { + $InFileList = " ".$InFiles->{'name'} unless (lc($InFiles->{'name'}) eq lc($TargetBoard)); + } + else + { + $InFileList .= " ".$infile unless(lc($infile) eq lc($TargetBoard)); + } + } + my $RomXmlFlag='-f'; + my $XmlFiles = %$RomList->{$rom}->{'XMLFile'}; + foreach my $XmlFlags (keys %$XmlFiles) + { + if ($XmlFlags eq "flag") + { + $RomXmlFlag= $XmlFiles->{'flag'}; + } + } + foreach my $XmlFile (keys %$XmlFiles) + { + if ($XmlFile eq "name") + { + $XmlFileList = "$RomXmlFlag"."$Epocroot"."epoc32\\rom\\include\\".$XmlFiles->{'name'}; + } + else + { + $XmlFileList .= "$RomXmlFlag"."$Epocroot"."epoc32\\rom\\include\\".$XmlFile unless(lc($XmlFile) eq lc($TargetBoard)); + } + } + + # Get the ROM macro if one is defined + if ( defined $RomList->{$rom}->{'Macro'} ) + { + if (defined $RomList->{$rom}->{'Macro'}->{'name'} ) + { + if ( $RomList->{$rom}->{'Macro'}->{'value'} ne "" ) + { + $MacroList = " -D".$RomList->{$rom}->{'Macro'}->{'name'}."=".$RomList->{$rom}->{'Macro'}->{'value'}; + } + else + { + $MacroList = " -D".$RomList->{$rom}->{'Macro'}->{'name'}; + } + } + else + { + my $Macros = %$RomList->{$rom}->{'Macro'}; + foreach my $macro (keys %$Macros) + { + if ( $Macros->{$macro}->{'value'} ne "" ) + { + $MacroList .= " -D".$macro."=".$Macros->{$macro}->{'value'}; + } + else + { + $MacroList .= " -D".$macro; + } + } + } + } + + # Call buildrom + my $buildrom_command = "buildrom $InFileList $MacroList $XmlFileList $ImageFile 2>&1"; + my $gHiResTimer = 0; + if (eval "require Time::HiRes;") + { + $gHiResTimer = 1; + } + else + { + print "Cannot load HiResTimer Module\n"; + } + open TVROMLOG, ">> $logdir\\techviewroms$buildnum.log"; + print TVROMLOG "===------------------------------------------------\n"; + print TVROMLOG "-- Stage=$Stage\n"; + print TVROMLOG "===----------------------------------------------\n"; + print TVROMLOG "-- Stage=$Stage started ".localtime()."\n"; + print TVROMLOG "=== Stage=$Stage == Build $rom\n"; + print TVROMLOG "-- Stage=$Stage == $TargetBoard $InFileList\n"; + print TVROMLOG "-- $buildrom_command\n"; + print TVROMLOG "-- MetaromBuild Executed ID $Stage $buildrom_command \n"; + print TVROMLOG "++ Started at ".localtime()."\n"; + if ($gHiResTimer == 1) + { + print TVROMLOG "+++ HiRes Start ".Time::HiRes::time()."\n"; + } + else + { + # Add the HiRes timer unavailable statement + print TVROMLOG "+++ HiRes Time Unavailable\n"; + } + my $command_output = `$buildrom_command`; + print TVROMLOG $command_output; + if ($?) + { + print TVROMLOG "ERROR: $buildrom_command returned an error code $?\n"; + } + if (($command_output =~m/\d\sFile/g) and ($command_output!~/Failed/ig) and ($command_output!~/Unsucessful/ig)) + { + print TVROMLOG "Rom Built Sucessfully\n"; + } + else + { + print TVROMLOG "ERROR: $buildrom_command failed .Please check log techviewroms$buildnum.log for details\n"; + } + if ($gHiResTimer == 1) + { + print TVROMLOG "+++ HiRes End ".Time::HiRes::time()."\n"; + } + else + { + # Add the HiRes timer unavailable statement + print TVROMLOG "+++ HiRes Time Unavailable\n"; + } + print TVROMLOG "++ Finished at ".localtime()."\n"; + print TVROMLOG "=== Stage=$Stage finished ".localtime()."\n"; + close TVROMLOG; + + # Publishing of Logs and Roms##################### + my $ImageFileXML = $ImageFile ; + $ImageFileXML =~s/^\s-o//i; + $ImageFileXML =~/(.*\d.techview)/; + my $ImageFileXMLresult = $1; + my $cwdir = abs_path ( $ENV { 'PWD' } ); + $cwdir =~s/\//\\/g; + $rom =~ /(\w+).*/; + my $data = $1; + if(($publish ne "")) + { + if($rom =~ /(\w+).*/) + { + my $data = $1; + if(not -d "$publish\\$1") + { + mkpath "$publish\\$1" || die "ERROR: Cannot create $publish\\$1"; # If folder doesnt exist create it + } + opendir(DIR, $cwdir) || die "can't opendir $cwdir: $!"; + my @file_array =readdir(DIR); + foreach ($ImageFileXMLresult) + { + foreach my $ImageFileConcat (@file_array) + { + $ImageFileConcat =~/(.*\d.techview)/; + my $Image = $1; + + if ($ImageFileXMLresult eq $Image) + { + copy ("$cwdir\\$ImageFileConcat" , "$publish\\$data\\");# or die "Cannot copy file:$!"; + } + } + closedir DIR; + } + } + } + else + { + print"Publish Option not used \n"; + } +} + +######################################## +##### Process the command line ######### +######################################## +sub ProcessCommandLine +{ + my ($romspec, $boards, $roms, $publish, $help, $version); + + GetOptions('romspec=s' => \$romspec, + 'roms=s' => \$roms, + 'boards=s' => \$boards, + 'logdir=s' => \$logdir, + 'buildnum=s' => \$buildnum, + 'publish=s' => \$publish, + 'help' => \$help, + 'version' => \$version)|| die Usage(); + + return ($romspec, $boards, $roms, $logdir, $buildnum, $publish, $help, $version); +} + + +sub Usage +{ + print < [options] + + When no options are specified, all ROMs specified in the romspec wil be built. + + Options: + -logdir + -buildnum + -publish + -help + -version + +USAGE_EOF +exit 0; +} + +sub Version +{ + print <