author | William Roberts <williamr@symbian.org> |
Sun, 27 Jun 2010 13:33:42 +0100 | |
branch | GCC_SURGE |
changeset 56 | 626366955efb |
parent 25 | 85578ba0aa08 |
child 73 | 22bdd8a90cc4 |
permissions | -rw-r--r-- |
# Copyright (c) 1997-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 FindBin; # for FindBin::Bin use Getopt::Long; my $PerlLibPath; # fully qualified pathname of the directory containing our Perl modules BEGIN { # check user has a version of perl that will cope require 5.005_03; # establish the path to the Perl libraries: currently the same directory as this script $PerlLibPath = $FindBin::Bin; # X:/epoc32/tools $PerlLibPath =~ s/\//\\/g; # X:\epoc32\tools $PerlLibPath .= "\\"; } use lib $PerlLibPath; use E32env; use CheckSource; use FCLoggerUTL; use featurevariantparser; if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} && ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha')) { $ENV{MAKE} = 'make' unless defined $ENV{MAKE}; } # command data structure my %Commands=( BUILD=>{ build=>1, program=>1, what=>1, function=>'Combines commands EXPORT,MAKEFILE,LIBRARY,RESOURCE,TARGET,FINAL', subcommands=>['EXPORT','MAKEFILE', 'LIBRARY', 'RESOURCE', 'TARGET', 'FINAL'], savespace=>1, instructionset=>1, debug=>1, no_debug=>1, logfc=>1, checksource=>1, wrap=>1, #To support Compiler wrapper option along with BUILD command }, CLEAN=>{ build=>1, program=>1, function=>'Removes everything built with ABLD TARGET', what=>1, }, CLEANALL=>{ program=>1, function=>'Removes everything built with ABLD TARGET', what=>1, }, CLEANEXPORT=>{ function=>'Removes files created by ABLD EXPORT', what=>1, noplatform=>1, }, CLEANMAKEFILE=>{ program=>1, function=>'Removes files generated by ABLD MAKEFILE', what=>1, hidden=>1, }, EXPORT=>{ noplatform=>1, what=>1, function=>'Copies the exported files to their destinations', }, FINAL=>{ build=>1, program=>1, function=>'Allows extension makefiles to execute final commands', }, FREEZE=>{ program=>1, remove=>1, function=>'Freezes exported functions in a .DEF file', }, HELP=>{ noplatform=>1, function=>'Displays commands, options or help about a particular command', notest=>1, }, LIBRARY=>{ program=>1, function=>'Creates import libraries from the frozen .DEF files', }, LISTING=>{ build=>1, program=>1, function=>'Creates assembler listing file for corresponding source file', source=>1, }, MAKEFILE=>{ program=>1, function=>'Creates makefiles or IDE workspaces', what=>1, savespace=>1, instructionset=>1, debug=>1, no_debug=>1, logfc=>1, wrap=>1, #To support Compiler wrapper option along with MAKEFILE command }, REALLYCLEAN=>{ build=>1, program=>1, function=>'As CLEAN, but also removes exported files and makefiles', what=>1, subcommands=>['CLEANEXPORT', 'CLEAN', 'CLEANALL'], }, RESOURCE=>{ build=>1, program=>1, function=>'Creates resource files, bitmaps and AIFs', }, # ROMFILE=>{ # function=>'Under development - syntax not finalised', # noverbose=>1, # nokeepgoing=>1, # hidden=>1, # }, ROMFILE=>{ noverbose=>1, build=>1, program=>1, function=>'generates an IBY file to include in a ROM' }, SAVESPACE=>{ build=>1, program=>1, what=>1, function=>'As TARGET, but deletes intermediate files on success', hidden=>1, # hidden because only used internally from savespace flag }, TARGET=>{ build=>1, program=>1, what=>1, function=>'Creates the main executable and also the resources', savespace=>1, checksource=>1, wrap=>1, #To support Compiler wrapper option along with TARGET command }, TIDY=>{ build=>1, program=>1, function=>'Removes executables which need not be released', } ); # get the path to the bldmake-generated files # we can perhaps work this out from the current working directory in later versions my $BldInfDir; my $PrjBldDir; BEGIN { $BldInfDir=shift @ARGV; $PrjBldDir=$E32env::Data{BldPath}; $PrjBldDir=~s-^(.*)\\-$1-o; $PrjBldDir.=$BldInfDir; $PrjBldDir=~m-(.*)\\-o; # remove backslash because some old versions of perl can't cope unless (-d $1) { die "ABLD ERROR: Project Bldmake directory \"$PrjBldDir\" does not exist\n"; } } # check the platform module exists and then load it BEGIN { unless (-e "${PrjBldDir}Platform.pm") { die "ABLD ERROR: \"${PrjBldDir}Platform.pm\" not yet created\n"; } } use lib $PrjBldDir; use Platform; # change directory to the BLD.INF directory - we might begin to do # things with relative paths in the future. chdir($BldInfDir) or die "ABLD ERROR: Can't CD to \"$BldInfDir\"\n"; # MAIN PROGRAM SECTION { # PROCESS THE COMMAND LINE my %Options=(); unless (@ARGV) { &Usage(); } # Process options and check that all are recognised # modified start: added functionality checkwhat unless (GetOptions(\%Options, 'checkwhat|cw','check|c', 'keepgoing|k', 'savespace|s', 'verbose|v', 'what|w', 'remove|r', 'instructionset|i=s', 'checksource|cs', 'debug','no_debug', 'logfc|fc','wrap:s')) { exit 1; } # modified end: added functionality checkwhat # check the option combinations # modified start: added functionality checkwhat if ($Options{checkwhat} ) { $Options{check}=1; } # modified end: added functionality checkwhat if (($Options{check} and $Options{what})) { &Options; } if (($Options{check} or $Options{what}) and ($Options{keepgoing} or $Options{savespace} or $Options{verbose})) { &Options(); } if ($Options{checksource} and $Options{what}) { &Options(); } # take the test parameter out of the command-line if it's there my $Test=''; if (@ARGV && $ARGV[0]=~/^test$/io) { $Test='test'; shift @ARGV; } # if there's only the test parameter there, display usage unless (@ARGV) { &Usage(); } # get the command parameter out of the command line my $Command=uc shift @ARGV; unless (defined $Commands{$Command}) { &Commands(); } my %CommandHash=%{$Commands{$Command}}; # check the test parameter is not specified where it shouldn't be if ($Test and $CommandHash{notest}) { &Help($Command); } # check the options are suitable for the commands # -verbose and -keepgoing have no effect in certain cases if ($Options{what} or $Options{check}) { unless ($CommandHash{what}) { &Help($Command); } } #Function Call Logger if ($Options{logfc}) { unless ($CommandHash{logfc}) { &Help($Command); } } if ($Options{savespace}) { unless ($CommandHash{savespace}) { &Help($Command); } } if ($Options{instructionset}) { unless ($CommandHash{instructionset}) { &Help($Command); } } if ($Options{debug}) { unless ($CommandHash{debug}) { &Help($Command); } } if ($Options{no_debug}) { unless ($CommandHash{no_debug}) { &Help($Command); } } if ($Options{keepgoing}) { if ($CommandHash{nokeepgoing}) { &Help($Command); } } if ($Options{verbose}) { if ($CommandHash{noverbose}) { &Help($Command); } } if ($Options{remove}) { unless ($CommandHash{remove}) { &Help($Command); } } if ($Options{checksource}) { unless ($CommandHash{checksource}) { &Help($Command); } } #Compiler Wrapper support if (exists $Options{wrap}) { unless ($CommandHash{wrap}) { &Help($Command); } } # process help command if necessary if ($Command eq 'HELP') { if (@ARGV) { my $Tmp=uc shift @ARGV; if (defined $Commands{$Tmp}) { &Help($Tmp); } elsif ($Tmp eq 'OPTIONS') { &Options(); } elsif ($Tmp eq 'COMMANDS') { &Commands(); } } &Usage(); } # process parameters my ($Plat, $Bld, $Program, $Source)=('','','',''); my %MakefileVariations; my $FeatureVariantArg; # platform parameter first unless ($CommandHash{noplatform}) { unless ($Plat=uc shift @ARGV) { $Plat='ALL'; # default } else { # Explicit feature variant platforms take the form <base platform>.<variant name> # e.g. armv5.variant1. # If valid, we actually create and invoke a distinct variation of the "base" makefile if ($Plat =~ /^(\S+)\.(\S+)$/) { $Plat = $1; $FeatureVariantArg = uc($2); if (!$Platform::FeatureVariantSupportingPlats{$Plat}) { die "This project does not support platform \"$Plat\.$FeatureVariantArg\"\n"; } else { $MakefileVariations{$Plat} = &GetMakefileVariations($Plat, $FeatureVariantArg); } } COMPARAM1 : { if (grep(/^$Plat$/, ('ALL', @Platform::Plats))) { last COMPARAM1; } if ($Plat =~ /(.*)EDG$/) { my $SubPlat = $1; if (grep(/^$SubPlat$/, ('ALL', @Platform::Plats))) { last COMPARAM1; } } # check whether the platform might in fact be a build, and # set the platform and build accordingly if it is if ($CommandHash{build}) { if ($Plat=~/^(UDEB|UREL|DEB|REL)$/o) { $Bld=$Plat; $Plat='ALL'; last COMPARAM1; } } # check whether the platform might in fact be a program, and # set the platform, build and program accordingly if it is if ($CommandHash{program}) { if (((not $Test) and grep /^$Plat$/, @{$Platform::Programs{ALL}}) or ($Test and grep /^$Plat$/, @{$Platform::TestPrograms{ALL}})) { $Program=$Plat; $Plat='ALL'; $Bld='ALL'; last COMPARAM1; } } # report the error if ($CommandHash{build} and $CommandHash{program}) { die "This project does not support platform, build or $Test program \"$Plat\"\n"; } if ($CommandHash{build} and not $CommandHash{program}) { die "This project does not support platform or build \"$Plat\"\n"; } if ($CommandHash{program} and not $CommandHash{build}) { die "This project does not support platform or $Test program \"$Plat\"\n"; } if (not ($CommandHash{build} or $CommandHash{program})) { die "This project does not support platform \"$Plat\"\n"; } } } } #Compiler Wrapper support my $CompilerWrapperFlagMacro = ""; if(exists $Options{wrap}) { my $error = "Environment variable 'ABLD_COMPWRAP' is not set\n"; # If tool name for wrapping compiler is set in environment variable if($ENV{ABLD_COMPWRAP}) { $CompilerWrapperFlagMacro =" ABLD_COMPWRAP_FLAG=-wrap" . ($Options{wrap} ? "=$Options{wrap}":""); } elsif($Options{keepgoing}) { # If Tool name is not set and keepgoing option is specified then ignore -wrap option and continue processing print $error; delete $Options{wrap}; } else { # Issue error and exit if neither keepgoing option nor tool name is specified die $error; } } # process the build parameter for those commands which require it if ($CommandHash{build}) { unless ($Bld) { unless ($Bld=uc shift @ARGV) { $Bld='ALL'; # default } else { COMPARAM2 : { if ($Bld=~/^(ALL|UDEB|UREL|DEB|REL)$/o) { # Change for TOOLS, TOOLS2 and VC6TOOLS platforms if ($Plat ne 'ALL') { if (($Plat!~/TOOLS2?$/o and $Bld=~/^(DEB|REL)$/o) or ($Plat=~/TOOLS2?$/o and $Bld=~/^(UDEB|UREL)$/o)) { die "Platform \"$Plat\" does not support build \"$Bld\"\n"; } } last COMPARAM2; } # check whether the build might in fact be a program, and # set the build and program if it is if ($CommandHash{program}) { if (((not $Test) and grep /^$Bld$/, @{$Platform::Programs{$Plat}}) or ($Test and grep /^$Bld$/, @{$Platform::TestPrograms{$Plat}})) { $Program=$Bld; $Bld='ALL'; last COMPARAM2; } my $Error="This project does not support build or $Test program \"$Bld\""; if ($Plat eq 'ALL') { $Error.=" for any platform\n"; } else { $Error.=" for platform \"$Plat\"\n"; } die $Error; } my $Error="This project does not support build \"$Bld\""; if ($Plat eq 'ALL') { $Error.=" for any platform\n"; } else { $Error.=" for platform \"$Plat\"\n"; } die $Error; } } } } # get the program parameter for those commands which require it if ($CommandHash{program}) { unless ($Program) { unless ($Program=uc shift @ARGV) { $Program=''; #default - means ALL } else { # check that the program is supported unless (((not $Test) and grep /^$Program$/, @{$Platform::Programs{$Plat}}) or ($Test and grep /^$Program$/, @{$Platform::TestPrograms{$Plat}})) { my $Error="This project does not support $Test program \"$Program\""; if ($Plat eq 'ALL') { $Error.=" for any platform\n"; } else { $Error.=" for platform \"$Plat\"\n"; } die $Error; } } } } # get the source file parameter for those commands which require it if ($CommandHash{source}) { unless ($Source=uc shift @ARGV) { $Source=''; #default - means ALL } else { $Source=" SOURCE=$Source"; } } # check for too many arguments if (@ARGV) { &Help($Command); } if ( $Options{instructionset} ) { # we have a -i option. if ($Plat eq 'ARMV5') { if ( !( ( uc( $Options{instructionset} ) eq "ARM") || ( uc( $Options{instructionset} ) eq "THUMB" ) ) ) { # Only ARM and THUMB options are valid. &Options(); } } else { # Can only use -i for armv5 builds. &Options(); } } # process CHECKSOURCE_OVERRIDE if ($ENV{CHECKSOURCE_OVERRIDE} && (($Plat =~ /^ARMV5/) || ($Plat eq 'WINSCW')) && ($Command eq 'TARGET') && !$Options{what}) { $Options{checksource} = 1; } my $checksourceMakeVariables = " "; if ($Options{checksource}) { $checksourceMakeVariables .= "CHECKSOURCE_VERBOSE=1 " if ($Options{verbose}); } # expand the platform list my @Plats; unless ($CommandHash{noplatform}) { if ($Plat eq 'ALL') { @Plats=@Platform::RealPlats; # Adjust the "ALL" list according to the availability of compilers @Plats=grep !/WINSCW$/o, @Plats unless (defined $ENV{MWSym2Libraries}); @Plats=grep !/WINS$/o, @Plats unless (defined $ENV{MSDevDir}); @Plats=grep !/X86$/o, @Plats unless (defined $ENV{MSDevDir}); @Plats=grep !/X86SMP$/o, @Plats unless (defined $ENV{MSDevDir}); @Plats=grep !/X86GCC$/o, @Plats unless (defined $ENV{MSDevDir}); @Plats=grep !/X86GMP$/o, @Plats unless (defined $ENV{MSDevDir}); if ($CommandHash{build}) { # remove unnecessary platforms if just building for tools, or building everything but tools # so that the makefiles for other platforms aren't created with abld build if ($Bld=~/^(UDEB|UREL)$/o) { @Plats=grep !/TOOLS2?$/o, @Plats; } elsif ($Bld=~/^(DEB|REL)$/o) { @Plats=grep /TOOLS2?$/o, @Plats; } } } else { @Plats=($Plat); } foreach $Plat (@Plats) { # Skip platforms resolved above next if $MakefileVariations{$Plat}; # Implicit feature variant platforms apply when a default feature variant exists and the platform supports it # If valid, we actually create and invoke a distinct variation of the "base" makefile if ($Platform::FeatureVariantSupportingPlats{$Plat} && featurevariantparser->DefaultExists()) { if($Command eq "REALLYCLEAN") { my @myfeature = featurevariantparser->GetBuildableFeatureVariants(); push @{$MakefileVariations{$Plat}}, ".".$_ foreach(@myfeature); } else { $MakefileVariations{$Plat} = &GetMakefileVariations($Plat, "DEFAULT"); } } else { # For non-feature variant platforms we always store a single makefile variation of nothing i.e. # we use the "normal" makefile generated for the platform $MakefileVariations{$Plat} = &GetMakefileVariations($Plat, ""); } } foreach $Plat (@Plats) { foreach my $makefileVariation (@{$MakefileVariations{$Plat}}) { unless (-e "$PrjBldDir$Plat$makefileVariation$Test.make") { die "ABLD ERROR: \"$PrjBldDir$Plat$makefileVariation$Test.make\" not yet created\n"; } } } undef $Plat; } # set up a list of commands where there are sub-commands my @Commands=($Command); if ($CommandHash{subcommands}) { @Commands=@{$CommandHash{subcommands}}; if ($Command eq 'BUILD') { # avoid makefile listings here if ($Options{what} or $Options{check}) { @Commands=grep !/^MAKEFILE$/o, @{$CommandHash{subcommands}}; } } } # implement savespace if necessary if ($Options{savespace}) { foreach $Command (@Commands) { if ($Command eq 'TARGET') { $Command='SAVESPACE'; } } } # set up makefile call flags and macros from the options my $KeepgoingFlag=''; my $KeepgoingMacro=''; my $NoDependencyMacro=''; my $VerboseMacro=' VERBOSE=-s'; if ($Options{keepgoing}) { $KeepgoingFlag=' -k'; $KeepgoingMacro=' KEEPGOING=-k'; } if ($Options{verbose}) { $VerboseMacro=''; } my $RemoveMacro=''; if ($Options{remove}) { $RemoveMacro=' EFREEZE_ALLOW_REMOVE=1'; } if ( ($Options{savespace}) and ($Options{keepgoing}) ){ $NoDependencyMacro=' NO_DEPENDENCIES=-nd'; } my $AbldFlagsMacro=""; $AbldFlagsMacro = "-iarm " if (uc $Options{instructionset} eq "ARM"); $AbldFlagsMacro = "-ithumb " if (uc $Options{instructionset} eq "THUMB"); if ($Options{debug}) { $AbldFlagsMacro .= "-debug "; } elsif($Options{no_debug}) { $AbldFlagsMacro .= "-no_debug "; } #Function call logging flag for makmake if ($Options{logfc}) { #Check the availability and version of logger if (&FCLoggerUTL::PMCheckFCLoggerVersion()) { $AbldFlagsMacro .= "-logfc "; } } if(!($AbldFlagsMacro eq "") ){ $AbldFlagsMacro =" ABLD_FLAGS=\"$AbldFlagsMacro\""; } # set up a list of make calls my @Calls; # handle the exports related calls first if (($Command)=grep /^(.*EXPORT)$/o, @Commands) { # EXPORT, CLEANEXPORT unless (-e "${PrjBldDir}EXPORT$Test.make") { die "ABLD ERROR: \"${PrjBldDir}EXPORT$Test.make\" not yet created\n"; } unless ($Options {checksource}) { if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} && ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha')) { unless ($Options{what} or $Options{check}) { push @Calls, "$ENV{MAKE} -r $KeepgoingFlag -f \"${PrjBldDir}EXPORT$Test.make\" $Command$VerboseMacro$KeepgoingMacro"; } else { push @Calls, "$ENV{MAKE} -r -f \"${PrjBldDir}EXPORT$Test.make\" WHAT"; } } else { unless ($Options{what} or $Options{check}) { push @Calls, "make -r $KeepgoingFlag -f \"${PrjBldDir}EXPORT$Test.make\" $Command$VerboseMacro$KeepgoingMacro"; } else { push @Calls, "make -r -f \"${PrjBldDir}EXPORT$Test.make\" WHAT"; } } } @Commands=grep !/EXPORT$/o, @Commands; } # then do the rest of the calls COMMAND: foreach $Command (@Commands) { if ($Options {checksource} && ($Command eq "TARGET" || $Command eq "SAVESPACE")) { if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} && ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha')) { push @Calls, "$ENV{MAKE} -r -f \"".$PrjBldDir."EXPORT.make\"".$checksourceMakeVariables."CHECKSOURCE"; } else { push @Calls, "make -r -f \"".$PrjBldDir."EXPORT.make\"".$checksourceMakeVariables."CHECKSOURCE"; } } my $Plat; PLATFORM: foreach $Plat (@Plats) { # set up a list of builds to carry out commands for if appropriate my @Blds=($Bld); if (${$Commands{$Command}}{build}) { if ($Bld eq 'ALL') { unless ($Plat=~/TOOLS2?$/o) { # change for platforms TOOLS, TOOLS2 and VC6TOOLS @Blds=('UDEB', 'UREL'); } else { @Blds=('DEB', 'REL'); } } else { # check the build is suitable for the platform - TOOLS, TOOLS2 and VC6TOOLS are annoyingly atypical unless (($Plat!~/TOOLS2?$/o and $Bld=~/^(UDEB|UREL)$/o) or ($Plat=~/TOOLS2?$/o and $Bld=~/^(DEB|REL)$/o)) { next; } } } else { @Blds=('IRRELEVANT'); } # You get CHECKSOURCE_GENERIC "for free" if no component is specified in the call if ($Options {checksource} && ($Command eq "TARGET" || $Command eq "SAVESPACE") && $Program) { foreach my $makefileVariation (@{$MakefileVariations{$Plat}}) { if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} && ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha')) { push @Calls, "$ENV{MAKE} -r -f \"$PrjBldDir$Plat$makefileVariation$Test.make\"".$checksourceMakeVariables."CHECKSOURCE_GENERIC"; } else { push @Calls, "make -r -f \"$PrjBldDir$Plat$makefileVariation$Test.make\"".$checksourceMakeVariables."CHECKSOURCE_GENERIC"; } } } my $LoopBld; foreach $LoopBld (@Blds) { my $CFG=''; if ($LoopBld ne 'IRRELEVANT') { $CFG=" CFG=$LoopBld"; } if ($Options {checksource}) { if ($Command eq "TARGET" || $Command eq "SAVESPACE") { foreach my $makefileVariation (@{$MakefileVariations{$Plat}}) { if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} && ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha')) { push @Calls, "$ENV{MAKE} -r -f \"$PrjBldDir$Plat$makefileVariation$Test.make\"".$checksourceMakeVariables."CHECKSOURCE$Program$CFG"; } else { push @Calls, "make -r -f \"$PrjBldDir$Plat$makefileVariation$Test.make\"".$checksourceMakeVariables."CHECKSOURCE$Program$CFG"; } } } next; } unless ($Options{what} or $Options{check}) { if ($Program) { # skip programs if they're not supported for a platform unless ($Test) { unless (grep /^$Program$/, @{$Platform::Programs{$Plat}}) { next PLATFORM; } } else { unless (grep /^$Program$/, @{$Platform::TestPrograms{$Plat}}) { next PLATFORM; } } } my $AbldFlagsMacroTmp=""; my $CompilerWrapperFlagMacroTemp=""; if ($Command eq "MAKEFILE") { # Only want ABLD_FLAGS for Makefile $AbldFlagsMacroTmp=$AbldFlagsMacro; if(exists ($Options{wrap})) { # Require ABLD_COMPWRAP_FLAG when --wrap option is specified $CompilerWrapperFlagMacroTemp = $CompilerWrapperFlagMacro; } } foreach my $makefileVariation (@{$MakefileVariations{$Plat}}) { if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} && ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha')) { if ( ($Command eq "TARGET") && (-e $PerlLibPath . "tracecompiler.pl") ) { not scalar grep(/tracecompiler\.pl $Plat/,@Calls) and push @Calls, "perl " . $PerlLibPath . "tracecompiler.pl $Plat $Program"; } push @Calls, "$ENV{MAKE} -r $KeepgoingFlag -f \"$PrjBldDir$Plat$makefileVariation$Test.make\"" ." $Command$Program$CFG$Source$VerboseMacro" . "$KeepgoingMacro$RemoveMacro$NoDependencyMacro" . "$AbldFlagsMacroTmp$CompilerWrapperFlagMacroTemp"; #Compiler Wrapper support if ( exists($Options{wrap}) && ($Options{wrap} eq "") && ($Command eq "TARGET") ) { my $CFGCOMPWRAP=''; if ($LoopBld ne 'IRRELEVANT') { $CFGCOMPWRAP =" CFG=COMPWRAP".$LoopBld; } push @Calls, "$ENV{MAKE} -r $KeepgoingFlag -f \"$PrjBldDir$Plat$makefileVariation$Test.make\""." TARGET$Program$CFGCOMPWRAP"; } } else { push @Calls, "make -r $KeepgoingFlag -f \"$PrjBldDir$Plat$makefileVariation$Test.make\"" ." $Command$Program$CFG$Source$VerboseMacro" . "$KeepgoingMacro$RemoveMacro$NoDependencyMacro" . "$AbldFlagsMacroTmp$CompilerWrapperFlagMacroTemp"; #Compiler Wrapper support if ( exists($Options{wrap}) && ($Options{wrap} eq "") && ($Command eq "TARGET") ) { my $CFGCOMPWRAP=''; if ($LoopBld ne 'IRRELEVANT') { $CFGCOMPWRAP =" CFG=COMPWRAP".$LoopBld; } push @Calls, "make -r $KeepgoingFlag -f \"$PrjBldDir$Plat$makefileVariation$Test.make\""." TARGET$Program$CFGCOMPWRAP"; } } } next; } unless (${$Commands{$Command}}{what}) { next COMMAND; } if ($Program) { # skip programs if they're not supported for a platform unless ($Test) { unless (grep /^$Program$/, @{$Platform::Programs{$Plat}}) { next PLATFORM; } } else { unless (grep /^$Program$/, @{$Platform::TestPrograms{$Plat}}) { next PLATFORM; } } } my $Makefile=''; if ($Command=~/MAKEFILE$/o) { $Makefile='MAKEFILE'; } foreach my $makefileVariation (@{$MakefileVariations{$Plat}}) { if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} && ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha')) { push @Calls, "$ENV{MAKE} -r -f \"$PrjBldDir$Plat$makefileVariation$Test.make\" WHAT$Makefile$Program $CFG"; } else { push @Calls, "make -r -f \"$PrjBldDir$Plat$makefileVariation$Test.make\" WHAT$Makefile$Program $CFG"; } } } } } # make the required calls my $Call; my %checkSourceUniqueOutput; unless ($Options{what} or $Options{check}) { foreach $Call (@Calls) { print " $Call\n" unless ($Options{checksource} && !$Options {verbose}); open PIPE, "$Call |"; $|=1; # bufferring is disabled while (<PIPE>) { if ($Options {checksource}) { if ($Options{verbose}) { print $_; } else { $checkSourceUniqueOutput{$_} = 1; } } else { print; } } close PIPE; } print $_ foreach (sort keys %checkSourceUniqueOutput); } else { my %WhatCheck; # check for duplicates foreach $Call (@Calls) { open PIPE, "$Call |"; while (<PIPE>) { next if (/(Nothing to be done for|Entering directory|Leaving directory) \S+\.?$/o); # releasables split on whitespace - quotes possible -stripped out while (/("([^"\t\n\r\f]+)"|([^ "\t\n\r\f]+))/go) { my $Releasable=($2 ? $2 : $3); $Releasable =~ s/\//\\/g; # convert forward slash into backslash unless ($WhatCheck{$Releasable}) { $WhatCheck{$Releasable}=1; if ($Options{what}) { print "$Releasable\n"; } else { if (!-e $Releasable) { print STDERR "MISSING: $Releasable\n"; } # modified start: added functionality checkwhat elsif ($Options{checkwhat}) { print "$Releasable\n"; } # modified end: added functionality checkwhat } } } } close PIPE; } } } sub Usage () { print <<ENDHERESTRING; Common usage : abld [test] command [options] [platform[.Feature Variant]] [build] [program] where command is build, target, etc. (type \"abld help commands\" for a list of commands) where options are -c, -k, etc. (type \"abld help options\" for a list of options) where parameters depend upon the command (type \"abld help <command>\" for command-specific help) where parameters default to 'ALL' if unspecified ENDHERESTRING print "project platforms:\n", " @Platform::Plats\n" ; if (%Platform::FeatureVariantSupportingPlats) { my @featureVariants; foreach my $featureVariantSupportingPlat (keys %Platform::FeatureVariantSupportingPlats) { push @featureVariants, $featureVariantSupportingPlat.".".$_ foreach (featurevariantparser->GetValidVariants()); } if (@featureVariants) { @featureVariants = map{uc($_)} @featureVariants; print "feature variant platforms:\n", " @featureVariants\n"; } } exit 1; } # modified start: added functionality checkwhat sub Options () { print <<ENDHERESTRING; Options (case-insensitive) : -c or -check check the releasables are present -cw or -checkwhat combined check and what -k or -keepgoing build unrelated targets on error -s or -savespace delete intermediate files on success -v or -verbose display tools calls as they happen -w or -what list the releasables -r or -remove allow FREEZE to remove exports -i thumb or -i arm override for build ARMV5 platform options -cs or -checksource checks source conformance to Symbian's filename policy -debug or -no_debug enable/disable generation of symbolic debug information for ARM ABI compliant platforms -fc or -logfc enable function call logging -wrap[=proxy] enable invocation of external wrapper tool possible combinations : (([-check]|[-what]|[-checkwhat])|([-k][-s][-v][-i [thumb|arm]][-cs][-debug|-no_debug][-fc][-wrap[=proxy]])) ENDHERESTRING exit; } # modified end: added functionality checkwhat sub Help ($) { my ($Command)=@_; my %CommandHash=%{$Commands{$Command}}; print 'ABLD'; unless ($CommandHash{notest}) { print ' [test]'; } print " $Command "; if ($Command eq 'HELP') { print '([OPTIONS|COMMANDS]|[<command>])'; } else { if ($CommandHash{what}) { print '(([-c]|[-w])|'; } if ($CommandHash{savespace}) { print '[-s]'; } if ($CommandHash{instructionset}) { print '[-i thumb|arm]'; } if ($CommandHash{remove}) { print '[-r]'; } if ($CommandHash{checksource}) { print '[-cs]'; } unless ($CommandHash{nokeepgoing}) { print '[-k]'; } unless ($CommandHash{noverbose}) { print '[-v]'; } if ($CommandHash{debug}) { print '[-debug|-no_debug]'; } if ($CommandHash{logfc}) { print '[-logfc]|[-fc]'; } if ($CommandHash{what}) { print '))'; } unless ($CommandHash{noplatform}) { print ' [<platform>]'; } if ($CommandHash{build}) { print ' [<build>]'; } if ($CommandHash{program}) { print ' [<program>]'; } if ($CommandHash{source}) { print ' [<source>]'; } if ($CommandHash{wrap}) { print '[-wrap[=proxy]]'; } } print "\n", "\n", "$CommandHash{function}\n" ; exit; } sub Commands () { print "Commands (case-insensitive):\n"; foreach (sort keys %Commands) { next if ${$Commands{$_}}{hidden}; my $Tmp=$_; while (length($Tmp) < 12) { $Tmp.=' '; } print " $Tmp ${$Commands{$_}}{function}\n"; } exit; } sub GetMakefileVariations ($$) { my ($plat, $featureVariantArg) = @_; my @variations = (); if (!$featureVariantArg) { push @variations, ""; } else { my @resolvedVariants = featurevariantparser->ResolveFeatureVariant($featureVariantArg); # modified start: makefile improvement my %temp_hash =("default" => ""); foreach (@resolvedVariants){ $temp_hash{$_}=""; } push @variations, ".".$_ foreach (keys %temp_hash); } # modified end: makefile improvement return \@variations; }