--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/cl_bpabi.pm Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2885 @@
+# 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:
+#
+
+# This package contains routines to handle Base Platform ABI (BPABI) Platforms.
+package Cl_bpabi;
+
+my @commonOptions;
+my @thumbOptions;
+my @armOptions;
+my @kernelOptions;
+my @invariantOptions;
+my @linkerOptions;
+my @archiverOptions;
+my @debugFormat;
+my $ArmIncDir;
+my @ArmLibList;
+
+my %configVariables;
+
+#Check if Function call Logger is enabled
+my $Function_Call_Logger=&main::IsFunctionCallLogging();
+
+# Get the information regarding supporting Compiler Wrapper Option
+my $IsCompilerWrapperOption=&main::CompilerWrapperOption();
+my $IsProxyWrapperOption=&main::ProxyWrapperOption();
+
+# takes an 'expression' to evaluate with $_ bound to each of the
+# remaining args
+sub PrintList
+{
+ my $expr = shift @_;
+ foreach (@_) {
+ my $str = eval($expr);
+ &main::Output($str);
+ }
+}
+
+sub DepLinkList
+{
+ my $expr = shift @_;
+ my @arr;
+ foreach (@_) {
+ my $str = eval($expr);
+ push @arr, $str;
+ }
+ return @arr;
+}
+
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+ PMHelp_Mmp
+ PMPlatProcessMmp
+ PMStartBldList
+ PMBld
+ PMStartSrcList
+ PMBitMapBld
+ PMResrcBld
+ PMStartSrc
+ PMAifBld
+ PMSrcDepend
+ PMSrcBldDepend
+ PMEndSrcBld
+ PMEndSrc
+ PMEndSrcList
+ PMPrefixFile
+ PMToolChainIncDir
+ PMSupportsFeatureVariants
+);
+
+use Cwd;
+
+# Armutl package does various ancillary things for armedg modules
+use Armutl;
+use BPABIutl;
+use E32Plat;
+use RVCT_plat2set;
+use gcce_plat2set;
+
+# This is the RVCT Version information required by Armutl package
+my $RVCTMajorVersion;
+my $RVCTMinorVersion;
+my $RVCTVersion;
+
+my $GCCEMajorVersion;
+my $GCCEMinorVersion;
+my $GCCEVersion;
+
+# The name of the build platform, e.g. ARMV6.
+my $PlatName = main::Plat();
+
+# The name of the root platform. This is useful if the plaform is derived using a
+# BSF file. If the current platform is not derived, $RootName will be the same as
+# $PlatName.
+my $RootName = E32Plat::Plat_Root($PlatName);
+
+
+# cl_generic package contains generic routines to handle bits of makefiles which are
+# common to all of the platforms. Currently it deals with AIF, MBM amd RSC files.
+use cl_generic;
+
+# E32env package contains information for makmake and associated e32tools perl programs
+# within the Epoc32 Environment
+use E32env;
+
+# Genutl package contains utility subroutines for MAKMAKE and associated scripts
+use Genutl;
+
+# Modload package is the runtime module-loading routine for loading e32tools modules into
+# 'main' module
+use Modload;
+
+use constant NOCOMPRESSIONMETHOD => 0;
+use constant INFLATECOMPRESSIONMETHOD => 1;
+use constant BYTEPAIRCOMPRESSIONMETHOD => 2;
+
+use constant NOTPAGED => 0;
+use constant UNPAGED => 1;
+use constant PAGED => 2;
+
+use constant NON_DEBUGGABLE => 0;
+use constant DEBUGGABLE => 1;
+use constant DEBUGGABLE_UDEBONLY => 2;
+
+my %plat = &main::PlatRec();
+my $CustomizedARMV5Plat = 0;
+
+if (($plat{'CUSTOMIZES'}) && (($plat{'ROOTPLATNAME'} eq "ARMV5") || ($plat{'ROOTPLATNAME'} eq "ARMV5_ABIV2"))) {
+# The following flag is set to handle the exceptions related to ARMV5 toolchain.
+ $CustomizedARMV5Plat = 1;
+}
+
+#this fucntion will be used for cw_ide platform to update the PlatName and reinitialize the hashtable
+sub getVariableForNewPlat
+{
+ $PlatName = main::Plat();
+ undef(%configVariables);
+}
+sub PMHelp_Mmp {
+
+# Help Text for ARM Platform, lists out the MMP keywords used incase of ARM Compiler
+ if($PlatName eq "ARMV5" || $PlatName eq "ARMV5_ABIV2" || $CustomizedARMV5Plat)
+ {
+ return &Armutl_Help_Mmp;
+ }
+ else
+ {
+ return "";
+ }
+}
+
+my $ToolChainIncDir;
+my @ToolChainLibList;
+my $ArmRT = 0;
+my %AsmFiles = ();
+my %AsmDirs = ();
+my $NamedSymLkup = 0;
+my $InterWorking = '';
+
+sub PMPlatProcessMmp (@) {
+ &InitToolChain(@_);
+ $ToolChainIncDir = &GetToolChainIncDir;
+ &main::SetStdIncPaths($ToolChainIncDir);
+ @ToolChainLibList = &GetLibList;
+# Variable to check if the target forms part of the run time libraries, if it is so
+# shouldn't be linked against itself or other runtime libs
+ $ArmRT = &IsTargetRT;
+ my @AsmFileList = &GetToolChainAsmFileList;
+ foreach (@AsmFileList) { $AsmFiles{ucfirst lc $_} = 1; }
+}
+
+my $preinclude;
+
+my $Makecmd;
+
+sub PMStartBldList($) {
+ ($Makecmd) = @_;
+ my $ABI=&main::ABI;
+ my $BaseTrg=&main::BaseTrg;
+ my $BasicTrgType=&main::BasicTrgType;
+ my @BldList=&main::BldList;
+ my @ChopSysIncPaths=&main::Path_Chop(&main::SysIncPaths);
+ my @ChopUserIncPaths=&main::Path_Chop(&main::UserIncPaths);
+ my $DefFile=&main::DefFile;
+ my $EPOCPath=&main::EPOCPath;
+ my $LinkAs=&main::LinkAs;
+ my $LibPath=&main::LibPath.'LIB\\';
+ my @MacroList=&main::MacroList();
+ push @MacroList, "__SUPPORT_CPP_EXCEPTIONS__";
+ push @MacroList, "__SYMBIAN_STDCPP_SUPPORT__" if ( StdCppTarget() );
+
+ my $Plat=&main::Plat;
+ my $Trg=&main::Trg;
+ my $TrgType=&main::TrgType;
+
+ # This horrible change (presumably to allow GCCE to work with edll.lib etc.
+ # produced by RVCT breaks SMP (and also breaks any optimized platform
+ # builds such as ARMV6, and also Thumb2 builds).
+ # Work round for now by conditioning the horrible change on the absence of
+ # SMP in the platform definition.
+ my %PlatHash = &main::PlatRec();
+ unless ($PlatHash{SMP}) {
+ my $myStatLinkPath;
+ $myStatLinkPath = "$E32env::Data{LinkPath}";
+ $myStatLinkPath .= "ARMV5";
+ &main::SetStatLinkPath($myStatLinkPath);
+ }
+
+ my $VariantFile=&ChangeSlash(&main::VariantFile);
+
+ my @UidList=&main::UidList;
+ my $SystemTrg = &main::SystemTrg;
+ my $ExportLibrary=&main::ExportLibrary;
+ my $NoExportLibrary=&main::NoExportLibrary;
+ # N.B. should get better way to detect kernel probably!!
+ $SystemTrg = 1 if ($ExportLibrary =~ /EKERN/i);
+
+ # N.B. should get better way to detect this
+ $SystemTrg = 1 if ($Trg =~ /KSRT/i);
+
+ my %Version = &main::Version();
+ my $ExtraExportLibrary;
+ my $PrimaryExportLibrary = $ExportLibrary;
+ unless ($Version{explicit}) {
+ $ExtraExportLibrary = $ExportLibrary;
+ $ExtraExportLibrary =~ s/\{(\d|a|b|c|d|e|f){8}\}//i;
+ $PrimaryExportLibrary = $ExtraExportLibrary;
+ }
+
+# set up LinkAs
+ $UidList[2]=~/^0x(.*)$/o;
+ if ($1 ne '00000000') { # have to make sure than series of noughts in brackets doesn't appear in name for null uids
+ $LinkAs=join '', &main::Path_Split('Base',$LinkAs),"[$1]",&main::Path_Split('Ext',$LinkAs);
+ }
+
+ # Required for .lib generation
+ $InterWorking = ($ABI eq 'ARMV4') ? "" : "--inter";
+
+ # need to add config file for makmake invocation
+ my $config_file = BPABIutl_Config_Path($PlatName);
+
+ &main::Output("\n", "include $config_file\n", "\n");
+ &Generic_Header(0,$Makecmd, 1); # define standard things using absolute paths and request that a make function
+ # is provided to provide optional conversion of absolute paths to Unix slashes
+
+# modified start: makefile improvement
+ &main::Output(
+ "CHECKVMAP : CHECKVMAPUDEB CHECKVMAPUREL",
+ "\n"
+ );
+# modified end: makefile improvement
+ if ($Makecmd eq "nmake") {
+ &main::Output(
+ "\n",
+ "PATH=",&main::Path_Drive,$EPOCPath,"gcc\$(PBUILDPID)\\bin;\$(PATH)\n",
+ "\n"
+ );
+ }
+ else {
+ &main::Output(
+ "\n",
+ "# must set both PATH and Path to make it work correctly\n",
+ "Path:=",&main::Path_Drive,$EPOCPath,"gcc\$(PBUILDPID)\\bin;\$(Path)\n",
+ "PATH:=\$(Path)\n",
+ "\n"
+ );
+ }
+
+ if ($BasicTrgType=~/^(DLL|EXE)/o)
+ {
+
+ my $OtherLinkerOpts;
+ my $toolchain = getConfigVariable('COMPILER_PLAT');
+
+ # In case of GCCE releases, '--map' option was supported only from build 3.4.3 Q1C release
+ # Hence this is a special case, where GCCE platform is checked to ensure that the --map option
+ # is accepted in the correct relase. Even if the option is provided in the config file, it will be
+ # ignored for versions before 3.4.3 Q1C 2005 release.
+
+ # Check to be included in the Makefile, so that the map filename is provided as input only
+ # when the MAP option is supplied
+
+ &main::Output("ifdef LINKER_SYMBOLS_MAP_OPTION\n");
+ foreach (@BldList)
+ {
+ &main::Output("\t$_"."_MAP_FILE=\"\$(EPOCTRG$_)\\".&main::Trg($_).".map\"\n");
+ }
+ &main::Output("else\n");
+ foreach (@BldList)
+ {
+ &main::Output("\t$_"."_MAP_FILE=\n");
+ }
+ &main::Output("endif\n");
+
+ # In some compiler toolchains, the start address may be required to be provided using the appropriate option.
+ # Incase if the option is provided by the toolchain, then pass we need to pass in the start address.
+ &main::Output(
+ "\nifdef CODE_SEGMENT_START\n",
+ "\tCODE_SEGMENT_START += 0x8000 \n",
+ "endif\n",
+ );
+
+
+ # In some compiler toolchain, the symboled archives may have to be listed
+ &main::Output(
+ "ifdef START_GROUP_SYMBOL\n",
+ "\tEEXE_OBJECT=\$(START_GROUP_SYMBOL)UC_EXE_.o\$(END_GROUP_SYMBOL)\n",
+ "\tEDLL_OBJECT=\$(START_GROUP_SYMBOL)UC_DLL_.o\$(END_GROUP_SYMBOL)\n",
+ "\tDENTRY_OBJECT=\$(START_GROUP_SYMBOL)D_ENTRY_.o\$(END_GROUP_SYMBOL)\n",
+ "\tLENTRY_OBJECT=\$(START_GROUP_SYMBOL)L_ENTRY_.o\$(END_GROUP_SYMBOL)\n",
+ "\tXENTRY_OBJECT=\$(START_GROUP_SYMBOL)X_ENTRY_.o\$(END_GROUP_SYMBOL)\n",
+ "\tVENTRY_OBJECT=\$(START_GROUP_SYMBOL)V_ENTRY_.o\$(END_GROUP_SYMBOL)\n",
+ "\tKENTRY_OBJECT=\$(START_GROUP_SYMBOL)K_ENTRY_.o\$(END_GROUP_SYMBOL)\n",
+ "endif\n\n"
+ );
+
+ # put the extra linker options from MMP file into the linker flags
+ $OtherLinkerOpts=&main::LinkerOption($toolchain);
+
+ if($OtherLinkerOpts) {
+ &main::Output(
+ "\n# ADDITIONAL LINKER OPTIONS\n",
+ "ifdef SYMBIAN_UREL_LINK_FLAGS\n",
+ "\tSYMBIAN_UREL_LINK_FLAGS += $OtherLinkerOpts \n",
+ "else\n",
+ "\tSYMBIAN_UREL_LINK_FLAGS = $OtherLinkerOpts \n",
+ "endif\n",
+ "ifdef SYMBIAN_UDEB_LINK_FLAGS\n",
+ "\tSYMBIAN_UDEB_LINK_FLAGS += $OtherLinkerOpts \n",
+ "else\n",
+ "\tSYMBIAN_UDEB_LINK_FLAGS = $OtherLinkerOpts \n",
+ "endif\n\n"
+ );
+ }
+ }
+
+ &main::Output(
+ "INCDIR ="
+ );
+
+ PrintList("\" \\\$(INCLUDE_OPTION) \$_\"", @ChopUserIncPaths);
+ PrintList("\" \\\$(INCLUDE_OPTION) \$_\"", @ChopSysIncPaths);
+
+ $ToolchainIncDir = &GetToolChainIncDir;
+
+ if($ToolchainIncDir ne '')
+ {
+ &main::Output(
+ " \$(INCLUDE_OPTION) ","\"$ToolchainIncDir\"");
+ }
+
+ &main::Output(
+ "\n",
+ "\n"
+ );
+
+ #Function call logger takes -I as include option
+ my $FCLogger_inc_option = getConfigVariable('FC_LOGGER_INCLUDE_OPTION');
+ if ($Function_Call_Logger) {
+ &main::Output(
+ "INCDIR_FCLOGGER ="
+ );
+ PrintList("\" $FCLogger_inc_option \$_\"", @ChopUserIncPaths);
+ PrintList("\" $FCLogger_inc_option \$_\"", @ChopSysIncPaths);
+ $ToolchainIncDir = &GetToolChainIncDir;
+ if($ToolchainIncDir ne '') {
+ &main::Output(
+ " $FCLogger_inc_option \"$ToolchainIncDir\""
+ );
+ }
+ &main::Output(
+ "\n",
+ "\n"
+ );
+ }
+
+ # Set control warnings and errors options for building Standard C++ application
+ if( StdCppTarget() ) {
+ &main::Output("CC_WARNINGS_CONTROL_OPTION=\$(CC_STDCPP_WARNINGS_CONTROL_OPTION)","\n");
+ &main::Output("CC_ERRORS_CONTROL_OPTION=\$(CC_STDCPP_ERRORS_CONTROL_OPTION)","\n");
+ &main::Output("\n", "\n");
+ }
+
+ Read_BSF_Options() if ($plat{'CUSTOMIZES'});
+
+ my $kernelOption=0;
+ my $buildAsArmOption=0;
+ my $thumbOption=0;
+
+ if (SysTrg())
+ {
+ $kernelOption=1;
+ }
+ elsif (main::BuildAsARM() or ($ABI eq 'ARMV4'))
+ {
+ $buildAsArmOption=1;
+ }
+ else
+ {
+ $thumbOption=1;
+ }
+
+ my $OtherOpts = undef;
+
+ my $toolchain = getConfigVariable('COMPILER_PLAT');
+
+ $OtherOpts = &main::CompilerOption($toolchain);
+
+
+ if($kernelOption==1)
+ {
+ if(@kernelOptions) {
+# Kernel options as read from BSF file (KERNEL_OPTIONS keyword)
+ Set_BSF_Options('KERNEL_OPTIONS',\@kernelOptions);
+ }
+ $OtherOpts .= " \$(KERNEL_OPTIONS) ";
+ }
+ elsif($buildAsArmOption==1)
+ {
+ if(@armOptions) {
+# Arm options as read from BSF file (ARM_OPTIONS keyword)
+ Set_BSF_Options('ARM_OPTIONS',\@armOptions);
+ }
+ $OtherOpts .= " \$(ARM_OPTIONS) ";
+ }
+ elsif($thumbOption==1)
+ {
+ if(@thumbOptions) {
+# Thumb options as read from BSF file (THUMB_OPTIONS keyword)
+ Set_BSF_Options('THUMB_OPTIONS',\@thumbOptions);
+ }
+ $OtherOpts .= " \$(THUMB_OPTIONS) ";
+ }
+
+ if($thumbOption==1 || $buildAsArmOption==1 || $kernelOption ==1 )
+ {
+ if (&main::ARMFPU && (&main::ARMFPU =~ /^VFPV2$/i))
+ {
+ $OtherOpts .= " \$(VFP2MODE_OPTION) ";
+ }
+ else
+ {
+ $OtherOpts .= " \$(SOFTVFPMODE_OPTION) ";
+ }
+ }
+
+ if ($thumbOption==1)
+ {
+ $OtherOpts .= " \$(COMPILER_THUMB_DEFINES) ";
+ }
+
+ $OtherOpts .= " \$(COMPILER_INTERWORK_DEFINES) ";
+
+ # Options to export symbols by default, for OE
+ if($TrgType=~/^STDDLL$/o || $TrgType=~/^STDEXE$/o || $TrgType=~/^STDLIB$/o) {
+ $OtherOpts .= " \$(OE_OPTIONS) ";
+ }
+
+ if($OtherOpts)
+ {
+ &main::Output(
+ "OTHEROPTIONS=$OtherOpts",
+ "\n",
+ "CCFLAGS += \$(OTHEROPTIONS)",
+ "\n"
+ );
+ }
+
+ if(@invariantOptions) {
+# Invariant options as read from BSF file (INVARIANT_OPTIONS keyword)
+ Set_BSF_Options('INVARIANT_OPTIONS',\@invariantOptions);
+ }
+
+ if(@commonOptions) {
+# Common options as read from BSF file (COMMON_OPTIONS keyword)
+ Set_BSF_Options('COMMON_OPTIONS',\@commonOptions);
+ }
+
+ if(@linkerOptions) {
+# Linker options as read from BSF file (LD_OPTIONS keyword)
+ Set_BSF_Options('LD_OPTIONS',\@linkerOptions);
+ }
+
+ if ($BasicTrgType=~/^LIB$/o) {
+ if(@archiverOptions) {
+# Archiver options as read from BSF file (AR_OPTIONS keyword)
+ Set_BSF_Options('AR_OPTIONS',\@archiverOptions);
+ }
+ }
+
+ if(@debugFormat) {
+ Set_BSF_Options('DEBUG_FORMAT',\@debugFormat);
+ }
+
+ &main::Output(
+ "CCDEFS = \$(COMPILER_DEFINES) "
+ );
+
+ PrintList("\" -D\$_\"", @MacroList);
+
+ &main::Output(
+ " \$(PLATFORM_DEFINES) "
+ );
+
+ &main::Output(
+
+ );
+
+ if($kernelOption==1)
+ {
+ &main::Output(
+ "-D__KERNEL_MODE__ "
+ );
+ }
+
+ if($VariantFile){
+ #Function Call Logger
+ if ($Function_Call_Logger) {
+ #FC Logger accepts product include file without path
+ my $file=&main::Path_Split('File', &main::VariantFile);
+ &main::Output(
+ " -D\"__PRODUCT_INCLUDE__=\\\"${file}\\\"\""
+ );
+ }
+ else {
+ &main::Output(
+ " -D__PRODUCT_INCLUDE__=\\\"${VariantFile}\\\""
+ );
+ }
+ }
+
+ &main::Output(
+ " \$(USERDEFS)\n",
+ "\n"
+ );
+
+ if ( $RootName =~ /^ARMV5$/ ) {
+ # Now we know that the platform is either ARMV5 or a platform derived from
+ # ARMV5 (BSF).
+
+ # See if an environment variable overrides the default DWARF version for
+ # this platform.
+
+ my $env_dwarf_key = "ABLD_${PlatName}_DWARF";
+ my $env_dwarf_val = $ENV{$env_dwarf_key};
+
+ if ($env_dwarf_val) {
+ main::FatalError("The value of $env_dwarf_key is invalid.") unless ($env_dwarf_val =~ /^[23]$/);
+ main::FatalError("We don't support DWARF-2 on ARMV7.") if ($PlatName =~ /^ARMV7/ && $env_dwarf_val == 2);
+
+ &main::Output( "DEBUG_FORMAT=\$(DEBUG_FORMAT_DWARF$env_dwarf_val)\n\n");
+ }
+ }
+
+
+ foreach (@BldList) {
+ &main::Output(
+ "CC$_ = ", $IsProxyWrapperOption ? "$ENV{ABLD_COMPWRAP} ":"", "\$(CC) "
+ );
+
+ # SYMBIAN_UDEB/UREL_CCFLAGS don't have the optimisation levels.
+ if(&main::DebugSwitchUsed() ){
+ if(&main::SymbolicDebugEnabled() ) {
+ &main::Output(
+ " \$(SYMBIAN_UDEB_CCFLAGS) "
+ );
+ }
+ else {
+ &main::Output(
+ " \$(SYMBIAN_UREL_CCFLAGS) "
+ );
+ }
+ }
+ elsif (/DEB$/o) {
+ &main::Output(
+ " \$(SYMBIAN_UDEB_CCFLAGS) "
+ );
+ }
+ else {
+ &main::Output(
+ " \$(SYMBIAN_UREL_CCFLAGS) "
+ );
+
+ }
+ #Set the optimisation levels depending on whether it is a UREL or a UDEB build
+ if (/DEB$/o) {
+ &main::Output(
+ " \$(DEBUG_OPTIMISATION) "
+ );
+ }
+ else {
+ &main::Output(
+ " \$(REL_OPTIMISATION) "
+ );
+ }
+
+ &main::Output(
+ "\$(RUNTIME_SYMBOL_VISIBILITY_OPTION) "
+ );
+
+ if($kernelOption == 0)
+ {
+ &main::Output(
+ "\$(EXCEPTIONS) "
+ );
+ }
+ &main::Output(
+ '$(CCFLAGS) '
+ );
+
+ my @ml = &main::MacroList($_);
+ PrintList("\" -D\$_\"", @ml);
+
+ &main::Output(
+ " \$(CCDEFS)\n"
+ );
+ my @mmpReplaceOptions = &main::ReplaceOptions($toolchain);
+
+ if (@mmpReplaceOptions)
+ {
+ my $OptionPrefix = getConfigVariable('OPTION_PREFIX');
+ my $Pattern;
+
+ # Set the value of '$Pattern' which is required to segregate one option from another based on the option prefix.
+ if($OptionPrefix)
+ {
+ $Pattern = $OptionPrefix.'\S+\s*(?!'.$OptionPrefix.')\S*';
+ }
+ else
+ {
+ # If option prefix is not set in the configuration make file, then set default
+ # option prefix as '-' or '--'.
+ $Pattern = '-{1,2}\S+\s*(?!-)\S*';
+ }
+
+ foreach my $options (@mmpReplaceOptions)
+ {
+ my @opts = $options =~ /$Pattern/g;
+ my $count = 0;
+
+ while ($count <= $#opts)
+ {
+ my $opt;
+ my $rep;
+ if ($opts[$count] =~ /^(\S+)\s+(\S+)$/)
+ {
+ $opt = $1;
+ $rep = $2;
+ &main::Output(
+ "CC$_ := \$(subst $opt ,@@,\$(CC$_))\n",
+ "CC$_ := \$(CC$_:@@%=$opt $rep)",
+ "\n"
+ );
+ $count++;
+ }
+ else
+ {
+ $opt = $opts[$count];
+ $rep = $opts[$count+1];
+
+ # Substitute '=' with '%' which is a wild card character in makefile.
+ $opt =~ s/=/%/;
+
+ &main::Output(
+ "CC$_ := \$(CC$_:$opt=$rep)",
+ "\n"
+ );
+ $count+=2;
+ }
+ }
+ }
+ }
+ &main::Output(
+ "\n"
+ );
+ }
+
+ &main::Output(
+ "\n"
+ );
+
+ #Function call logger
+ if ($Function_Call_Logger) {
+ #Send all the debug macros to logger
+ foreach (@BldList) {
+ &main::Output
+ (
+ "FCLOGGER$_ = ",
+ $EPOCPath,
+ "tools\\fc_logger\\edgcpfe"
+ );
+
+ my @ml = &main::MacroList($_);
+ PrintList("\" -D\$_\"", @ml);
+ if ($thumbOption==1) {
+ &main::Output(
+ " \$(COMPILER_THUMB_DEFINES)"
+ );
+ }
+ &main::Output(" \$(COMPILER_INTERWORK_DEFINES)",
+ " \$(CCDEFS)",
+ " \$(FC_LOGGER_DEFINES)",
+ " \$(FC_LOGGER_OPTION)");
+ &main::Output(
+ "\n",
+ "\n"
+ );
+ }
+ }
+
+ foreach (@BldList) {
+ &main::Output(
+ "$_ :"
+ );
+
+ if ($BasicTrgType !~ /IMPLIB/io) {
+ &main::Output (
+ " \\\n\t",
+ &Generic_Quote("\$(EPOCTRG$_)\\".&main::Trg($_))
+ );
+ }
+
+# lib has to come after the main target so that a .DEF file will be generated if the project is not frozen
+ if ($DefFile and not &main::ExportUnfrozen) {
+ &main::Output(
+ " \\\n",
+ "\tLIBRARY\n"
+ );
+ }
+ &main::Output(
+ "\n",
+ "\n"
+ );
+ }
+
+ # Resource building is done entirely via cl_generic.pm
+ PrintList("\"\nRESOURCE\$_ : MAKEWORK\$_\"", @BldList);
+ &main::Output(
+ "\n",
+ "\n",
+ );
+
+ &main::Output(
+ "LIBRARY : MAKEWORKLIBRARY"
+ );
+ if ($BasicTrgType=~/^LIB$/o) {
+# code to ensure that the static libraries for all builds are built at the library stage
+ PrintList("\" \$_\"", @BldList);
+ }
+ elsif ($DefFile and !$NoExportLibrary) {
+ unless (&main::ExportUnfrozen) {
+ if (-e $DefFile) { # effectively "if project frozen ..."
+ if ($PlatName =~ /^ARMV5$/) {
+ &main::Output(
+ " ", &Generic_Quote("\$(EPOCLIB)\\LIB\\$PrimaryExportLibrary.dso"),
+ " ", &Generic_Quote("\$(EPOCLIB)\\LIB\\$PrimaryExportLibrary.lib"), "\n"
+ );
+ }
+ else {
+ &main::Output(
+ " ", &Generic_Quote("\$(EPOCLIB)\\LIB\\$PrimaryExportLibrary.dso"), "\n"
+ );
+ }
+ }
+ else {
+ &main::Output(
+ "\n",
+ "\t\@echo WARNING: Not attempting to create any import libraries.\n",
+ "\t\@echo When exports are frozen in \"$DefFile\", regenerate Makefile.\n"
+ );
+ }
+ } else {
+ &main::Output(
+ "\n",
+ "\t\@echo Not attempting to create \"\$(EPOCLIB)\\LIB\\$PrimaryExportLibrary.dso\"\n",
+ "\t\@echo from frozen .DEF file, since EXPORTUNFROZEN specified.\n"
+ );
+ }
+
+ my $theDefFile = $DefFile;
+ $theDefFile = "\$(EPOCBLD)\\$BaseTrg.def" unless (-e $DefFile);
+ &main::Output(
+ "\n",
+ "\n",
+ "# REAL TARGET - LIBRARY (.dso) \n",
+ "\n",
+ &Generic_Quote("\$(EPOCLIB)\\LIB\\$ExportLibrary.dso"), " : ",
+ &Generic_Quote($DefFile), "\n",
+ "\tperl -S prepdef.pl ", &Generic_Quote($DefFile), " \"\$(EPOCBLD)\\$ExportLibrary.prep.def\"\n",
+ "\telf2e32 --definput=\"\$(EPOCBLD)\\$ExportLibrary.prep.def\" --dso=",
+ &Generic_Quote("\$(EPOCLIB)\\LIB\\$ExportLibrary.dso"),
+ " --linkas=$LinkAs\n",
+ "\n"
+ );
+ if ($ExtraExportLibrary) {
+ &main::Output(
+ "\n",
+ &Generic_Quote("\$(EPOCLIB)\\LIB\\$ExtraExportLibrary.dso"), " : ",
+ &Generic_Quote("\$(EPOCLIB)\\LIB\\$ExportLibrary.dso"), "\n",
+ "\tcopy \"\$<\" \"\$@\"\n"
+ );
+ }
+
+ # Generate .lib files which will be used for ARMV5_ABIV1 platform (ABIV1 mode toolchain)
+ # Only for ARMV5 platform
+ if ($PlatName =~ /^ARMV5$/)
+ {
+ &main::Output(
+ "\n",
+ "\n",
+ "# REAL TARGET - LIBRARY (.lib) \n",
+ "\n",
+ &Generic_Quote("\$(EPOCLIB)\\LIB\\$ExportLibrary.lib"), " : ",
+ &Generic_Quote($DefFile), "\n",
+ "\tperl -S prepdef.pl ", &Generic_Quote($DefFile), " \"\$(EPOCBLD)\\$ExportLibrary.prep.def\"\n",
+ "\tdef2dll.bat --path=\$(EPOCLIB)\\LIB \\\n\t\t--bldpath=\$(EPOCBLD) \\\n\t\t--import=$ExportLibrary \\\n",
+ "\t\t--deffile=\"\$(EPOCBLD)\\$ExportLibrary.prep.def\" \\\n\t\t--linkAs=$LinkAs \\\n\t\t$InterWorking\n",
+ "\n",
+ );
+ if ($ExtraExportLibrary) {
+ &main::Output(
+ "\n",
+ &Generic_Quote("\$(EPOCLIB)\\LIB\\$ExtraExportLibrary.lib"), " : ",
+ &Generic_Quote("\$(EPOCLIB)\\LIB\\$ExportLibrary.lib"), "\n",
+ "\tcopy \"\$<\" \"\$@\"\n"
+ );
+ }
+ }
+ }
+
+ my $freezeDir = &main::Path_Split('Path', $DefFile);
+ chop($freezeDir);
+
+ # dummy rule for def files to cope with filename case differences
+ unless (&main::ExportUnfrozen) {
+ if (-e $DefFile) { # effectively "if project frozen ..."
+ &main::Output(
+ "\n",
+ "\n",
+ &Generic_Quote($DefFile), " : ", "\n",
+ "\t\@rem Do nothing\n",
+ );
+ }
+ }
+
+ &main::Output(
+ "\n",
+ "\n",
+ &Generic_Quote($freezeDir), " : ", "\n",
+ "\tperl -S emkdir.pl \$\@\n",
+ );
+
+ &main::Output(
+ "\n",
+ "\n",
+ "FREEZE : ",
+ &Generic_Quote($freezeDir), "\n",
+ );
+ if ($DefFile and $BasicTrgType!~/^IMPLIB$/io) {
+# call perl on the script here so make will die if there are errors
+# - this doesn't happen if calling perl in a batch file
+ &main::Output( "\tperl -S efreeze.pl \$(EFREEZE_ALLOW_REMOVE) \"$DefFile\" \"\$(EPOCBLD)\\$ExportLibrary.def\" \n" );
+ }
+ else {
+ &main::Output( "\tperl -e \"print \\\"warning: freeze could not be supported or \\
+ you need to declare an explicitly specified def file using the keyword \\
+ DEFFILE in the MMP file!\\n\\\"\"");
+ }
+ &main::Output(
+ "\n",
+ "CLEANLIBRARY :\n"
+ );
+ if ($DefFile and !$NoExportLibrary) {
+ &main::Output(
+ "\t-\$(ERASE) \"\$(EPOCLIB)\\LIB\\$ExportLibrary.dso\"\n"
+ );
+ if ($ExtraExportLibrary) {
+ &main::Output(
+ "\t-\$(ERASE) \"\$(EPOCLIB)\\LIB\\$ExtraExportLibrary.dso\"\n"
+ );
+ }
+ }
+ &main::Output(
+ "\n",
+ "\n"
+ );
+ &Generic_MakeWorkDir('MAKEWORKLIBRARY',"${LibPath}");
+
+ &Generic_Releaseables;
+}
+
+
+sub PMBld {
+
+ my $ABI=&main::ABI;
+ my @ASSPLibList=&main::ASSPLibList;
+ my @SrcList=&main::SrcList;
+ my $FeatureVariantBaseTrg=&main::FeatureVariantBaseTrg;
+ my $Bld=&main::Bld;
+ my $ChopBldPath=&main::Path_Chop(&main::BldPath);
+ my $DefFile=&main::DefFile;
+ my $EPOCIncPath=&main::EPOCIncPath;
+ my $FirstLib=&main::FirstLib;
+ my $BasicTrgType=&main::BasicTrgType;
+ my @LibList;
+ my @RTLibList = &GetRTLibList();
+ my $SystemTrg = &main::SystemTrg;
+ my $LibPath= &main::LibPath;
+ my $LinkAs=&main::LinkAs;
+ my $ExportLibrary=&main::ExportLibrary;
+ my $NoExportLibrary=&main::NoExportLibrary;
+ # N.B. should get better way to detect kernel probably!!
+ $SystemTrg = 1 if ($ExportLibrary =~ /EKERN/i);
+ my $ChopRelPath=&main::Path_Chop(&main::RelPath);
+ my $RelPath=&main::RelPath;
+ my @StatLibList=&main::StatLibList;
+ my $StatLinkPath=&main::StatLinkPath;
+ my $Trg=&main::Trg;
+ my $TrgType=&main::TrgType;
+ my @UidList=&main::UidList;
+ my %Version = &main::Version();
+ my $ExtraExportLibrary;
+ unless ($Version{explicit}) {
+ $ExtraExportLibrary = $ExportLibrary;
+ $ExtraExportLibrary =~ s/\{(\d|a|b|c|d|e|f){8}\}//i;
+ }
+ my $objectFiles;
+
+ if ($Bld =~ /DEB/) {
+ @LibList = &main::DebugLibList;
+ } else {
+ @LibList = &main::LibList;
+ }
+
+# set up $LinkAs
+ $UidList[2]=~/^0x(.*)$/o;
+ if ($1 ne '00000000') { # have to make sure than series of noughts in brackets doesn't appear in name for null uids
+ $LinkAs=join '', &main::Path_Split('Base',$LinkAs),"[$1]",&main::Path_Split('Ext',$LinkAs);
+ }
+
+
+ # REAL TARGETS
+ #-------------
+ &main::Output(
+ "# REAL TARGET - BUILD VARIANT $Bld\n",
+ "\n"
+ );
+
+# releasables
+ my @releaseables;
+
+ push @releaseables, "$RelPath$Trg" if ($BasicTrgType!~/^IMPLIB$/io);
+ if ($BasicTrgType=~/^(DLL|EXE)$/o) {
+ push @releaseables, "$RelPath$Trg.map";
+ }
+ if (-e $DefFile and !$NoExportLibrary) { # effectively "if project frozen ..."
+ push @releaseables, "$LibPath$ExportLibrary.dso";
+ push @releaseables, "$LibPath$ExtraExportLibrary.dso" if ($ExtraExportLibrary);
+ if ($PlatName =~ /^ARMV5$/) {
+ push @releaseables, "$LibPath$ExportLibrary.lib";
+ push @releaseables, "$LibPath$ExtraExportLibrary.lib" if ($ExtraExportLibrary);
+ }
+ }
+
+ push @releaseables, &main::FeatureVariantVMapFile() if &main::FeatureVariantVMapFile();
+
+ &main::Output(
+ "WHAT$Bld : WHATGENERIC\n",
+ "\n",
+ "CLEAN$Bld : CLEANBUILD$Bld CLEANRELEASE$Bld\n",
+ "\n",
+ "CLEANBUILD$Bld : \n",
+ "\t\@perl -S ermdir.pl \"\$(EPOCBLD$Bld)\"\n",
+ "\n",
+ "CLEANRELEASE$Bld : CLEANGENERIC\n",
+ "\n"
+ );
+
+ &Generic_WhatTargets($Bld, "WHAT$Bld", @releaseables);
+ my @cleantargets = (@releaseables, "$RelPath$ExtraExportLibrary.sym");
+
+ if (-e $DefFile and !$NoExportLibrary) { # effectively "if project frozen ..."
+ &Generic_CleanTargets($Bld, "CLEANRELEASE$Bld", @cleantargets);
+ }
+ else {
+ push @cleantargets, "$LibPath$ExportLibrary.dso";
+ push @cleantargets, "$LibPath$ExtraExportLibrary.dso" if ($ExtraExportLibrary);
+ if ($PlatName =~ /^ARMV5$/) {
+ push @cleantargets, "$LibPath$ExportLibrary.lib";
+ push @cleantargets, "$LibPath$ExtraExportLibrary.lib" if ($ExtraExportLibrary);
+ }
+ &Generic_CleanTargets($Bld, "CLEANRELEASE$Bld", @cleantargets);
+ }
+
+ &Generic_MakeWorkDir("MAKEWORK$Bld",$ChopBldPath);
+ &Generic_MakeWorkDir("MAKEWORK$Bld",$ChopRelPath);
+
+ return if ($BasicTrgType=~/^IMPLIB$/io);
+
+ &main::Output(
+ "LISTING$Bld : MAKEWORK$Bld"
+ );
+ foreach (@SrcList) {
+ my $BaseSrc = &main::Path_Split('Base', $_);
+ my $Ext = &main::Path_Split('Ext', $_);
+ if ($Ext =~ /cia/i && ($PlatName ne "GCCE")) {
+ $BaseSrc = "$BaseSrc\_";
+ }
+ &main::Output(
+ " \\\n\tLISTING$Bld$BaseSrc"
+ );
+ }
+ &main::Output(
+ "\n",
+ "\n"
+ );
+ #Compiler wrapper support starts
+ if($IsCompilerWrapperOption)
+ {
+ my $Platcmpwrap=&main::Plat;
+
+ &main::Output(
+ "COMPWRAP$Bld : OUTPUT_NAME = ",
+ "$Platcmpwrap\_$Bld",
+ "\n"
+ );
+
+ &main::Output(
+ "COMPWRAP$Bld : MAKEWORK$Bld"
+ );
+
+ foreach (@SrcList) {
+ my $BaseSrc = &main::Path_Split('Base', $_);
+ &main::Output(
+ " \\\n\tCOMPWRAP$Bld$BaseSrc"
+ );
+ }
+
+ &main::Output(
+ "\n",
+ "\n"
+ );
+ }
+ #--Compiler wrapper support ends
+
+ # Flag that tells us wheter to run checklib.exe on user-added static libraries.
+ my $run_checklib = 0;
+
+ if (@StatLibList && $BasicTrgType =~ /^(EXE|DLL)$/o && !$SystemTrg && main::StdCppSupport()) {
+ # There are user-added static libraries. They should be checked for
+ # consistent use of operator new.
+ $run_checklib = 1;
+
+ #Create a make variable for the libraries.
+ main::Output("\nUSER_ADDED_ARCHIVES_$Bld=");
+ PrintList("\' \\\n\t\'\.\&Generic_Quote\(\"\\\$\(EPOCSTATLINK$Bld\)\\\\\$_\"\)", @StatLibList);
+ main::Output("\n\n");
+ }
+
+ &main::Output(
+ "LIBS$Bld="
+ );
+
+ my @depLibs;
+ if ($BasicTrgType=~/^DLL$/o) { # Add the DLL stub library
+ &main::Output(
+ " \\\n\t",
+ &Generic_Quote("\$(EPOCSTATLINK$Bld)\\EDLLSTUB.lib")
+ );
+ push @depLibs, &Generic_Quote("\$(EPOCSTATLINK$Bld)\\EDLLSTUB.lib");
+ }
+
+ my $StaticRTLib = "";
+
+
+ if ($SystemTrg) {
+ $StaticRTLib = "ksrt";
+ }
+ else {
+ $StaticRTLib = "usrt";
+ }
+
+ if ($RVCTVersion) {
+ $StaticRTLib .= $RVCTVersion;
+ }
+ elsif ($GCCEVersion) {
+ if ($GCCEMajorVersion < 4) {
+ $StaticRTLib .= "2_2";
+ }
+ else {
+ $StaticRTLib .= "3_1";
+ }
+ }
+ else {
+ $StaticRTLib .= "2_2";
+ }
+
+ &main::Output(" \\\n\$(EPOCSTATLINK$Bld)\\$StaticRTLib\.lib");
+
+ &main::Output(" \\\n\t",getConfigVariable('VIA_FILE_PREFIX'));
+ PrintList("\' \\\n\t\'\.\&Generic_Quote\(\"\\\$\(EPOCBSFSTATLINK$Bld\)\\\\\$_\"\)", @StatLibList);
+ &main::Output(" \\\n\t",getConfigVariable('VIA_FILE_SUFFIX'));
+
+ @depLibs = (@depLibs, DepLinkList("\&Generic_Quote\(\"\\\$\(EPOCBSFSTATLINK$Bld\)\\\\\$_\"\)", @StatLibList));
+
+
+ my @ImportLibList = ImportLibraryList(@LibList);
+ PrintList("\' \\\n\t\'\.\&Generic_Quote\(\"\\\$\(EPOCLIB\)\\\\LIB\\\\\$_\"\)", @ImportLibList);
+ @depLibs = (@depLibs, DepLinkList("\&Generic_Quote\(\"\\\$\(EPOCLIB\)\\\\LIB\\\\\$_\"\)", @ImportLibList));
+
+ if ($TrgType=~/^STDEXE$/o || $TrgType=~/^STDDLL$/o) {
+ $NamedSymLkup = 1;
+ my @OEImportLibraryList = &GetOEImportLibList();
+ @OEImportLibraryList = ImportLibraryList(@OEImportLibraryList);
+ if(not (grep /^libc.dso$/i, @LibList)) {
+ push @OEImportLibraryList, "libc.dso";
+ }
+ PrintList("\' \\\n\t\'\.\&Generic_Quote\(\"\\\$\(EPOCLIB\)\\\\LIB\\\\\$_\"\)", @OEImportLibraryList);
+ @depLibs = (@depLibs, DepLinkList("\&Generic_Quote\(\"\\\$\(EPOCLIB\)\\\\LIB\\\\\$_\"\)", @OEImportLibraryList));
+ }
+
+ unless ($ArmRT || ($BasicTrgType=~/^LIB$/o)) {
+ my $TargLib = "$ExportLibrary.dso";
+ $TargLib =~ s/\{(\d|a|b|c|d|e|f){8}\}//i;
+ unless ($SystemTrg) {
+ foreach (@RTLibList) {
+ # Ignore the empty file name Modified by Kun Xu for DEF126030 on 06/08/2008
+ if(!$_)
+ {
+ next;
+ }
+ &main::Output(
+ " \\\n\t",
+ &Generic_Quote("\$(EPOCLIB)\\LIB\\$_")
+ ) unless ($_ =~ /$TargLib/i);
+ push @depLibs, &Generic_Quote("\$(EPOCLIB)\\LIB\\$_") unless ($_ =~ /$TargLib/i);
+ }
+ }
+ }
+ #OE Glue Code
+ if ($TrgType=~/^STDEXE$/o) {
+ my @OELibList = &GetOELibList();
+ foreach (@OELibList) {
+ &main::Output(
+ " \\\n\t",
+ &Generic_Quote("\$(EPOCSTATLINK$Bld)\\$_"),
+ );
+ push @depLibs, &Generic_Quote("\$(EPOCSTATLINK$Bld)\\$_");
+ }
+ }
+ PrintList("\' \\\n\t\'\.\&Generic_Quote\(\"\$_\"\)", @ToolChainLibList);
+
+ &main::Output(
+ "\n",
+ "\n"
+ );
+
+ main::Output(
+ "LIBS$Bld" . "DEPS="
+ );
+
+ my @tmp;
+ for my $lib (@depLibs)
+ {
+ $lib =~ s/\(.*\.o\)//;
+ $lib =~ s/\\$//;
+ push @tmp, $lib unless ($lib =~ /-\(/ || $lib =~ /-\)/);
+ }
+
+ PrintList("\' \\\n\t\'\.\&Generic_Quote\(\"\$_\"\)", @tmp);
+
+ &main::Output(
+ "\n",
+ "\n"
+ );
+
+ &main::Output(
+ "VTBLEXPORTS$Bld="
+ );
+ my $vtobj = quotemeta("(VtblExports.o)");
+ &main::Output(
+ "\n",
+ "\n"
+ );
+
+ &main::Output(
+ "OBJECTS$Bld="
+ );
+ foreach (@SrcList) {
+ my $BaseSrc = &main::Path_Split('Base', $_);
+ my $Ext = &main::Path_Split('Ext', $_);
+ if ($Ext =~ /cia/i && ($PlatName ne "GCCE")) {
+ $BaseSrc = "$BaseSrc\_";
+ }
+
+ &main::Output(
+ " \\\n\t",
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o")
+ );
+
+ $objectFiles .= &main::BldPath.$BaseSrc.".o ";
+ }
+ &main::Output(
+ "\n",
+ "\n"
+ );
+
+ # IsCustomDllUseCase() subroutine is called to check if the given executable
+ # is a custom dll or not.
+ my $IsCustomDll = IsCustomDllUseCase();
+
+ if ($IsCustomDll)
+ {
+ # Generate ".bin" file(assembly listing file) only if frozen deffile is present and EXPORTUNFROZEN is not specified
+ # in the Mmp file.
+ if((-e $DefFile) && (!&main::ExportUnfrozen))
+ {
+ &main::Output(
+ "EXPFILE$Bld = \$(EPOCBLD$Bld)\\$ExportLibrary.bin \n",
+ "\n"
+ );
+ }
+ else
+ {
+ &main::Output(
+ "EXPFILE$Bld = \n",
+ "\n"
+ );
+ }
+ }
+
+ # Create "via" file containing all object files in order to reduce
+ # command line lengths in pertinent calls
+ my $objectsViaFile = &main::CommandFile();
+ my $viaoption = getConfigVariable('COMMANDFILE_OPTION');
+
+ if ($BasicTrgType=~/^LIB$/o && StdCppTarget() ) {
+
+ # Add the magic object that identifies the library as a STDLIB.
+ $objectFiles .= "$ENV{EPOCROOT}epoc32/tools/tag/tag_elf";
+ }
+
+ $objectFiles =~ s/\\/\//g ;
+
+ &main::CreateExtraFile($objectsViaFile, $objectFiles);
+
+ &main::Output(
+ &Generic_Quote("\$(EPOCTRG$Bld)\\$Trg"),
+ " : \$(OBJECTS$Bld) \$(LIBS". $Bld . "DEPS)"
+ );
+
+ if (-e $DefFile) { # effectively "if project frozen ..."
+ &main::Output(
+ " ", &Generic_Quote($DefFile)
+ );
+ }
+
+ if($IsCustomDll eq 1)
+ {
+ &main::Output( " \$(EXPFILE$Bld) " );
+ }
+
+ &main::Output("\n");
+
+
+# get rid of any -symbols produced .map file
+ if ($BasicTrgType=~/^(DLL|EXE)/o) {
+ &main::Output(
+ "\t-\$(ERASE) \"\$(EPOCTRG$Bld)\\$Trg.map\" \n"
+ );
+ }
+
+ my $AbsentSubst = '';
+ if ($BasicTrgType=~/^(DLL|EXE)/o) {
+
+ if ($run_checklib) {
+ my $checklib = "checklib";
+
+ if ( StdCppTarget() ) {
+ $checklib .= " stdc++ --elf";
+ }
+ else {
+ $checklib .= " symc++ --elf";
+ }
+
+ &main::Output( "\t$checklib ","\$(USER_ADDED_ARCHIVES_$Bld)\n" );
+ }
+
+ my $WrapLD = $IsProxyWrapperOption ? "$ENV{ABLD_COMPWRAP} " : "";
+ if ($Bld =~ /DEB/)
+ {
+ if($PlatName ne "GCCE"){
+ # if the compiler is RVCT then append SYMBIAN_UDEB_LINK_FLAGS to option string
+ # in order to override the default ones.
+ &main::Output(
+ "\t", $WrapLD, "\$(LD) ","\$(STATIC_LIBS) ", "\$(SHARED_OBJECT_OPTION) ",
+ "\$(CODE_SEGMENT_START) ", "\$(DATA_SEGMENT_START) 0x400000 ", "\$(SYMVER_OPTION) ", "\$(SYMBIAN_UDEB_LINK_FLAGS) ", "\$(SO_NAME_OPTION) ","$LinkAs"
+ );
+ } else {
+ &main::Output(
+ "\t", $WrapLD, "\$(LD) ","\$(STATIC_LIBS) ","\$(SYMBIAN_UDEB_LINK_FLAGS) ", "\$(SHARED_OBJECT_OPTION) ",
+ "\$(CODE_SEGMENT_START) ", "\$(DATA_SEGMENT_START) 0x400000 ", "\$(SYMVER_OPTION) ","\$(SO_NAME_OPTION) ","$LinkAs"
+ );
+ }
+ }
+ else
+ {
+ if($PlatName ne "GCCE"){
+ # if the compiler is RVCT then append SYMBIAN_UREL_LINK_FLAGS to option string
+ # in order to override the default ones.
+ &main::Output(
+ "\t", $WrapLD, "\$(LD) ","\$(STATIC_LIBS) ","\$(SHARED_OBJECT_OPTION) ",
+ "\$(CODE_SEGMENT_START) ", "\$(DATA_SEGMENT_START) 0x400000 ", "\$(SYMVER_OPTION) ", "\$(SYMBIAN_UREL_LINK_FLAGS) ", "\$(SO_NAME_OPTION) ", "$LinkAs"
+ );
+ } else {
+ &main::Output(
+ "\t", $WrapLD, "\$(LD) ","\$(STATIC_LIBS) ","\$(SYMBIAN_UREL_LINK_FLAGS) ","\$(SHARED_OBJECT_OPTION) ",
+ "\$(CODE_SEGMENT_START) ", "\$(DATA_SEGMENT_START) 0x400000 ", "\$(SYMVER_OPTION) ","\$(SO_NAME_OPTION) ","$LinkAs"
+ );
+ }
+ }
+
+ if(&main::DebugSwitchUsed()){
+ if(&main::SymbolicDebugEnabled() ) {
+ &main::Output(
+ " \$(LINKER_DEBUG_OPTION) "
+ );
+ }
+ else {
+ &main::Output(
+ " \$(LINKER_NODEBUG_OPTION) "
+ );
+ }
+ }
+ elsif($Bld =~/DEB/){
+ &main::Output(
+ " \$(LINKER_DEBUG_OPTION) "
+ );
+ }
+ else {
+ &main::Output(
+ " \$(LINKER_NODEBUG_OPTION) "
+ );
+ }
+
+ my $EntrySymbol;
+ if ($BasicTrgType=~/^DLL$/o) {
+ $EntrySymbol = '_E32Dll';
+ }
+ elsif ($BasicTrgType=~/^EXE$/o) {
+ $EntrySymbol = '_E32Startup';
+ }
+ if ($EntrySymbol) {
+ $AbsentSubst = " --absent $EntrySymbol";
+ }
+
+ if (($BasicTrgType=~/^DLL$/o) || ($BasicTrgType=~/^EXE$/o)) {
+ &main::Output(
+ " \$(LINKER_ENTRY_OPTION)",
+ " $EntrySymbol "
+ );
+ my $undefined_option = getConfigVariable('UNDEFINED_SYMBOL_REF_OPTION');
+ if ($undefined_option)
+ {
+ &main::Output(
+ " \$(UNDEFINED_SYMBOL_REF_OPTION)",
+ " $EntrySymbol "
+ );
+ }
+ }
+
+ if ($BasicTrgType=~/^DLL$/o) {
+ # get the right object file for the entry point
+ my $ObjFile="\$(EDLL_OBJECT)";
+ if ($FirstLib =~ /EDEV/i) {
+ $ObjFile="\$(DENTRY_OBJECT)";
+ }
+ if ($FirstLib =~ /EKLL/i) {
+ $ObjFile="\$(LENTRY_OBJECT)";
+ }
+ if ($FirstLib =~ /EEXT/i) {
+ $ObjFile="\$(XENTRY_OBJECT)";
+ }
+ if ($FirstLib =~ /EVAR/i) {
+ $ObjFile="\$(VENTRY_OBJECT)";
+ }
+
+ &main::Output(
+ " \$(EPOCSTATLINK$Bld)\\$FirstLib", "$ObjFile",
+ " \$(EPOCSTATLINK$Bld)\\$FirstLib", " \\", "\n"
+ );
+ } elsif ($BasicTrgType=~/^EXE$/o || $TrgType=~/^EXEXP$/o) {
+ # get the right object file for the entry point
+ my $ObjFile="\$(EEXE_OBJECT)";
+ if ($FirstLib =~ /KC_EXE/i) {
+ $ObjFile="\$(KENTRY_OBJECT)";
+ }
+
+ &main::Output(
+ " \$(EPOCSTATLINK$Bld)\\$FirstLib", "$ObjFile",
+ " \$(EPOCSTATLINK$Bld)\\$FirstLib", " \\", "\n"
+ );
+ }
+
+ &main::Output(
+ "\t\t\$(LINKER_OUTPUT_OPTION) \"\$(EPOCBLD$Bld)\\$Trg\" \\\n",
+# "\t\t\$(OBJECTS$Bld) \\\n"
+ );
+
+ &main::Output(
+ "\t\t\$(LINKER_SYMBOLS_MAP_OPTION) ",
+ "\$(","$Bld","_MAP_FILE) \\\n"
+ );
+
+ # Pass in the command file if the command file option is passed in
+ if($viaoption) {
+ #'@' is for GCCE whos version is not 3.4.3
+ if($viaoption eq '@'){
+ main::Output(
+ "\t\t$viaoption$objectsViaFile \\\n"
+ );
+ }
+ #'-via' is for RVCT
+ else{
+ main::Output(
+ "\t\t$viaoption $objectsViaFile \\\n"
+ );
+ }
+ }
+ else {
+ &main::Output(
+ "\t\t\$(OBJECTS$Bld) \\\n"
+ );
+ }
+
+ if($IsCustomDll eq 1) {
+ &main::Output( "\t\t\$(EXPFILE$Bld) \\\n" );
+ }
+
+ &main::Output(
+ "\t\t\$(LIBS$Bld) \\\n",
+ "\t\t\$(VTBLEXPORTS$Bld) \$(USERLDFLAGS) \n"
+ );
+
+ if(&main::DebugSwitchUsed() ){
+ if(&main::SymbolicDebugEnabled() ) {
+ &main::Output(
+ "\tcopy \"\$(EPOCBLD$Bld)\\$Trg\" \"\$(EPOCTRG$Bld)\\$FeatureVariantBaseTrg.sym\"\n"
+ );
+ }
+ }
+ elsif ($Bld=~/^U?DEB$/o) {
+ &main::Output(
+ "\tcopy \"\$(EPOCBLD$Bld)\\$Trg\" \"\$(EPOCTRG$Bld)\\$FeatureVariantBaseTrg.sym\"\n"
+ );
+ }
+ if (-e $DefFile) {
+ &main::Output(
+ "\tcopy ", &Generic_Quote(("\"$DefFile\"")), " \"\$(EPOCBLD)\\$ExportLibrary.prep.def\"\n",
+ );
+ }
+
+ &main::Output(
+ "\telf2e32 --sid=", &main::SecureId(), " "
+ );
+
+ if (&main::IsDebuggable eq DEBUGGABLE) {
+ &main::Output(
+ ' --debuggable '
+ );
+ }
+
+ if (&main::IsDebuggable eq DEBUGGABLE_UDEBONLY) {
+ if ($Bld=~/^UDEB$/o) {
+ &main::Output(
+ ' --debuggable '
+ );
+ }
+ }
+
+ # Do not export Arm Static Library Symbols
+ if (&Armutl_ArmLibList) {
+ &main::Output(
+ ' --excludeunwantedexports'
+ );
+ }
+
+ if ($IsCustomDll eq 1) {
+ &main::Output(
+ ' --customdlltarget'
+ );
+ }
+ if (keys(%Version)) {
+ &main::Output(
+ ' --version=', &Genutl_VersionToUserString(%Version)
+ );
+ }
+ # exexps are allowed data, but they look like dlls to elftran....
+ if (&main::AllowDllData || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+ &main::Output(
+ ' --dlldata'
+ );
+ }
+ if (&main::DataLinkAddress) {
+ &main::Output(
+ ' --datalinkaddress=',&main::DataLinkAddress
+ );
+ }
+ if (&main::FixedProcess) {
+ &main::Output(
+ ' --fixedaddress'
+ );
+ }
+ if (&main::HeapSize) {
+ my %HeapSize=&main::HeapSize;
+ &main::Output(
+ ' --heap=',$HeapSize{Min},',',$HeapSize{Max}
+ );
+ }
+ if (&main::ProcessPriority) {
+ &main::Output(
+ ' --priority=',&main::ProcessPriority
+ );
+ }
+ if (&main::StackSize) {
+ &main::Output(
+ ' --stack=',&main::StackSize
+ );
+ }
+ &main::Output(
+ "\\\n\t\t"
+ );
+
+ my $i=1;
+ foreach (@UidList) {
+ &main::Output(
+ " --uid$i=$_"
+ );
+ $i++;
+ }
+ if(&main::VendorId) {
+ &main::Output(
+ ' --vid=',&main::VendorId
+ );
+ }
+ &main::Output(
+ "\\\n\t\t"
+ );
+
+ &main::Output(
+ ' --capability=',&main::Capability
+ );
+
+ my $vfpv2_support = getConfigVariable('VFP2MODE_OPTION');
+ if ($vfpv2_support && &main::ARMFPU && (&main::ARMFPU =~ /^VFPV2$/i))
+ {
+ &main::Output(
+ ' --fpu=vfpv2'
+ );
+ }
+ else
+ {
+ &main::Output(
+ ' --fpu=softvfp'
+ );
+ }
+
+ if (&main::SmpSafe)
+ {
+ &main::Output(
+ ' --smpsafe'
+ );
+ }
+
+
+ if(($BasicTrgType=~/^DLL/ && $TrgType!~/^DLL/ ) || $TrgType=~/^EXEXP/ || $TrgType=~/^STDEXE/){
+ &main::Output(
+ ' --targettype=',$TrgType
+ );
+ }
+ else{
+ &main::Output(
+ ' --targettype=',$BasicTrgType
+ );
+ }
+
+ &main::Output(
+ ' --output=',"\"\$\@\""
+ );
+ if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+ if (-e $DefFile) {
+ &main::Output(
+ ' --definput=',"\"\$(EPOCBLD)\\$ExportLibrary.prep.def\""
+ );
+ }
+ # Non-callable exports will be ignored if the MMP file does not contain the DEFFILE keyword or contains the NOEXPORTLIBRARY keyword
+ if (!($DefFile) || $NoExportLibrary) {
+ &main::Output( " --ignorenoncallable" );
+ }
+ &main::Output(
+ ' --dso=',
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$ExportLibrary.dso")
+ );
+ &main::Output(
+ ' --defoutput=',
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$ExportLibrary.def")
+ );
+ if(&main::ExportUnfrozen) {
+ &main::Output( ' --unfrozen ');
+ }
+ }
+ #the input elf file - as the last arg
+ &main::Output(
+ " --elfinput=","\"\$(EPOCBLD$Bld)\\$Trg\"",
+ " --linkas=$LinkAs"
+ );
+ if (&main::CompressTarget)
+ {
+ &main::Output(
+ " --uncompressed"
+ );
+ }
+ else
+ {
+ if(&main::CompressTargetMode == NOCOMPRESSIONMETHOD)
+ {
+ # Do nothing
+ }
+ elsif(&main::CompressTargetMode == INFLATECOMPRESSIONMETHOD)
+ {
+ &main::Output(
+ " --compressionmethod inflate"
+ );
+ }
+ elsif(&main::CompressTargetMode == BYTEPAIRCOMPRESSIONMETHOD)
+ {
+ &main::Output(
+ " --compressionmethod bytepair"
+ );
+ }
+
+ }
+
+ if($NamedSymLkup){
+ &main::Output(" --namedlookup"
+ );
+ }
+
+ &main::Output(
+ " --libpath=", "\"\$(EPOCLIB)\\LIB\""
+ );
+
+ if($BasicTrgType=~/^DLL/ && $TrgType!~/^DLL/){
+ my $Export;
+ my $Ordinal=1;
+ foreach $Export (&main::Exports) {
+ if($Ordinal == 1) {
+ &main::Output(" --sysdef=");
+ }
+ &main::Output(
+ "$Export,$Ordinal; "
+ );
+ $Ordinal++;
+ }
+ }
+
+ if (&main::CodePagingTargetMode == UNPAGED) {
+ &main::Output(
+ ' --codepaging=unpaged'
+ );
+ }
+ elsif (&main::CodePagingTargetMode == PAGED) {
+ &main::Output(
+ ' --codepaging=paged'
+ );
+ }
+
+ if (&main::DataPagingTargetMode == UNPAGED) {
+ &main::Output(
+ ' --datapaging=unpaged'
+ );
+ }
+ elsif (&main::DataPagingTargetMode == PAGED) {
+ &main::Output(
+ ' --datapaging=paged'
+ );
+ }
+
+ &main::Output(
+ "\n"
+ );
+
+ }
+ elsif ($BasicTrgType=~/^LIB$/o) {
+ &main::Output(
+ "\t\$(AR) ",
+ " \$(ARCHIVER_CREATE_OPTION) ",
+ " \$(EPOCBSFSTATLINK$Bld)\\$Trg \\\n"
+ );
+ # Pass in the command file if the command file option is passed in
+ if($viaoption) {
+ #'@' is for GCCE whos version is not 3.4.3
+ if($viaoption eq '@'){
+ &main::Output(
+ "\t\t$viaoption$objectsViaFile\n"
+ );
+ }
+ #'-via' is for RVCT
+ else{
+ &main::Output(
+ "\t\t$viaoption $objectsViaFile\n"
+ );
+ }
+ }
+ else {
+ &main::Output(
+ "\t\t\$(OBJECTS$Bld) \n"
+ );
+ }
+ # Pass the archiver options which can be customized form BSF file
+ &main::Output(
+ "\t\t\$(AR_OPTIONS) \n"
+ );
+ }
+
+ &main::Output(
+ "\n"
+ );
+
+ if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+ &main::Output(
+ "\tcopy ", " \"\$(EPOCBLD$Bld)\\$ExportLibrary.def\" ", "\"\$(EPOCBLD)\\$ExportLibrary.def\"\n"
+ );
+ if (&main::ExportUnfrozen) {
+ if ($PlatName =~ /^ARMV5$/)
+ {
+ &main::Output(
+ "\tdef2dll.bat --path=\$(EPOCBLD$Bld) \\\n\t\t--bldpath=\$(EPOCBLD$Bld) \\\n\t\t--export=$ExportLibrary \\\n\t\t--import=$ExportLibrary \\\n",
+ "\t\t--deffile=\$(EPOCBLD)\\$ExportLibrary.def \\\n\t\t--linkAs=$LinkAs \\\n\t\t$InterWorking \\\n\t\t--absent=undef \n"
+ );
+ &main::Output(
+ "\n",
+ "\tcopy ", " \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\" ",
+ "\"\$(EPOCLIB)\\LIB\\$ExportLibrary.lib\"",
+ "\n"
+ );
+ if ($ExtraExportLibrary) {
+ &main::Output(
+ "\n",
+ "\tcopy ", " \"\$(EPOCLIB)\\LIB\\$ExportLibrary.lib\" ",
+ "\"\$(EPOCLIB)\\LIB\\$ExtraExportLibrary.lib\"",
+ "\n"
+ );
+ }
+ }
+
+ &main::Output(
+ "\n",
+ "\tcopy ", " \"\$(EPOCBLD$Bld)\\$ExportLibrary.dso\" ",
+ "\"\$(EPOCLIB)\\LIB\\$ExportLibrary.dso\"",
+ "\n"
+ );
+
+ &main::Output(
+ "\n",
+ "\tcopy ", " \"\$(EPOCBLD$Bld)\\$ExportLibrary.dso\" ",
+ "\"\$(EPOCLIB)\\LIB\\$ExtraExportLibrary.dso\"",
+ "\n"
+ ) if ($ExtraExportLibrary);
+
+ }
+ }
+
+ if($IsCustomDll eq 1)
+ {
+ &main::Output(
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$ExportLibrary.bin"), ": $DefFile\n");
+
+ my $theDefFile = "\$(EPOCBLD)\\$ExportLibrary.def";
+ $theDefFile = $DefFile if (-e $DefFile && !&main::ExportUnfrozen);
+ my $theAssembler = " \$(ASM) ";
+ &main::Output(
+ "\telf2e32 \\\n\t\t--definput=$theDefFile \\\n\t\t--dump=a \\\n\t\t--output=\$(EPOCBLD$Bld)\\$ExportLibrary.s \n",
+ "\t$theAssembler \$(AAPCS_OPTION) \\\n\t\t \$(ASM_OUTPUT_OPTION) \$(EPOCBLD$Bld)\\$ExportLibrary.bin \$(EPOCBLD$Bld)\\$ExportLibrary.s\n\n"
+ );
+ &main::Output(
+ "\t-\$(ERASE) \"\$(EPOCBLD$Bld)\\$ExportLibrary.s\"\n\n"
+ );
+ }
+
+ &main::Output( "\n" );
+}
+
+# Set to 1 if multifile compilation wanted
+my $domultifile = 0;
+
+sub DoMultiFile () {
+ return $ENV{RVCTMultiFile} if (defined $ENV{RVCTMultiFile});
+ return $domultifile;
+}
+
+my %CompilationGroups = ();
+
+sub InitMultiFileCompilation() {
+# Do preparatory work for multifile compilation
+ my $SourceStructRef=&main::SourceStructRef;
+
+# We sort the source files by path and extension. These form natural groups to compile together.
+ my %PathToSourceMap = ();
+ foreach my $SourceRef (@$SourceStructRef) {
+ my $SrcFile = $$SourceRef{CurFile};
+ my $Ext = &main::Path_Split('Ext', $SrcFile);
+ push @{$PathToSourceMap{$$SourceRef{SrcPath}}{$Ext}}, $SrcFile;
+ }
+
+# Now we split each group into sets of 10.
+ foreach my $SrcPath (keys %PathToSourceMap) {
+ foreach my $Ext (keys %{$PathToSourceMap{$SrcPath}}) {
+ my @FileList;
+ my @ObjectList;
+ my @SourceList;
+ my $NumToGo = 10;
+ foreach my $File (@{$PathToSourceMap{$SrcPath}{$Ext}}) {
+ my $base = &main::Path_Split('Base', $File);
+ my $cia = ($Ext =~ /cia/i);
+ $base .= "_" if $cia && ($PlatName ne "GCCE");
+ push @FileList, $File;
+ push @ObjectList, "$base.o";
+# this gives us our source files xxx
+ push @SourceList, ($cia && ($PlatName ne "GCCE")) ? "$base.cpp" : "$SrcPath$base$Ext";
+ $NumToGo--;
+ unless ($NumToGo) {
+# Use the last file as the key. This means e.g that all the dependency
+# info will have been generated for the earlier files in the list
+ push @{$CompilationGroups{$FileList[$#FileList]}{Sources}}, @SourceList;
+ push @{$CompilationGroups{$FileList[$#FileList]}{Objects}}, @ObjectList;
+ $NumToGo = 10;
+ undef @FileList;
+ undef @ObjectList;
+ undef @SourceList;
+ }
+ }
+ push @{$CompilationGroups{$FileList[$#FileList]}{Sources}}, @SourceList;
+ push @{$CompilationGroups{$FileList[$#FileList]}{Objects}}, @ObjectList;
+ }
+ }
+
+# debug print out
+ if (0) {
+ foreach my $keyfile (keys %CompilationGroups) {
+ print "$keyfile :\n";
+ foreach my $class (keys %{$CompilationGroups{$keyfile}}) {
+ print "\t$class:\n\t\t";
+ print join " ", @{$CompilationGroups{$keyfile}{$class}}, "\n";
+ }
+ }
+ }
+
+}
+
+sub PMStartSrcList {
+
+ &main::Output(
+ "# SOURCES\n",
+ "\n"
+ );
+
+ InitMultiFileCompilation() if DoMultiFile();
+
+}
+
+sub PMBitMapBld {
+
+ &Generic_BitMapBld;
+
+}
+
+sub PMResrcBld {
+
+ &Generic_ResrcBld;
+
+}
+
+sub PMAifBld {
+ &Generic_AifBld;
+}
+
+
+sub PMStartSrc {
+ my $Src=&main::Src;
+
+ &main::Output(
+ "# Source $Src\n",
+ "\n"
+ );
+}
+
+sub PMSrcDepend {
+ my @DepList=&main::DepList;
+ return if (@DepList == 0);
+
+ my @BldList=&main::BldList;
+ my $BaseSrc=&main::BaseSrc;
+ my $ExtSrc=&main::ExtSrc;
+
+ my $BaseObj=$BaseSrc;
+ my $cia = 0;
+ if ($ExtSrc =~ /cia/i ) {
+ $cia = 1;
+ $BaseObj .= '_' if ($PlatName ne "GCCE");
+ }
+
+ foreach my $Bld (@BldList) {
+ my $tranasm = getConfigVariable('TRANASM');
+ if ($tranasm)
+ {
+ &main::Output(
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.pre"), " ",
+ ) if $cia && ($PlatName ne "GCCE");
+ }
+
+ &main::Output(
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseObj.cpp"), " ",
+ ) if $cia && ($PlatName ne "GCCE");
+ &main::Output(
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), " ",
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseObj.o"), " \\\n",
+ );
+ }
+ &main::Output(
+ ":"
+ );
+
+ my $prefix_file=getConfigVariable('PREFIXFILE');
+
+ my @tempdeplist = &main::DepList;
+
+ my $totalcount = $#tempdeplist;
+ my $count = 0;
+ while( $totalcount >= $count )
+ {
+ my $dependencyfile = shift(@tempdeplist);
+ if($dependencyfile eq $prefix_file )
+ {
+ $DepList[$count]="\$(PREFIXFILE)";
+ }
+ $count += 1;
+ }
+
+ PrintList("\' \\\n\t\'\.\&Generic_Quote\(\$_\)", @DepList);
+ &main::Output(
+ "\n",
+ "\n"
+ );
+}
+
+sub PMSrcBldDepend {
+ my @DepList=&main::DepList;
+ return if (@DepList == 0);
+
+ my $Bld=&main::Bld;
+ my $BaseSrc=&main::BaseSrc;
+ my $ExtSrc=&main::ExtSrc;
+
+ my $BaseObj=$BaseSrc;
+ my $cia = 0;
+ if ($ExtSrc =~ /cia/i ) {
+ $cia = 1;
+ $BaseObj .= '_' if ($PlatName ne "GCCE");
+ }
+
+ my $tranasm = getConfigVariable('TRANASM');
+ if ($tranasm)
+ {
+ &main::Output(
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.pre"), " ",
+ ) if $cia && ($PlatName ne "GCCE");
+ }
+
+ &main::Output(
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseObj.cpp"), " ",
+ ) if $cia && ($PlatName ne "GCCE");
+
+ &main::Output(
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), " ",
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseObj.o"), " :",
+ );
+
+ my $prefix_file=getConfigVariable('PREFIXFILE');
+
+ my @tempdeplist = &main::DepList;
+
+ my $totalcount = $#tempdeplist;
+ my $count = 0;
+ while( $totalcount >= $count )
+ {
+ my $dependencyfile = shift(@tempdeplist);
+ if($dependencyfile eq $prefix_file )
+ {
+ $DepList[$count]="\$(PREFIXFILE)";
+ }
+ $count += 1;
+ }
+
+ PrintList("\' \\\n\t\'\.\&Generic_Quote\(\$_\)", @DepList);
+ &main::Output(
+ "\n",
+ "\n"
+ );
+}
+
+sub quoted_path
+{
+ my $curdrive="";
+ my ($arg) = @_;
+ return "\"$arg\"" if ($arg !~ /^\\[^\\]/); # not an absolute path
+
+ $curdrive=$1 if (cwd =~ /^(.:)/);
+ return "\"$curdrive$arg\"";
+}
+
+sub PMPrefixFile
+{
+# Prefix Header File passed to the preprocessor
+
+ my $prefix_file=getConfigVariable('PREFIXFILE');
+ return quoted_path($prefix_file) if defined $prefix_file;
+}
+
+sub PMToolChainIncDir
+ {
+ # Extra system include directories dictated by the toolchain
+ return $ToolChainIncDir;
+ }
+
+sub PMEndSrcBld {
+# Generate multifile compilation stuff if needed.
+ if (DoMultiFile()) {
+ MultiFileEndSrcBld();
+ return;
+ }
+
+ my $ABI=&main::ABI;
+ my $Plat=&main::Plat;
+ my $BaseSrc=&main::BaseSrc;
+ my $Bld=&main::Bld;
+ my $Src=lc &main::Src;
+ my $SrcPath=&main::SrcPath;
+ my $BaseTrg=&main::BaseTrg;
+ my $BldPath = &main::BldPath;
+ my $Ext = &main::Path_Split('Ext', $Src);
+ $Src = ucfirst $Src if ($Ext !~ /\.(cpp|c)$/);
+ my $LangOptions = &SelectLangOptions($Ext);
+ # support for auto 'translated' ASM
+ my $AsmFilep = $AsmFiles{$Src};
+
+ $preinclude = &GetToolChainPreInclude();
+
+ #Function call logger takes -I as include option
+ my $FCLogger_inc_option = getConfigVariable('FC_LOGGER_INCLUDE_OPTION');
+ my $logger_preinclude = getConfigVariable('PREINCLUDE_OPTION_FCLOGGER');
+ my $Dictionary_File_Name = getConfigVariable('FC_LOGGER_DICTIONARY_FILE_NAME');
+ my $Generated_C_File_Name = getConfigVariable('FC_LOGGER_GENERATED_C_FILE_NAME');
+
+ my $ChopSrcPath=&main::Path_Chop($SrcPath);
+ my $lfboption = LinkerFeedBackOption();
+ my $LstExt ;
+ if($Plat =~ /^(ARMV[6-9])/i){
+ $LstExt = $1 ;
+ }
+ else{
+ $LstExt = $ABI;
+ }
+ if ($AsmFilep || ($Ext =~ /cia/i && ($PlatName ne "GCCE"))) {
+ &main::Output(
+# compile the translated, preprocessed source
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.o"), " : ",
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.cpp"), "\n",
+ "\t\@echo $Src\n",
+ "\t\$(CC$Bld) $lfboption $LangOptions ", "\$(INCLUDE_OPTION)"," \$(call absolutePaths,$ChopSrcPath \$(INCDIR) \$(OUTPUT_OPTION) \$\@ \$(EPOCBLD$Bld)\\$BaseSrc\_.cpp)\n",
+ "\n"
+ );
+# rule to translate the preprocessed source
+ my $tranasm = getConfigVariable('TRANASM');
+ if ($tranasm)
+ {
+ &main::Output(
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.cpp"), " : ",
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.pre"), "\n",
+
+ "\t\$(TRANASM) \$(TRANASM_FLAGS) \$(TRANASM_OUTPUT_OPTION)\$\@ \$(TRANASM_INPUT_OPTION)\$(EPOCBLD$Bld)\\$BaseSrc.pre\n",
+ "\n"
+ );
+# rule to preprocess the source
+ &main::Output(
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.pre"), " : ",
+ &Generic_Quote("$SrcPath$Src"), "\n",
+ "\t\$(CC$Bld) \$(PREPROCESSOR_OPTION) $preinclude $LangOptions ","\$(INCLUDE_OPTION)"," \$(call absolutePaths,$ChopSrcPath \$(INCDIR) $ChopSrcPath\\$Src \$(OUTPUT_OPTION) \$\@) \n",
+# generate an assembly listing target too
+ "LISTING$Bld$BaseSrc\_ : ", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.lis"), "\n",
+ "\t", &Generic_CopyAction("$SrcPath$BaseSrc\_.$LstExt.lst"),
+ "\n",
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.lis"), " : ",
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.cpp"), "\n",
+ "\t\$(CC$Bld) $LangOptions ", "\$(ASSEMBLER_LISTING_OPTION) ","\$(INCLUDE_OPTION)"," \$(call absolutePaths,$ChopSrcPath \$(INCDIR) \$(OUTPUT_OPTION) \$\@ \$(EPOCBLD$Bld)\\$BaseSrc\_.cpp)\n",
+ "\n"
+ );
+ }
+ else
+ {
+ &main::Output(
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.cpp"), " : ",
+ &Generic_Quote("$SrcPath$Src"), "\n",
+ "\t\$(CC$Bld) \$(PREPROCESSOR_OPTION) $preinclude $LangOptions ","\$(INCLUDE_OPTION)"," \$(call absolutePaths,$ChopSrcPath \$(INCDIR) $ChopSrcPath\\$Src \$(OUTPUT_OPTION) \$\@) \n",
+# generate an assembly listing target too
+ "LISTING$Bld$BaseSrc\_ : ", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.lis"), "\n",
+ "\t", &Generic_CopyAction("$SrcPath$BaseSrc\_.$LstExt.lst"),
+ "\n",
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.lis"), " : ",
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.cpp"), "\n",
+ "\t\$(CC$Bld) $LangOptions ", "\$(ASSEMBLER_LISTING_OPTION) ","\$(INCLUDE_OPTION)"," \$(call absolutePaths,$ChopSrcPath \$(INCDIR) \$(OUTPUT_OPTION) \$\@ \$(EPOCBLD$Bld)\\$BaseSrc\_.cpp)\n",
+ "\n"
+ );
+ }
+ }
+ else {
+ #If Function call logging is enabled, add call to function call logger
+ if ($Function_Call_Logger) {
+ &main::Output(
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o"),
+ " : ",
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.int.cpp"),
+ "\n",
+ "\t\@echo $BaseSrc.int.cpp\n",
+ "\t\$(CC$Bld) $lfboption$LangOptions ",
+ " \$(INCLUDE_OPTION) ",
+ "\$(call absolutePaths, $ChopSrcPath \$(INCDIR) \$(OUTPUT_OPTION) \$\@ \$(EPOCBLD$Bld)\\$BaseSrc.int.cpp)\n",
+ "\n",
+# generate an assembly listing target too
+ "LISTING$Bld$BaseSrc : ",
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"),
+ "\n",
+ "\t",
+ &Generic_CopyAction("$SrcPath$BaseSrc.$LstExt.lst"),
+ "\n",
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"),
+ " : ",
+ &Generic_Quote("$SrcPath$Src"),
+ "\n",
+ "\t\$(CC$Bld) $LangOptions ",
+ "\$(ASSEMBLER_LISTING_OPTION) ",
+ "\$(INCLUDE_OPTION)",
+ " \$(call absolutePaths,$ChopSrcPath \$(INCDIR) \$(OUTPUT_OPTION) \$\@ $ChopSrcPath\\$Src) \n",
+ "\n"
+ );
+
+ #Call to Function Call Logger
+ &main::Output(
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.int.cpp"),
+ " : ",
+ &Generic_Quote("$SrcPath\\$Src"),
+ "\n",
+ "\t\@echo $BaseSrc.int.cpp\n",
+ "\t\$(FCLOGGER$Bld) $lfboption \\\n" ,
+ "\t$FCLogger_inc_option $ChopSrcPath \\\n",
+ "\t$logger_preinclude \\\n ",
+ "\t\$(INCDIR_FCLOGGER) \\\n" ,
+ "\t$Dictionary_File_Name $BldPath$BaseTrg.txt \\\n" ,
+ "\t$Generated_C_File_Name \$\@ $ChopSrcPath\\$Src \n",
+ "\n\n"
+ );
+ }
+ else {
+ &main::Output(
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o"), " : ",
+ &Generic_Quote("$SrcPath$Src"), "\n",
+ "\t\@echo $Src\n",
+ "\t\$(CC$Bld) $lfboption $LangOptions ", "\$(INCLUDE_OPTION)"," \$(call absolutePaths,$ChopSrcPath \$(INCDIR) \$(OUTPUT_OPTION) \$\@ $ChopSrcPath\\$Src)\n",
+ "\n",
+# generate an assembly listing target too
+ "LISTING$Bld$BaseSrc : ", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), "\n",
+ "\t", &Generic_CopyAction("$SrcPath$BaseSrc.$LstExt.lst"),
+ "\n",
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), " : ",
+ &Generic_Quote("$SrcPath$Src"), "\n",
+ "\t\$(CC$Bld) $LangOptions ","\$(ASSEMBLER_LISTING_OPTION) ","\$(INCLUDE_OPTION)"," \$(call absolutePaths,$ChopSrcPath \$(INCDIR) \$(OUTPUT_OPTION) \$\@ $ChopSrcPath\\$Src) \n",
+ "\n"
+ );
+ # Compiler wrapper support starts...
+ if($IsCompilerWrapperOption)
+ {
+ &main::Output(
+ "COMPWRAP$Bld$BaseSrc : ",
+ &Generic_Quote("$SrcPath$Src"), "\n",
+ "\t\@echo Analysing $Src\n",
+ "\t\$(COMPWRAP) \$(CC$Bld) $lfboption $LangOptions ", "\$(INCLUDE_OPTION)"," \$(call absolutePaths,$ChopSrcPath \$(INCDIR) \$(OUTPUT_OPTION) \$\@ $ChopSrcPath\\$Src)\n",
+ "\n"
+ );
+ }
+ # Compiler wrapper support ends...
+ }
+ }
+}
+
+my $MFVarN = 0;
+sub MultiFileEndSrcBld {
+ my $ABI=&main::ABI;
+ my $BaseSrc=&main::BaseSrc;
+ my $Bld=&main::Bld;
+ my $KeyFile = &main::Src;
+ my $Src=ucfirst lc $KeyFile;
+ my $SrcPath=&main::SrcPath;
+ my $Ext = &main::Path_Split('Ext', $Src);
+ my $LangOptions = &SelectLangOptions($Ext);
+ # support for auto 'translated' ASM
+ my $AsmFilep = $AsmFiles{$Src};
+
+ my $ChopSrcPath=&main::Path_Chop($SrcPath);
+ my $lfboption = LinkerFeedBackOption();
+
+ if ($AsmFilep || ($Ext =~ /cia/i && ($PlatName ne "GCCE"))) {
+ if ($CompilationGroups{$KeyFile}) {
+# compile the translated, preprocessed source
+ &main::Output( "OBJECTS$MFVarN = ");
+ foreach my $obj (@{$CompilationGroups{$KeyFile}{Objects}}) {
+ &main::Output( &Generic_Quote("\\\n\t\$(EPOCBLD$Bld)\\$obj"), " ");
+ }
+ &main::Output( "\n\n");
+ &main::Output( "SOURCES$MFVarN = ");
+ foreach my $src (@{$CompilationGroups{$KeyFile}{Sources}}) {
+ &main::Output( &Generic_Quote("\\\n\t\$(EPOCBLD$Bld)\\$src", " "));
+ }
+ &main::Output( "\n\n");
+ &main::Output( "\$(OBJECTS$MFVarN) : \$(SOURCES$MFVarN) \n");
+
+ &main::Output(
+ "\t\@echo Compiling \$(SOURCES$MFVarN)\n",
+ "\t\$(CC$Bld) ","\$(INCLUDE_OPTION)"," \$(call absolutePaths,$ChopSrcPath \$(INCDIR)) $lfboption\\\n",
+ "\t\t$LangOptions \$(OUTPUT_OPTION) \$\@ --multifile \$(SOURCES$MFVarN)"
+ );
+ &main::Output( "\n\n");
+ $MFVarN++;
+ }
+ &main::Output(
+# rule to translate the preprocessed source
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.cpp"), " : ",
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.pre"), "\n",
+ "\ttranasm -n -s -o=\$\@ \$(EPOCBLD$Bld)\\$BaseSrc.pre\n",
+ "\n",
+# rule to preprocess the source
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.pre"), " : ",
+ &Generic_Quote("$SrcPath$Src"), "\n",
+ "\t\$(CC$Bld) \$(PREPROCESSOR_OPTION) $preinclude $LangOptions ","\$(INCLUDE_OPTION)"," \$(call absolutePaths,$ChopSrcPath \$(INCDIR)) $ChopSrcPath\\$Src \$(OUTPUT_OPTION) \$\@ \n",
+# generate an assembly listing target too
+ "LISTING$Bld$BaseSrc\_ : ", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.lis"), "\n",
+ "\t", &Generic_CopyAction("$SrcPath$BaseSrc\_.$LstExt.lst"),
+ "\n",
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.lis"), " : ",
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.cpp"), "\n",
+ "\t\$(CC$Bld) $LangOptions ", "\$(ASSEMBLER_LISTING_OPTION) ","\$(INCLUDE_OPTION)"," \$(call absolutePaths,$ChopSrcPath \$(INCDIR)) \$(OUTPUT_OPTION) \$\@ \$(EPOCBLD$Bld)\\$BaseSrc\_.cpp\n",
+ "\n"
+ );
+ } else {
+
+ if ($CompilationGroups{$KeyFile}) {
+# compile the source
+ &main::Output( "OBJECTS$MFVarN = ");
+ foreach my $obj (@{$CompilationGroups{$KeyFile}{Objects}}) {
+ &main::Output( &Generic_Quote("\\\n\t\$(EPOCBLD$Bld)\\$obj"), " ");
+ }
+ &main::Output( "\n\n");
+ &main::Output( "SOURCES$MFVarN = ");
+ foreach my $src (@{$CompilationGroups{$KeyFile}{Sources}}) {
+ &main::Output( &Generic_Quote("\\\n\t$src"), " ");
+ }
+ &main::Output( "\n\n");
+ &main::Output( "\$(OBJECTS$MFVarN) : \$(SOURCES$MFVarN) \n");
+
+ &main::Output(
+ "\t\@echo Compiling \$(SOURCES$MFVarN)\n",
+ "\t\$(CC$Bld) ", "\$(INCLUDE_OPTION)"," \$(call absolutePaths,$ChopSrcPath \$(INCDIR)) $lfboption\\\n",
+ "\t\t$LangOptions \$(OUTPUT_OPTION) \$\@ --multifile \$(SOURCES$MFVarN)"
+ );
+ &main::Output( "\n\n");
+ $MFVarN++;
+ }
+# generate an assembly listing target too
+ &main::Output(
+ "LISTING$Bld$BaseSrc : ", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), "\n",
+ "\t", &Generic_CopyAction("$SrcPath$BaseSrc.$LstExt.lst"),
+ "\n",
+ &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), " : ",
+ &Generic_Quote("$SrcPath$Src"), "\n",
+ "\t\$(CC$Bld) $LangOptions ","\$(ASSEMBLER_LISTING_OPTION) ","\$(INCLUDE_OPTION)"," \$(call absolutePaths,$ChopSrcPath \$(INCDIR)) \$(OUTPUT_OPTION) \$\@ $ChopSrcPath\\$Src \n",
+ "\n"
+ );
+ }
+}
+
+
+sub PMEndSrc {
+
+ &main::Output(
+ "\n",
+ "\n"
+ );
+}
+
+sub PMEndSrcList {
+
+ # Deal with accumulated MAKEDIRS etc.
+
+ &Generic_End;
+# modified start: makefile improvement
+ &checkVMAPFiles;
+# modified end: makefile improvement
+}
+
+sub ImportLibraryList {
+ my $dso;
+ my $base;
+ my @ImportLibList;
+ foreach $dso (@_) {
+ $base = &main::Path_Split('Base', $dso);
+ $dso = $base.".dso";
+ push @ImportLibList, $dso;
+ }
+ return @ImportLibList;
+}
+
+sub ChangeSlash($) {
+ my $abspath = $_[0];
+ $abspath =~ s/\\/\//g ;
+ return $abspath;
+}
+
+# System libraries such as the standard C++ libraries or floating point libraries or any other
+# static libraries are made into DLLs by linking its export table against them. Such DLLs that are
+# created from a static library is known as a Custom DLL. The ARM libraries can be supplied using
+# the ARMLIBS mmp keyword A DLL is considered to be a customdll based on the presence of ARMLIBS
+# keyword and also the presence of DEFFILE keyword.
+
+sub IsCustomDllUseCase()
+{
+ # To check if ARMLIBS keyword is passed in the MMP file.
+ # Armutl_ArmLibList() gets the list of static arm libraries, if used by an executable.
+ my $armliblist = &Armutl_ArmLibList;
+
+ # To check if DEFFILE keyword is used in the MMP file to supply the def file.
+ my $deffile = &main::DefFile;
+
+ if ($armliblist && $deffile)
+ {
+ return 1;
+ }
+ return 0;
+
+}
+
+sub GetToolChainPreInclude {
+ my $preinclude_file = getConfigVariable('PREINCLUDE_OPTION');
+
+ $preinclude_file =~ s/\\/\//g;
+ return "$preinclude_file";
+}
+
+sub SelectLangOptions {
+ my ($Ext) = @_;
+ $preinclude = &GetToolChainPreInclude;
+ if ($Ext=~/^.cpp$/ || ($Ext=~/^.cia$/ && ($PlatName eq "GCCE"))) {
+ #Function Call Logger
+ return " \$(CPP_LANG_OPTION) " if ($Function_Call_Logger);
+ return " \$(CPP_LANG_OPTION) $preinclude ";
+ }
+ if ($Ext=~/^.cia$/) {
+ return " \$(CIA_LANG_OPTION) ";
+ }
+ if ($Ext=~/^.c$/) {
+ my $CompilerOption = &main::CompilerOption("ARMCC");
+ if($CompilerOption =~ /--cpp/){
+ #Function Call Logger
+ return " \$(CPP_LANG_OPTION) " if ($Function_Call_Logger);
+ return " \$(CPP_LANG_OPTION) $preinclude ";
+ }
+ else {
+ #Function Call Logger
+ return " \$(C_LANG_OPTION) " if ($Function_Call_Logger);
+ return " \$(C_LANG_OPTION) $preinclude ";
+ }
+ }
+ # To support .cc, .cxx, .c++ file extensions for Open Environment
+ elsif ($Ext=~/^(.cc|.cxx|.c\+\+)$/) {
+ #Function Call Logger
+ return " \$(CPP_LANG_OPTION) " if ($Function_Call_Logger);
+ return " \$(CPP_LANG_OPTION) $preinclude ";
+ }
+ return '';
+}
+
+sub IsMapOptAvail() {
+ open PIPE, "arm-none-symbianelf-g++ -v 2>&1 | ";
+ while(<PIPE>){
+
+ if($_ =~ /gcc version (.*) \(release\).*/i)
+ {
+ if($1 lt "3.4.3")
+ {
+ return 0;
+ }
+ elsif($_ =~ /gcc version (.*) \(release\) \(CodeSourcery ARM (.*) (\d*)\)/i)
+ {
+ if($1 eq "3.4.3" && uc $2 ne "Q1B" && $3 ge 2005)
+ {
+ return 1;
+ }
+ elsif($1 gt "3.4.3")
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+
+ }
+
+ }
+ close PIPE;
+}
+
+sub StdCppTarget() {
+
+ # STDCPP is supported
+ return 0 if (! main::StdCppSupport());
+
+ if ( main::NoStdCpp() ) { #MMP keyword NOSTDCPP set
+ return 0;
+ }
+
+ if ( main::StdCpp() ) { # MMP keyword STDCPP set.
+ return 1;
+ }
+ else {
+ return ( main::TrgType() =~ /^(STDEXE|STDDLL|STDLIB)$/io );
+ }
+}
+
+sub GetRTLibList() {
+
+ my $newlib = main::NewLib(); # Could have been set in the MMP file.
+
+ unless ($newlib) {
+ if ( StdCppTarget() ) {
+ $newlib = getConfigVariable('OE_NEW_LIB');
+ }
+ else {
+ $newlib = getConfigVariable('SYM_NEW_LIB');
+ }
+ }
+
+ my @RtLib;
+ my $list = "$newlib " . getConfigVariable('RUNTIME_LIBS_LIST') ;
+ if (length($list) >0)
+ {
+ @RtLib = split(/\s+/, $list);
+ }
+ return @RtLib;
+}
+
+sub GetOELibList() {
+ my @OELib;
+ my $list;
+ if (&main::IsWideCharMain()) {
+ $list = getConfigVariable('OE_EXE_LIBS_WCHAR');
+ }
+ else {
+ $list = getConfigVariable('OE_EXE_LIBS');
+ }
+
+ if (length($list) >0)
+ {
+ @OELib = split(/\s+/, $list);
+ }
+ return @OELib;
+}
+
+sub GetOEImportLibList() {
+ my @OEImportLib;
+ my $list;
+ $list = getConfigVariable('OE_IMPORT_LIBS');
+
+ if (length($list) >0)
+ {
+ @OEImportLib = split(/\s+/, $list);
+ }
+ return @OEImportLib;
+}
+
+sub InitToolChain(@) {
+
+ if($PlatName eq "ARMV5" || $PlatName eq "ARMV5_ABIV2" || $CustomizedARMV5Plat)
+ {
+ my $RVCTBuildNumber;
+
+ ($RVCTMajorVersion, $RVCTMinorVersion, $RVCTBuildNumber) = RVCT_plat2set::get_version_list($PlatName);
+
+ $RVCTVersion = "${RVCTMajorVersion}_${RVCTMinorVersion}";
+
+ my $aRVCTVersion = "${RVCTMajorVersion}.${RVCTMinorVersion}";
+ if (($aRVCTVersion == 2.2) && ($RVCTBuildNumber < 559))
+ {
+ warn "WARNING: When building using ABIV2 mode toolchain Compiler RVCT2.2 Build 559 or later is required.\n";
+ }
+ &Armutl_DoMmp(@_);
+ }
+ elsif ($RootName eq "GCCE")
+ {
+ ($GCCEMajorVersion, $GCCEMinorVersion) = gcce_plat2set::get_version_list($Platname);
+
+ $GCCEVersion = "${GCCEMajorVersion}_${GCCEMinorVersion}";
+ }
+
+}
+
+my %BSF_keywords = (
+ COMMON_OPTIONS => 1,
+ THUMB_OPTIONS => 1,
+ ARM_OPTIONS => 1,
+ KERNEL_OPTIONS => 1,
+ INVARIANT_OPTIONS => 1,
+ LD_OPTIONS => 1,
+ AR_OPTIONS => 1,
+ DEBUG_FORMAT => 1
+ );
+
+
+sub Read_BSF_Options() {
+ my %plat = (main::PlatRec());
+ my @Customization_Data = split(/\n/,$plat{'CUSTOMIZATION_DATA'});
+ foreach my $option (@Customization_Data) {
+ next if ($option =~ /^$/);
+ warn "Unrecognized BSF syntax: $option.\n"
+ unless ($option =~ /\s*(\S+)\s+(.+)$/);
+ my $key = uc $1;
+ my $val = $2;
+ warn "Unrecognized BSF keyword: $key.\n"
+ unless ($BSF_keywords{$key});
+ if ($key =~ /COMMON_OPTIONS/) {
+ push @commonOptions, $val;
+ next;
+ }
+ if ($key =~ /THUMB_OPTIONS/) {
+ push @thumbOptions, $val;
+ next;
+ }
+ if ($key =~ /ARM_OPTIONS/) {
+ push @armOptions, $val;
+ next;
+ }
+ if ($key =~ /KERNEL_OPTIONS/) {
+ push @kernelOptions, $val;
+ next;
+ }
+ if ($key =~ /INVARIANT_OPTIONS/) {
+ push @invariantOptions, $val;
+ next;
+ }
+ if ($key =~ /LD_OPTIONS/) {
+ push @linkerOptions, $val;
+ next;
+ }
+ if ($key =~ /AR_OPTIONS/) {
+ push @archiverOptions, $val;
+ next;
+ }
+ if ($key =~ /DEBUG_FORMAT/) {
+ push @debugFormat, $val;
+ next;
+ }
+
+ }
+}
+
+# Set the options passed from BSF file
+# @param OptionName - BSF Keyword using which the options would be overridden in the BSF file
+# @param Options - List of options read from the BSF keyword
+sub Set_BSF_Options($$)
+{
+ my ($OptionName,$Options) = @_;
+ my @Fragments=();
+ foreach my $val (@{$Options})
+ {
+ # Check if the value of BSF option is to be set or added/removed.
+ if($val =~ /\+\[.*\]\+|\-\[.*\]\-/)
+ {
+ if (@Fragments = Split_BSF_Options($val,'RemoveOptions'))
+ {
+ foreach my $Opt (@Fragments)
+ {
+ # Remove trailing white spaces
+ $Opt =~ s/\s+$//;
+ # Substitute '=' with '%' which is a wild card character in makefile.
+ # This is required for cases where option to be removed contains '=' (e.g.'-march=armv5t').
+ # When such options are to be removed, "$(INVARIANT_OPTIONS:-march=armv5t=)" is written in the makefile.
+ # However, because of the occurence of '=', pattern match fails in the makefile and such options are not removed.
+ # To resolve this, '=' is replaced with '%' in the makefile so that the substitution pattern looks like
+ # "$(INVARIANT_OPTIONS:-march%armv5t=)" in makefile (e.g."$(INVARIANT_OPTIONS:-march%armv5t=)").
+ $Opt =~ s/=/%/;
+ &main::Output(
+ "$OptionName := \$($OptionName:$Opt=)",
+ "\n"
+ );
+ }
+ @Fragments=();
+ }
+ if (@Fragments = Split_BSF_Options($val,'AddOptions'))
+ {
+ &main::Output(
+ "$OptionName += @Fragments ",
+ "\n"
+ );
+ @Fragments=();
+ }
+
+ # Warn if options are not present in the form '+[...]+' or '-[...]-'
+ $val =~ s/\+\[.*?\]\+|\-\[.*?\]\-//g;
+ if($val !~ /^\s*$/)
+ {
+ print "Warning: Ignoring option(s) \"$val\" for $OptionName as option(s) should be in the form '+[...]+' or '-[...]-.\n";
+ }
+ }
+ else
+ {
+ &main::Output(
+ "$OptionName = $val ",
+ "\n"
+ );
+ }
+ }
+ &main::Output(
+ "\n"
+ );
+}
+
+# Split BSF options to find options which are to be added/removed
+# @param String - List of options present in form '+[...]+' or '-[....]-'
+# @param $Task - Variable to decide whether to return options to be addded or options to be removed
+sub Split_BSF_Options($$)
+{
+ my ($String,$Task) = @_;
+ my @Result = ();
+ my @Fragments = ();
+ my $Pattern = '';
+ # Get the toolchain specific option prefix to segregate the options.
+ my $OptionPrefix = getConfigVariable('OPTION_PREFIX');
+
+ if ($Task eq 'AddOptions')
+ {
+ # Get the options which are to be added (present in the form '+[...]+')
+ @Fragments = $String =~ /\+\[(.*?)\]\+/g;
+ }
+ elsif ($Task eq 'RemoveOptions')
+ {
+ # Get the options which are to be removed (present in the form '-[...]-')
+ @Fragments = $String =~ /\-\[(.*?)\]\-/g;
+ }
+
+ # Set the value of '$Pattern' which is required to segregate one option from another based on the option prefix.
+ if($OptionPrefix)
+ {
+ $Pattern = $OptionPrefix.'\S+\s*(?!'.$OptionPrefix.')\S*';
+ }
+ else
+ {
+ # If option prefix is not set in the configuration make file, then set default
+ # option prefix as '-' or '--'.
+ $Pattern = '-{1,2}\S+\s*(?!-)\S*';
+ }
+
+ foreach my $Val (@Fragments)
+ {
+ my @Opt = $Val =~ /$Pattern/g;
+ push @Result,@Opt;
+ }
+ return @Result;
+}
+
+sub SysTrg () {
+ return 1 if &main::SystemTrg;
+ my $ExportLibrary=&main::ExportLibrary;
+ return 1 if ($ExportLibrary =~ /EKERN/i);
+ my $Trg=&main::Trg;
+ return 1 if ($Trg =~ /KSRT/i);
+ return 0;
+}
+
+sub GetLibList() {
+ my @LibList;
+ my @StaticLibList;
+ my $list = getConfigVariable('STATIC_LIBS_LIST') ;
+
+ if (length($list) >0)
+ {
+ @StaticLibList = split(/\s+/, $list);
+ }
+ if($PlatName eq "ARMV5" || $PlatName eq "ARMV5_ABIV2" || $CustomizedARMV5Plat) {
+ @LibList=&Armutl_ArmLibList;
+ if(@LibList==0) {
+ my $LibDir = Armutl_ArmLibDir();
+ # convert '/' to '\' if there are some '/'
+ $LibDir =~ s#/#\\#g;
+ if (@StaticLibList) {
+ foreach my $lib (@StaticLibList) {
+ push @LibList, ("$LibDir\\$lib");
+ }
+ }
+ }
+ }
+ else
+ {
+ @LibList = ('$(STATIC_LIBS_LIST)');
+ }
+ return @LibList;
+}
+
+sub GetToolChainAsmFileList() {
+ my @FileList;
+ @FileList=&Armutl_AsmFileList;
+ if(@FileList)
+ {
+ return @FileList;
+ }
+ return;
+}
+
+sub IsTargetRT() {
+ my $RTtarget=&Armutl_ArmRT;
+ if($RTtarget)
+ {
+ return $RTtarget;
+ }
+ return;
+}
+
+sub GetToolChainIncDir {
+ if($PlatName eq "ARMV5" || $PlatName eq "ARMV5_ABIV2" || $CustomizedARMV5Plat)
+ {
+ #the ToolChainIncDir's value depends on the key word ARMINC in mmp file
+ return &Armutl_ArmIncDir;
+ }
+ else
+ {
+ my $compiler_inc_path = getConfigVariable('COMPILER_INCLUDE_PATH');
+ $compiler_inc_path =~ s/^\s+//g;
+ return ($compiler_inc_path);
+ }
+}
+
+my $useLinkerFeedBack = 0;
+
+sub LinkerFeedBackFile() {
+ return unless $useLinkerFeedBack;
+ my $Trg = &main::Trg;
+ return "$Trg.lfb";
+}
+
+sub LinkerFeedBackOption() {
+ return "" unless $useLinkerFeedBack;
+ my $BasicTrgType=&main::BasicTrgType;
+ return "" unless ($BasicTrgType=~/^(DLL|EXE)/o);
+ my $file = LinkerFeedBackFile();
+ return "/$(FEEDBACK_FILE_OPTION) $file ";
+
+}
+
+sub getConfigVariable
+{
+ my ($variable) = @_;
+ initialiseConfigVariables();
+ return $configVariables{$variable};
+}
+
+sub initialiseConfigVariables()
+{
+ if (!keys(%configVariables))
+ {
+ %configVariables = BPABIutl_Get_Config_Variables($PlatName);
+
+ if (!keys(%configVariables))
+ {
+ # no variables were extracted from configuration file.
+ &main::FatalError("Cannot extract configuration variables for $PlatName");
+ }
+ }
+}
+
+sub PMSupportsFeatureVariants
+{
+ return 1;
+}
+# modified start: makefile improvement
+sub checkVMAPFiles
+{
+ my %srcSet = %{&main::getSrcSet};
+ my %featureVariantInfo = &main::FeatureVariantInfo();
+ my $vmapfile = &main::Trg.".".$featureVariantInfo{NAME}.".vmap";
+ my $mmpFile = &main::MmpFile;
+ if ( $vmapfile ){
+ &main::Output(
+ "\n",
+ "\n",
+ "# Rules to check out the VMAP files",
+ "\n",
+ "\n",
+ );
+ &main::Output(
+ "CHECKVMAPUREL : ",
+ "\$(EPOCTRG)\\urel\\",
+ $vmapfile,
+ " \n",
+ "\$(EPOCTRG)\\urel\\",
+ $vmapfile,
+ " : \\\n",
+ "\t",
+ $mmpFile,
+ );
+ foreach my $srcfile (sort keys(%srcSet))
+ {
+ &main::Output(
+ " \\\n \t",
+ $srcfile,
+ );
+ }
+ &main::Output(
+ "\n",
+ "\t-\$(ERASE) \$(EPOCTRG)\\urel\\",
+ $vmapfile,
+ "\n",
+ "\n",
+ );
+ &main::Output(
+ "CHECKVMAPUDEB : ",
+ "\$(EPOCTRG)\\udeb\\",
+ $vmapfile,
+ " \n",
+ "\$(EPOCTRG)\\udeb\\",
+ $vmapfile,
+ " : \\\n",
+ "\t",
+ $mmpFile,
+ );
+ foreach my $srcfile (sort keys(%srcSet))
+ {
+ &main::Output(
+ " \\\n \t",
+ $srcfile,
+ );
+ }
+ &main::Output(
+ "\n",
+ "\t-\$(ERASE) \$(EPOCTRG)\\udeb\\",
+ $vmapfile,
+ "\n",
+ "\n",
+ );
+ }
+}
+# modified by SV end: makefile improvement
+# modified end: makefile improvement
+
+
+1;