diff -r 000000000000 -r b8ed18f6c07b mmtestenv/mmtesttools/Build/mmbuild.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmtestenv/mmtesttools/Build/mmbuild.pl Thu Oct 07 22:34:12 2010 +0100 @@ -0,0 +1,574 @@ +# Copyright (c) 2003-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: +# + +use strict; +use Env qw(EPOCROOT); + +# literals +my $icl_param = "-i"; +my $misc_param = "-c"; +my $mmf_param = "-m"; +my $all_param = "-f"; +my $test_param = "-t"; +my $testBuild_param = "-b"; +my $extra_param = "-x"; +my $keep_param = "-k"; +my $gccxml_param = "-g"; +my $skipMake_param = "-s"; + +my $setup_comm = "setup"; +my $clean_comm = "clean"; +my $build_comm = "build"; + +my @known_targets = ("wins", "winscw", "arm4", "armi","armv5", "gccxml", "thumb", "mcot", "misa", "mint"); + +my @Cedar_targets = ("winscw", "armv5"); # gccxml must be added explicitly with -g and even then only build gccxml on main code +my @Beech_targets = ("wins", "winscw", "thumb", "mcot"); + +my @default_targets = @Cedar_targets; + +my @physical_targets = ("mcot", "misa", "mint"); # those we just re-build sound drivers for +my $gccxml_target = "gccxml"; +my $x86gcc_target = "x86gcc"; +my @stages = ("export", "makefile", "library", "resource", "target", "final"); +my @tbstages = ("test export", "test makefile", "test library", "test resource", "test target", "test final"); +my @stagesTakingTarget = ("makefile", "library", "resource", "target", "final", + "test makefile", "test library", "test resource", "test target", "test final"); +my $eka2IdentifyFile = "$ENV{EPOCROOT}epoc32\\release\\winscw\\udeb\\winsgui.dll"; # if file present, is EKA2 build +my $x86gccIdentifyFile = "$ENV{EPOCROOT}epoc32\\release\\x86gcc\\udeb\\euser.dll"; # if dir present, x86 environment present + +my @targets; +my $component = ""; # default added later +my $extras = ""; +my $test = ""; +my $testBuild = ""; +my $command = ""; +my $keep = ""; +my $use_gccxml = ""; +my $skipMake = ""; + +my $main_mbc = "__main.mbc"; +my $test_mbc = "__test.mbc"; +my $testBuild_mbc = "__testBuild.mbc"; +my $phys_mbc = "__phys.mbc"; +my $metabld = "metabld"; + +my $targetToolsDir = "..\\..\\..\\..\\..\\TargetTools\\Build"; +my $TargetToolsExists = 0; +if (-d $targetToolsDir) + { + $TargetToolsExists = 1; + print "TargetTools directory exists: $targetToolsDir\n" + } + +# main: + { + # Process command-line + + unless (@ARGV) + { + &Usage(); + } + + &ReadArgs(); + + die "EPOCROOT is not set" unless ($EPOCROOT ne ""); + + $| = 1; # autoflush stdout. + + if ($command eq $setup_comm) + { + &Setup(); + } + elsif ($command eq $clean_comm) + { + &Clean(); + } + elsif ($command eq $build_comm) + { + &Build(); + } + else + { + die "Unknown command"; + } + exit 0; + } + +# +# Subroutines +# + +sub ReadArgs() + { + while (@ARGV) + { + my $param = @ARGV[0]; shift @ARGV; # grab first param and shift along + + if ($param eq "") # ignore blank parameters + { + next; + } + + if ($param eq $icl_param || $param eq $misc_param || + $param eq $mmf_param || $param eq $all_param) + { + $component = $param; + } + elsif ($param eq $test_param) + { + $test = $param; + } + elsif ($param eq $testBuild_param) + { + $testBuild = $param; + } + elsif ($param eq $extra_param) + { + $extras = $param; + } + elsif ($param eq $keep_param) + { + $keep = $param; + } + elsif ($param eq $gccxml_param) + { + $use_gccxml = $param; + } + elsif ($param eq $skipMake_param) + { + $skipMake = $param; + } + elsif ($param eq $setup_comm || $param eq $clean_comm || + $param eq $build_comm) + { + if ($command ne "") + { + &Usage; # scream if we try to state more than one command + } + $command = $param; + } + elsif ($command eq $build_comm) + { + # see if the parameter is one of the list of arguments + my $match = 0; + foreach my $target (@known_targets) + { + if ($target eq $param) + { + $match = 1; + last; # exit loop + } + } + if ($match != 0) + { + $targets[++$#targets] = $param; # append + } + else + { + # was not a valid target + Usage(); + } + } + else + { + # unknown setting + &Usage(); + } + } + &CheckArgs(); + } + +sub CheckArgs() + { + # check that the arguments make sense + if ($command eq $clean_comm || $command eq $build_comm) + { + # for build and cleanup, can't set the required module + if ($component ne "" || $extras ne "") + { + &Usage; + } + } + # for setup, check -t has not been given + if ($command eq $setup_comm) + { + if ($test ne "") + { + &Usage; + } + } + if ($command eq "") + { + # need to state some command + &Usage; + } + } + +sub Setup + { + # default settings + if ($component eq "") + { + $component = $all_param; + } + # some boolean values + my $want_mmf = $component eq $mmf_param | $component eq $all_param; + my $want_icl = $component eq $icl_param | $component eq $all_param; + my $want_misc = $component eq $misc_param | $component eq $all_param; + my $want_extra = $extras ne ""; + # generate .mbc files and then do bldmake + open(OUTFILE, ">".$main_mbc) or die "Can't create file: $!"; + print OUTFILE "//\n//Auto-generated - do not edit!!\n//\n\n"; + print OUTFILE "#include \"mmf.mbc\"\n" if ($want_mmf); + print OUTFILE "#include \"icl.mbc\"\n" if ($want_icl); + print OUTFILE "#include \"Misc.mbc\"\n" if ($want_misc); + print OUTFILE "#include \"mmfOpt.mbc\"\n" if ($want_mmf && $want_extra); + print OUTFILE "#include \"iclOpt.mbc\"\n" if ($want_icl && $want_extra); + print OUTFILE "#include \"MiscOpt.mbc\"\n" if ($want_misc && $want_extra); + close OUTFILE; + + if ($want_mmf) + { + open(OUTFILE, ">".$phys_mbc) or die "Can't create file: $!"; + print OUTFILE "//\n//Auto-generated - do not edit!!\n//\n\n"; + print OUTFILE "#include \"mmfPhys.mbc\"\n"; + print OUTFILE "#include \"mmfOptPhys.mbc\"\n" if ($want_extra); + close OUTFILE; + } + else + { + # only applicable for mmf - otherwise just delete the file + if (-f $phys_mbc) + { + unlink $phys_mbc or die "Couldn't delete $phys_mbc"; + } + } + + open(OUTFILE, ">".$test_mbc) or die "Can't create file: $!"; + print OUTFILE "//\n//Auto-generated - do not edit!!\n//\n\n"; + print OUTFILE "#include \"AllTests.mbc\"\n"; + print OUTFILE "#include \"TestFrameworkTest.mbc\"\n"; + print OUTFILE "#include \"mmfTest.mbc\"\n" if ($want_mmf); + print OUTFILE "#include \"mmfNotOptTest.mbc\"\n" if ($want_mmf && !$want_extra); + print OUTFILE "#include \"iclTest.mbc\"\n" if ($want_icl); + print OUTFILE "#include \"MiscTest.mbc\"\n" if ($want_misc); + print OUTFILE "#include \"mmfOptTest.mbc\"\n" if ($want_mmf && $want_extra); + print OUTFILE "#include \"iclOptTest.mbc\"\n" if ($want_icl && $want_extra); + print OUTFILE "#include \"MiscOptTest.mbc\"\n" if ($want_misc && $want_extra); + if ($TargetToolsExists) + { + print OUTFILE "#include \"TargetTools.mbc\"\n"; + } + close OUTFILE; + + open(OUTFILE, ">".$testBuild_mbc) or die "Can't create file: $!"; + print OUTFILE "//\n//Auto-generated - do not edit!!\n//\n\n"; + print OUTFILE "#include \"mmfTestBuild.mbc\"\n" if ($want_mmf); + print OUTFILE "#include \"iclTestBuild.mbc\"\n" if ($want_icl); + print OUTFILE "#include \"MiscTestBuild.mbc\"\n" if ($want_misc); + print OUTFILE "#include \"mmfOptTestBuild.mbc\"\n" if ($want_mmf && $want_extra); + print OUTFILE "#include \"iclOptTestBuild.mbc\"\n" if ($want_icl && $want_extra); + print OUTFILE "#include \"MiscOptTestBuild.mbc\"\n" if ($want_misc && $want_extra); + close OUTFILE; + + # first getmake does bldmake on the main entries + my $sysComm = $metabld . " " . $main_mbc . " bldmake " . $keep . " bldfiles"; + my $result = system($sysComm); + if ($result != 0 && $keep eq "") + { + print "Error '$sysComm' failed: $result\n"; + exit ($result); + } + my $error = $result; + # second metabld goes through physical + if (-f $phys_mbc) + { + $sysComm = $metabld . " " . $phys_mbc . " bldmake " . $keep . " bldfiles"; + $result = system($sysComm); + if ($result != 0 && $keep eq "") + { + print "Error '$sysComm' failed: $result\n"; + exit ($result); + } + $error |= $result; + } + # third metabld goes through tests + $sysComm = $metabld . " " . $test_mbc . " bldmake " . $keep . " bldfiles"; + $result = system($sysComm); + if ($result != 0 && $keep eq "") + { + print "Error '$sysComm' failed: $result\n"; + exit ($result); + } + $error |= $result; + # fourth metabld goes through test build tests - ignore any dups with the above. Does not make any difference + $sysComm = $metabld . " " . $testBuild_mbc . " bldmake " . $keep . " bldfiles"; + $result = system($sysComm); + if ($result != 0 && $keep eq "") + { + print "Error '$sysComm' failed: $result\n"; + exit ($result); + } + $error |= $result; + if ($error) + { + print "Errors found during run\n"; + exit ($error) + } + } + +sub Clean + { + # first getmake does makefiles on the main entries + # note we generally ignore any errors on this + my $sysComm = $metabld . " " . $main_mbc . " abld " . $keep . " makefile"; + system($sysComm); + if (-f $phys_mbc) + { + my $sysComm = $metabld . " " . $phys_mbc . " abld " . $keep . " makefile"; + system($sysComm); + } + if ($test eq $test_param) + { + # also do for test files + $sysComm = $metabld . " " . $test_mbc . " abld " . $keep . " makefile"; + system($sysComm); + $sysComm = $metabld . " " . $testBuild_mbc . " abld " . $keep . " test makefile"; + system($sysComm); + } + my $sysComm = $metabld . " " . $main_mbc . " abld " . $keep . " reallyclean"; + system($sysComm); + if (-f $phys_mbc) + { + my $sysComm = $metabld . " " . $phys_mbc . " abld " . $keep . " reallyclean"; + system($sysComm); + } + if ($test eq $test_param) + { + # also do for test file + $sysComm = $metabld . " " . $test_mbc . " abld " . $keep . " reallyclean"; + system($sysComm); + $sysComm = $metabld . " " . $testBuild_mbc . " abld " . $keep . " test reallyclean"; + system($sysComm); + } + + } + +sub Build + { + # defaults + if (!(-f $eka2IdentifyFile)) + { + @default_targets = @Beech_targets; + } + + if (@targets == 0) + { + @targets = @default_targets; + } + if ($use_gccxml ne "") + { + $targets[++$#targets] = $gccxml_target; # append + } + if ((-f $x86gccIdentifyFile)) + { + $targets[++$#targets] = $x86gcc_target; # append x86gcc target since Build env present. + } + # for each target we need to go through each stage + # if -k was given, we make all calls and give error at the end + my $error = 0; + foreach my $target (@targets) + { + # work out which .mbc files to use. Key is as follows + # in physical targets and not test, __test.mbc + # in physical targets and test, skip - not currently supported + # not in physical targets and not test, __main.mbc + # not in physical targets and test, __test.mbc + my $build_test = $test ne ""; # -t has been given + my $build_testBuild = $test ne "" && $testBuild ne ""; # -t and -b has been given + my $physical_target = 0; + foreach my $phys (@physical_targets) + { + if ($phys eq $target) + { + $physical_target = 1; + last; # exit loop + } + } + my $mbc; + if ($physical_target && !$test) + { + if (-f $phys_mbc) + { + $mbc = $phys_mbc; + } + else + { + # we don't want to do anything - skip to next target + next; + } + } + elsif ($physical_target && $test) + { + next; # skip to next target + } + elsif (($target eq "gccxml") && $test) # Build GCCXML on the production code only + { + next; # skip to next target + } + elsif (!$physical_target && !$test) + { + $mbc = $main_mbc; + } + elsif ($test ne "") + { + if (!$testBuild) + { + $mbc = $test_mbc; + } + else + { + $mbc = $testBuild_mbc; + } + } + + # if the target is "wins", then check to see if wins is installed and otherwise just do export + # this is intended to get around Cedar builds not having wins. Really out to check for VC++ too, + # but not clear how + my @reqStages = @stages; + @reqStages = @tbstages if $build_testBuild; + if ($target eq "wins") + { + my $euser_lib = $EPOCROOT . "epoc32\\release\\wins\\udeb\\euser.lib"; + if (! -f $euser_lib) + { + print "no WINS installation found - just export\n"; + @reqStages = ( "export" ); + } + } + + + + # now the main loop + foreach my $stage (@reqStages) + { + # export does not take target as parameter, others do + my $takesTarget = 0; + foreach my $stage2 (@stagesTakingTarget) + { + if ($stage eq $stage2) + { + $takesTarget = 1; + last; # exit loop + } + } + if (($stage eq "makefile" || $stage eq "test makefile") && $skipMake ne "") + { + print "Skip makefile\n"; + next; # skip the makefile stage + } + # the command - metabld xxx.mbc command + my $sysComm = $metabld . " " . $mbc . + " abld " . $keep . " " . $stage; + if ($takesTarget) + { + $sysComm .= " " . $target; + } + my $result = system($sysComm); + if ($result != 0) + { + if ($keep ne "") + { + # remember error and keep going + $error |= $result; + } + else + { + print "Error '$sysComm' failed: $result\n"; + exit ($result); + } + } + } + } + if ($error) + { + print "Errors found during run\n"; + exit ($error) + } + } + +sub Usage + { + # print usage statement and exit + print <