diff -r 22486c9c7b15 -r 378360dbbdba sbsv1/abld/platform/cl_win.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sbsv1/abld/platform/cl_win.pm Wed Jun 30 11:35:58 2010 +0800 @@ -0,0 +1,1265 @@ +# 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: +# + + +package Cl_win; + +# declare variables global for module +my @Win32LibList=(); +my $Win32StdHeaders; +my $BaseAddressFlag; +my $Win32Resrc; + + +require Exporter; +@ISA=qw(Exporter); +@EXPORT=qw( + PMHelp_Mmp + + PMCheckPlatformL + + PMPlatProcessMmp + + PMStartBldList + PMBld + PMStartSrcList + PMBitMapBld + PMResrcBld + PMAifBld + PMStartSrc + PMSrcDepend + PMSrcBldDepend + PMEndSrcBld + PMEndSrc + PMEndSrcList +); + +use Winutl; +use cl_generic; +use Pathutl; + +sub PMHelp_Mmp { + &Winutl_Help_Mmp; +} + +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 PMCheckPlatformL { + if ((&main::Plat eq 'TOOLS') and (&main::BasicTrgType ne 'EXE') and (&main::BasicTrgType ne 'LIB')) { + die "Can't specify anything but EXE or LIB targettypes for this platform\n"; + } +} + +sub PMPlatProcessMmp (@) { + &Winutl_DoMmp(\@_, $ENV{INCLUDE}); + $BaseAddressFlag=&Winutl_BaseAddress; + $BaseAddressFlag=~s/^(.+$)$/ \/base:\"$1\"/o; + @Win32LibList=&Winutl_Win32LibList; + my $MSVCVer = &Winutl_MSVCVer; + push @Win32LibList, "kernel32.lib"; + $Win32Resrc=&Winutl_Win32Resrc; + $Win32StdHeaders=&Winutl_Win32StdHeaders; +} + +sub PMStartBldList($) { + my ($makecmd) = @_; + die "Cannot generate $makecmd makefiles\n" if ($makecmd ne "nmake"); + my $AifStructRef=&main::AifStructRef; + my $BaseTrg=&main::BaseTrg; + my $BitMapStructRef=&main::BitMapStructRef; + my @BldList=&main::BldList; + my @ChopSysIncPaths=&main::Path_Chop(&main::SysIncPaths); + my @ChopUserIncPaths=&main::Path_Chop(&main::UserIncPaths); + my $ExportLibrary=&main::ExportLibrary; + my $NoExportLibrary=&main::NoExportLibrary; + my $DefFile=&main::DefFile; + my $BasicTrgType=&main::BasicTrgType; + my $LibPath=&main::LibPath; + + my $MSVCVer = &Winutl_MSVCVer; + + my @MacroList=&main::MacroList(); + push @MacroList, "__SUPPORT_CPP_EXCEPTIONS__"; + + my $VariantFile=&main::VariantFile(); + my $Plat=&main::Plat; + my $ResourceStructRef=&main::ResourceStructRef; + my $Trg=&main::Trg; + my $TrgType=&main::TrgType; + my $defaultWarningLevel="/W4"; + my $CompilerOption=&main::CompilerOption("MSVC"); + my $LinkAs=&main::LinkAs; + + &Generic_Header(0,$makecmd); # define standard things using absolute paths + + my $TrgDir=""; + if (&Generic_Definition("TRGDIR") ne "") { + $TrgDir="\$(TRGDIR)\\"; + } + if (&main::Plat eq "WINC") { # target path ignored under WINC + $TrgDir=""; + } + &main::Output( + "INCDIR =" + ); + if($VariantFile){ + my $VariantFileFileName = Path_Split('FILE',$VariantFile); + &main::Output( + " /FI \"$VariantFileFileName\"", + ); + + } + + foreach (@ChopUserIncPaths,@ChopSysIncPaths) { + &main::Output( + " /I \"$_\"" + ); + } + &main::Output( + "\n", + "\n" + ); + + my $MSVCVer = &Winutl_MSVCVer; + + &main::Output( + "CLFLAGS =", + " /nologo", # suppress "sign-on" banner message + " /Zp4", # packs structures on 4 byte boundaries + " /GF" # Pools strings and places them in read-only memory + ); + + if ($MSVCVer >= 7) { + &main::Output( + " /wd4996", # C4996: 'xxxx' was declared deprecated + " /wd4571" # C4571: catch(...) blocks compiled with /EHs do not catch or re-throw Structured Exceptions + ); + + if (&main::Plat ne 'TOOLS') { + &main::Output( + " /EHsc", # Exceptions on + " /GR" # RTTI on + ); + if ($MSVCVer >= 8) { + &main::Output( + " /GS-" # Buffer checking off + ); + } + } else { + &main::Output( + " /EHsc", # Exceptions on + " /GR", # RTTI on + " /GS" # Buffer checking on + ); + } + } else { + if (&main::Plat ne 'TOOLS') { + &main::Output( + " /GX", # Exceptions on + " /GR" # RTTI on + ); + } + } + + if ($MSVCVer >= 8) { + &main::Output( + " /Zc:wchar_t-" # Don't make wchar_t a built-in; breaks mangled names + ); + } + + if (&main::Plat ne 'TOOLS') { + unless ($Win32StdHeaders) { + &main::Output( + " /X" # ignore standard include directories + ); + } + } + if ($CompilerOption !~ /\/W\d/) { + # Supply default warning level unless /Wn already specified via OPTION MSVC + &main::Output( + " $defaultWarningLevel" + ); + } + &main::Output( + " $CompilerOption", # user-supplied compiler options + "\n", + "\n" + ); + + &main::Output( + "CLDEFS =" + ); + foreach(@MacroList) { + &main::Output( + " /D \"$_\"" + ); + } + if (($BasicTrgType=~/^LIB$/o) and (&main::Plat eq 'TOOLS')) { + &main::Output( + " /D _MT" + ); + } + &main::Output( + " \$(USERDEFS)\n", + "\n" + ); + + foreach (@BldList) { + &main::Output( + "CL$_ = cl.exe" + ); + if ($BasicTrgType=~/^EXE$/o) { + &main::Output( + ' /MT' # Creates a multi-threaded executable file, using libcmt.lib + ); + if (/DEB$/o) { + &main::Output( + 'd' # i.e. /MTd or /MLd, debug executable using debug version of LIB + ); + } + } + elsif (($BasicTrgType=~/^(DLL|LIB)$/o) and (&main::Plat ne 'TOOLS')){ + &main::Output( + ' /MD' # Creates a multithreaded DLL, using MSVCRT.LIB + ); + if (/DEB$/o) { + &main::Output( + 'd' # i.e. /MDd, debug executable using debug version of LIB + ); + } + } + if (/DEB$/o) { + &main::Output( + ' /Zi', # Generates complete debugging information + ' /Od' # Disables optimization + ); +# euser change to apply inlining on the _NAKED functions + if ($BaseTrg=~/^EUSER$/oi) { + &main::Output( + ' /Ob1' # Specific control of expension of inline functions + ); + } + } + elsif (/REL$/o) { + &main::Output( + ' /O1' # Creates small code + ); + if ($MSVCVer >= 8) { + &main::Output( + ' /fp:strict' # Improves floating-point consistency + ); + } else { + &main::Output( + ' /Op' # Improves floating-point consistency + ); + } + } + &main::Output( + ' $(CLFLAGS)' + ); + if (/DEB$/o) { + &main::Output( + " /Fd\"\$(EPOCTRG$_)\\$TrgDir$BaseTrg.pdb\"" + ); + } + foreach (&main::MacroList($_)) { + &main::Output( + " /D $_" + ); + } + &main::Output( + " \$(CLDEFS) \$(INCDIR)\n" + ); + } + &main::Output( + "\n", + "\n" + ); + + foreach (@BldList) { + &main::Output( + "$_ :" + ); + if ($BasicTrgType !~ /^IMPLIB$/io) { + &main::Output ( + " \\\n", + "\t\"\$(EPOCTRG$_)\\$TrgDir$Trg\"" + ); + unless (/REL$/o) { + &main::Output( + " \\\n", + "\t\"\$(EPOCTRG$_)\\$BaseTrg.bsc\"" + ); + } + if (&Winutl_CopyForStaticLinkage) { + &main::Output( + " \\\n", + "\t\"\$(EPOCTRG$_)\\$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" + ); + } + + + foreach (@BldList) { + my $makework="MAKEWORK$_"; + &main::Output( + "\n", + "RESOURCE$_ : $makework" + ); + + my $BitMapRef; + foreach $BitMapRef (@$BitMapStructRef) { + my $file="\$(EPOCTRG$_)\\$$BitMapRef{TrgPath}$$BitMapRef{Trg}"; + &Generic_MakeWorkFile($makework,$file); + &main::Output( + " \\\n", + "\t\"$file\"" + ); + } + undef $BitMapRef; + + my $ResourceRef; + foreach $ResourceRef (@$ResourceStructRef) { + my $file="\$(EPOCTRG$_)\\$$ResourceRef{Trg}"; + &Generic_MakeWorkFile($makework,$file); + &main::Output( # must come before main target because source for target will depend on the + " \\\n", # *.rsg file in $EPOCIncPath + "\t", &Generic_Quote("$file") + ); + } + undef $ResourceRef; + + my $AifRef; + foreach $AifRef (@$AifStructRef) { + my $file="\$(EPOCTRG$_)\\$TrgDir$$AifRef{Trg}"; + &Generic_MakeWorkFile($makework,$file); + &main::Output( + " \\\n", + "\t\"$file\"" + ); + } + undef $AifRef; + + &main::Output( + "\n" + ); + } + &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 + foreach (@BldList) { + &main::Output( + " $_" + ); + } + } + elsif ($DefFile and !$NoExportLibrary) { + unless (&main::ExportUnfrozen) { + if (-e $DefFile) { # effectively "if project frozen ..." + &main::Output( + " \"\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib\"\n" + ); + } else { + &main::Output( + "\n", + "\t\@echo WARNING: Not attempting to create \"\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib\".\n", + "\t\@echo When exports are frozen in \"$DefFile\", regenerate Makefile.\n" + ); + } + } else { + &main::Output( + "\n", + "\t\@echo Not attempting to create \"\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib\"\n", + "\t\@echo from frozen .DEF file, since EXPORTUNFROZEN specified.\n" + ); + } + my $LibLinkAs = ($BasicTrgType=~/^IMPLIB$/io) ? $LinkAs : $Trg; + &main::Output( + "\n", + "\n", + "# REAL TARGET - LIBRARY\n", + "\n", + "\"\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib\" : \"$DefFile\"\n", + "\tperl -S prepdef.pl \"$DefFile\" \"\$(EPOCBLD)\\$ExportLibrary.prep.def\"\n", + "\tlib.exe /nologo /machine:i386 /nodefaultlib /name:\"$LibLinkAs\" /def:\"\$(EPOCBLD)\\$ExportLibrary.prep.def\" /out:\"\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib\"\n", + "\tdel \"\$(EPOCLIB)\\UDEB\\$ExportLibrary.exp\"\n" + ); + } + &main::Output( + "\n", + "\n", + "FREEZE :\n" + ); + if ($DefFile and $BasicTrgType !~ /^IMPLIB$/io) { + &main::Output( +# call perl on the script here so nmake will die if there are errors - this doesn't happen if calling perl in a batch file + "\tperl -S efreeze.pl \$(EFREEZE_ALLOW_REMOVE) \"$DefFile\" \"\$(EPOCBLD)\\$ExportLibrary.def\" \n" + ); + } + &main::Output( + "\n", + "CLEANLIBRARY :\n" + ); + if ($DefFile and !$NoExportLibrary) { + &main::Output( + "\t-\$(ERASE) \"\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib\"\n" + ); + } + &Generic_MakeWorkDir('MAKEWORKLIBRARY',"${LibPath}UDEB"); + + &Generic_Releaseables; +} + +sub PMBld { + + my $AifStructRef=&main::AifStructRef; + my @SrcList=&main::SrcList; + my $BaseTrg=&main::BaseTrg; + my $BitMapStructRef=&main::BitMapStructRef; + my $Bld=&main::Bld; + my $ExportLibrary=&main::ExportLibrary; + my $NoExportLibrary=&main::NoExportLibrary; + my $DefFile=&main::DefFile; + my $EPOCIncPath=&main::EPOCIncPath; + my $FirstLib=&main::FirstLib; + my $BasicTrgType=&main::BasicTrgType; + my @LibList; + my $RelPath=&main::RelPath; + my $ResourceStructRef=&main::ResourceStructRef; + my @StatLibList=&main::StatLibList; + my $Trg=&main::Trg; + my $TrgPath=&main::TrgPath; + my $TrgType=&main::TrgType; + my $MSVCVer = &Winutl_MSVCVer; + my $newlib = main::NewLib(); # Check if newlib has been set in the MMP file. + + + my $NewLib = 'scppnwdl.lib'; # This is where operator new and operator delete + # are defined for user side targets. + + my $NewKernLib = 'scppnwdl_kern.lib'; # This is where operator new and operator delete + # are defined for kernel side targets. + + + + my $WarningLevel='/WARN:3'; + if (&main::Plat() eq 'TOOLS') { + $WarningLevel='/WARN:1'; # avoid LNK4005 warnings about unused libraries + } + + if ($Bld =~ /DEB/) { + @LibList=&main::DebugLibList; + } else { + @LibList=&main::LibList; + } + + my $BLDTRGPATH = "\$(EPOCTRG$Bld)\\"; + my $BLDDATAPATH = "\$(EPOCTRG$Bld)\\"; + if (&main::Plat ne "WINC") { # target paths ignored under WINC + if (&Generic_Definition("TRGDIR") ne "") { + $BLDTRGPATH .= "\$(TRGDIR)\\"; # handles TARGETPATH + } + $BLDDATAPATH .= "\$(DATADIR)\\"; + } + + my $Entry=""; + my $EntrySymbol=''; + my $Include=""; + if ($BasicTrgType=~/^DLL$/o) { + $Entry="/noentry"; + $Include="/include:\"__E32Dll\""; + $EntrySymbol='_E32Dll'; + } + elsif ($TrgType=~/^EXEXP$/o) { + $Entry="/noentry"; + $Include="/include:\"__E32Startup\""; + $EntrySymbol='_E32Startup'; + } + elsif ($BasicTrgType=~/^EXE$/o) { + unless (&main::Plat eq 'TOOLS') { + $Entry="/entry:\"_E32Bootstrap\""; + $Include="/include:\"__E32Startup\""; + } + } + my $AbsentSubst = ''; + if ($EntrySymbol) { + $AbsentSubst = " -absent $EntrySymbol"; + } + + # REAL TARGETS + #------------- + &main::Output( + "# REAL TARGET - BUILD VARIANT $Bld\n", + "\n" + ); + +# releasables + my @releaseables; + + unless (&main::Plat() eq 'TOOLS') { + if ($BasicTrgType !~ /^IMPLIB$/io) { + push @releaseables, "$BLDTRGPATH$Trg"; + if (&Winutl_CopyForStaticLinkage) { + push @releaseables, "\$(EPOCTRG$Bld)\\$Trg"; + } + my $BitMapRef; + foreach $BitMapRef (@$BitMapStructRef) { + push @releaseables, "\$(EPOCTRG$Bld)\\$$BitMapRef{TrgPath}$$BitMapRef{Trg}"; + } + my $ResourceRef; + foreach $ResourceRef (@$ResourceStructRef) { + push @releaseables, "\$(EPOCTRG$Bld)\\$$ResourceRef{Trg}"; + } + my $AifRef; + foreach $AifRef (@$AifStructRef) { + push @releaseables, "$BLDTRGPATH$$AifRef{Trg}"; + } + if ($Bld=~/DEB$/o) { + push @releaseables,"$BLDTRGPATH$BaseTrg.PDB"; + } + } + if (-e $DefFile and !$NoExportLibrary) { # effectively "if project frozen ..." + push @releaseables, "\$(EPOCLIB$Bld)\\$ExportLibrary.lib"; + } + } + else { + my $toolspath=&main::EPOCToolsPath(); + push @releaseables, "$toolspath$Trg"; + } + + &main::Output( + "WHAT$Bld : WHATGENERIC\n", + "\n", + "CLEAN$Bld : CLEANBUILD$Bld CLEANRELEASE$Bld\n", + "\n", + "CLEANBUILD$Bld : CLEANILK$Bld\n", + "\t\@perl -S ermdir.pl \"\$(EPOCBLD$Bld)\"\n", + "\n", + "CLEANRELEASE$Bld : CLEANGENERIC CLEANILK$Bld\n", + "\n", + "CLEANILK$Bld :\n", + "\t-\$(ERASE) \"$BLDTRGPATH$BaseTrg.ILK\"\n", + "\n" + ); + &Generic_WhatCleanTargets($Bld, "WHAT$Bld", "CLEANRELEASE$Bld", @releaseables); + + &Generic_MakeWorkDir("MAKEWORK$Bld", &main::BldPath); + &Generic_MakeWorkDir("MAKEWORK$Bld", $BLDTRGPATH); + + 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', $_); + $BaseSrc.='_' if (lc($Ext) eq '.cia'); + &main::Output( + " \\\n\tLISTING$Bld$BaseSrc" + ); + } + &main::Output( + "\n", + "\n" + ); + + if ($Bld=~/DEB$/o) { + &main::Output( + "BSC32_SBRS=" + ); + foreach (@SrcList) { + my $BaseSrc = &main::Path_Split('Base', $_); + my $Ext = &main::Path_Split('Ext', $_); + $BaseSrc.='_' if (lc($Ext) eq '.cia'); + &main::Output( + " \\\n", + "\t\"\$(EPOCBLD$Bld)\\$BaseSrc.sbr\"" + ); + } + &main::Output( + "\n", + "\n", + "\"\$(EPOCTRG$Bld)\\$BaseTrg.bsc\" : \$(BSC32_SBRS)\n", + "\tbscmake.exe \@<<\n", + "\t/nologo /o\$\@ \$(BSC32_SBRS)\n", + "<<\n", + "\n", + "\n" + ); + } + + &main::Output( + "LIBS=" + ); + foreach (@StatLibList) { + &main::Output( + " \\\n\t\"\$(EPOCSTATLINK$Bld)\\$_\"" + ); + } + foreach (@LibList) { + &main::Output( + " \\\n\t\"\$(EPOCLINK$Bld)\\$_\"" + ); + } + &main::Output( + "\n", + "\n" + ); + + &main::Output( + "LINK_OBJS=" + ); + foreach (@SrcList) { + my $BaseSrc = &main::Path_Split('Base', $_); + my $Ext = &main::Path_Split('Ext', $_); + $BaseSrc.='_' if (lc($Ext) eq '.cia'); + &main::Output( + " \\\n", + "\t\"\$(EPOCBLD$Bld)\\$BaseSrc.obj\"" + ); + } + if ($Win32Resrc) { + &main::Output( + " \\\n", + "\t\"\$(EPOCBLD$Bld)\\",&main::Path_Split('Base',$Win32Resrc),".res\"" + ); + } + &main::Output( + "\n", + "\n" + ); + + if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o) { + &main::OutFormat( + "STAGE1_LINK_FLAGS=" + ); + &main::OutFormat( + "\"\$(EPOCSTATLINK$Bld)\\$FirstLib\"" + ); + + if (main::StdCppSupport()) + { + unless ($newlib) { + if ( main::SystemTrg() ) { + # System targets are PDD, LDD, VAR, KEXT and KDLL. + &main::OutFormat( + "\"\$(EPOCSTATLINK$Bld)\\$NewKernLib\"" + ); + } + else { + &main::OutFormat( + "\"\$(EPOCSTATLINK$Bld)\\$NewLib\"" + ); + } + } + else { + &main::OutFormat( + "\"\$(EPOCSTATLINK$Bld)\\$newlib\"" + ); + } + } + + foreach (@Win32LibList) { + &main::OutFormat( + ' ',lc $_ + ); + } + &main::OutFormat( + " \$(LIBS) /nologo$BaseAddressFlag $Entry /subsystem:windows /dll" + ); + if ($Bld=~/DEB$/o) { + &main::OutFormat( + ' /debug' + ); + } + &main::OutFormat( + " /incremental:no /machine:IX86" + ); + + if ($BasicTrgType=~/^EXE$/o) { + my $debug = ''; + if ($Bld =~ /DEB$/o) { + $debug .= 'd'; + } + &main::OutFormat( + " /nodefaultlib:libcmt$debug.lib" + ); + } + &main::OutFormat( + " $Include /out:\"\$(EPOCBLD$Bld)\\$Trg\"" + ); + + if ($MSVCVer < 7) { + &main::OutFormat( + " $WarningLevel" + ); + } + &main::OutFormat( + " /implib:\"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"", + ' /ignore:4089', # LNK4089: all references to "dynamic-link library" discarded by /OPT:REF + ' /ignore:4005' # LNK4005: no objects used from XXX + ); + if ($MSVCVer >= 7) { + &main::OutFormat( + ' /ignore:4210' # LNK4210: .CRT section exists; there may be unhandled static initializers or terminators + ); + } + + + &main::Output( + "\n", + "\n" + ); + } + + &main::OutFormat( + 'LINK_FLAGS=' + ); + if ($BasicTrgType=~/^(EXE|DLL)$/o) { + unless (&main::Plat eq 'TOOLS') { + &main::OutFormat( + " \"\$(EPOCSTATLINK$Bld)\\$FirstLib\"" + ); + + if (main::StdCppSupport()) + { + unless ($newlib) { + if ( main::SystemTrg() ) { + # System targets are PDD, LDD, VAR, KEXT and KDLL. + + &main::OutFormat( + "\"\$(EPOCSTATLINK$Bld)\\$NewKernLib\"" + ); + } + else { + &main::OutFormat( + "\"\$(EPOCSTATLINK$Bld)\\$NewLib\"" + ); + } + } + else { + &main::OutFormat( + "\"\$(EPOCSTATLINK$Bld)\\$newlib\"" + ); + } + } + } + } + foreach (@Win32LibList) { + &main::OutFormat( + ' ',lc $_ + ); + } + &main::OutFormat( + ' $(LIBS) /nologo' + ); + if ($BasicTrgType=~/^(EXE|DLL)$/o) { + unless (&main::Plat eq 'TOOLS') { + &main::OutFormat( + " /fixed:no $BaseAddressFlag" + ); + } + } + &main::OutFormat( + " $Entry" + ); + if (&main::Plat=~/^(WINC|TOOLS)$/o && $BasicTrgType=~/^EXE$/o) { + &main::OutFormat( + ' /subsystem:console' + ); + } + else { + &main::OutFormat( + ' /subsystem:windows' + ); + } + if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o) { + &main::OutFormat( + " /dll \"\$(EPOCBLD$Bld)\\$ExportLibrary.exp\"" + ); + } + if (&main::HeapSize) { + my %HeapSize=&main::HeapSize; + &main::OutFormat( + ' /heap:',$HeapSize{Max},',',$HeapSize{Min} + ); + } + if ($BasicTrgType=~/^(DLL|EXE)$/o) { + if ($Bld=~/DEB$/o) { + &main::OutFormat( + ' /debug' + ); + } + elsif ($Bld=~/REL$/o) { + &main::OutFormat( + ' /incremental:no' + ); + } + } + &main::OutFormat( + ' /machine:IX86', + ' /ignore:4089', # LNK4089: all references to "dynamic-link library" discarded by /OPT:REF + ' /ignore:4005' # LNK4005: no objects used from XXX + ); + if ($MSVCVer >= 7) { + &main::OutFormat( + ' /ignore:4210' # LNK4210: .CRT section exists; there may be unhandled static initializers or terminators + ); + } + if (&main::Plat eq 'TOOLS') { + if (length(&main::LinkerOption("MSVC")) > 0) + { + &main::OutFormat( " " . &main::LinkerOption("MSVC")); + } else { + &main::OutFormat( + ' /ignore:4098' # LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library + ); + } + } + else + { + if ($BasicTrgType=~/^EXE$/o) { + my $debug = ''; + if ($Bld =~ /DEB$/o) { + $debug .= 'd'; + } + &main::OutFormat( + " /nodefaultlib:libcmt$debug.lib" + ); + } + &main::OutFormat( + " $Include" + ); + } + &main::OutFormat( + " /out:\"$BLDTRGPATH$Trg\"" + ); + if ($BasicTrgType=~/^(DLL)$/o) { + if ($MSVCVer < 7) { + &main::OutFormat( + " $WarningLevel" + ); + } + &main::OutFormat( + " /implib:\"$BLDTRGPATH$ExportLibrary.lib\"" + ); + } elsif ($BasicTrgType=~/^(EXE)$/o) { + if ($MSVCVer < 7) { + &main::OutFormat( + " $WarningLevel" + ); + } + &main::OutFormat( + " /implib:\"$BLDTRGPATH$ExportLibrary.exe.lib\"" + ); + } + &main::Output( + "\n", + "\n" + ); + + &main::Output( + "\"$BLDTRGPATH$Trg\" : \$(LINK_OBJS)" + ); + if (-e $DefFile) { # effectively "if project frozen ..." + &main::Output( + " \"$DefFile\"" + ); + } + if ($BasicTrgType=~/^(DLL|EXE)$/o) { + unless (&main::Plat eq 'TOOLS') { + &main::Output( + " \"\$(EPOCSTATLINK$Bld)\\$FirstLib\"" + ); + + if (main::StdCppSupport()) + { + unless ($newlib) { + if ( main::SystemTrg() ) { + # System targets are PDD, LDD, VAR, KEXT and KDLL. + + &main::Output( + "\"\$(EPOCSTATLINK$Bld)\\$NewKernLib\"" + ); + } + else { + &main::Output( + "\"\$(EPOCSTATLINK$Bld)\\$NewLib\"" + ); + } + } + else { + &main::Output( + "\"\$(EPOCSTATLINK$Bld)\\$newlib\"" + ); + } + } + } + } + &main::Output( + " \$(LIBS)\n" + ); + + +# Link by name first time round for dlls + if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o) { + &main::Output( + "\tlink.exe \@<<\n", + "\t\t\$(STAGE1_LINK_FLAGS) \$(LINK_OBJS)\n", + "<<\n", + "\tdel \"\$(EPOCBLD$Bld)\\$Trg\"\n", + "\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.exp\"\n" + ); + +# Generate an export info file + &main::Output( + "\tdumpbin /exports /out:\"\$(EPOCBLD$Bld)\\$ExportLibrary.inf\" \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"\n", + "\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"\n" + ); + +# call makedef to reorder the export information + &main::Output( +# call perl on the script here so nmake will die if there are errors - this doesn't happen if calling perl in a batch file + "\tperl -S makedef.pl $AbsentSubst -Inffile \"\$(EPOCBLD$Bld)\\$ExportLibrary.inf\"" + ); + if (SysTrg()) { + &main::Output( "\t\t-SystemTargetType \\\n" ); + } + if (-e $DefFile) { # effectively "if project frozen ..." + &main::Output( + " -Frzfile \"$DefFile\"" + ); + } + # freeze ordinals, a maximum of 2, for polymorphic dlls + my $Ordinal; + my $Num=1; + foreach $Ordinal (&main::Exports) { +# replace "$" with "$$" so that NMAKE doesn't think there's a macro in the function name + $Ordinal=~s-\$-\$\$-go; + &main::Output( + " -$Num $Ordinal" + ); + $Num++; + } + &main::Output( + " \"\$(EPOCBLD)\\$ExportLibrary.def\" \n", + "\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.inf\"\n" + ); + + # create the export object from the .DEF file + &main::Output( + "\tlib.exe /nologo /machine:i386 /nodefaultlib /name:\"$Trg\" /def:\"\$(EPOCBLD)\\$ExportLibrary.def\" /out:\"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"\n" + ); + if (&main::ExportUnfrozen) { + &main::Output( + "\tcopy \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\" \"\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib\"\n" + ); + } + &main::Output( + "\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"\n" + ); + } + + if ($BasicTrgType=~/^(DLL|EXE)$/o) { + &main::Output( + "\tlink.exe \@<<\n" + ); + } + elsif ($BasicTrgType=~/^LIB$/o) { + &main::Output( + "\tlib.exe \@<<\n" + ); + } + &main::Output( + "\t\t\$(LINK_FLAGS) \$(LINK_OBJS)\n", + "<<\n" + ); + + if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o) { + &main::Output( + "\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.exp\"\n" + ); + } + + if (&main::Plat eq 'TOOLS') { + &main::Output( + "\tcopy \"$BLDTRGPATH$Trg\" \"",&main::EPOCToolsPath,"$Trg\"\n" + ); + } + if (&Winutl_CopyForStaticLinkage) { + &Generic_MakeWorkDir("MAKEWORK$Bld", "\$(EPOCTRG$Bld)"); + &main::Output( + "\n", + "\"\$(EPOCTRG$Bld)\\$Trg\" : \"$BLDTRGPATH$Trg\"\n", + "\tcopy \$\? \$\@\n" + ); + } + + &main::Output( + "\n", + "\n" + ); +} + +sub PMStartSrcList { + + &main::Output( + "# SOURCES\n", + "\n" + ); +} + +sub PMBitMapBld { + + &Generic_BitMapBld; + + # Need to copy generic resource into emulated Z drive + + my $BitMapRef=&main::BitMapRef; + + my $ChopTrgPath=""; + if ($$BitMapRef{TrgPath}) { + $ChopTrgPath.="\\$$BitMapRef{TrgPath}"; + chop $ChopTrgPath; + } + + my @BldList=&main::BldList; + my $Bld; + foreach $Bld (@BldList) { + my $path="\$(EPOCTRG$Bld)$ChopTrgPath"; + &main::Output( + &Generic_Quote("$path\\$$BitMapRef{Trg}"), " : ", + &Generic_Quote("$$BitMapRef{GenericTrg}"), "\n", + "\t", &Generic_CopyAction(), + "\n" + ); + } +} + + +sub PMResrcBld { + + &Generic_ResrcBld; + + # Need to copy generic resource into emulated Z drive + + my $ResourceRef=&main::ResourceRef; + my @BldList=&main::BldList; + + foreach my $Bld (@BldList) { + &main::Output( + &Generic_Quote("\$(EPOCTRG$Bld)\\$$ResourceRef{Trg}"), " : ", + &Generic_Quote("$$ResourceRef{GenericTrg}"), "\n", + "\t", &Generic_CopyAction(), + "\n" + ); + } +} + +sub PMAifBld { + + &Generic_AifBld; + + # Need to copy generic resource into emulated Z drive + + my $AifRef=&main::AifRef; + my $TrgDir=""; + if (&Generic_Definition("TRGDIR") ne "") { + $TrgDir="\\\$(TRGDIR)"; + } + if (&main::Plat eq "WINC") { # target path ignored under WINC + $TrgDir=""; + } + + my @BldList=&main::BldList; + my $Bld; + foreach $Bld (@BldList) { + my $file="\$(EPOCTRG$Bld)$TrgDir\\$$AifRef{Trg}"; + &main::Output( + "\"$file\" : \"$$AifRef{GenericTrg}\"\n", + "\tperl -S ecopyfile.pl \$? \$\@\n", + "\n" + ); + } +} + +sub PMStartSrc { + my $Src=&main::Src; + + &main::Output( + "# Source $Src\n", + "\n" + ); +} + +sub PMSrcDepend { + my @BldList=&main::BldList; + my @DepList=&main::DepList; + + &main::Output( + "DEPEND=" + ); + foreach (@DepList) { + &main::Output( + " \\\n\t\"$_\"" + ); + } + &main::Output( + "\n", + "\n" + ); + foreach (@BldList) { + &main::Output( + "DEPEND$_=\$(DEPEND)\n", + "\n" + ); + } + &main::Output( + "\n" + ); +} + +sub PMSrcBldDepend { + my $Bld=&main::Bld; + my @DepList=&main::DepList; + + &main::Output( + "DEPEND$Bld=" + ); + foreach (@DepList) { + &main::Output( + " \\\n\t\"$_\"" + ); + } + &main::Output( + "\n", + "\n" + ); +} + +sub PMEndSrcBld { + my $BaseSrc=&main::BaseSrc; + my $Bld=&main::Bld; + my $Plat=&main::Plat; + my $Src=ucfirst lc &main::Src; + my $SrcPath=&main::SrcPath; + my $Ext=&main::ExtSrc; + my $Cia = (lc($Ext) eq '.cia') ? 1 : 0; + + if ($Cia) { + &main::Output( + "\"\$(EPOCBLD$Bld)\\$BaseSrc\_.obj\" \"\$(EPOCBLD$Bld)\\$BaseSrc\_.sbr\" : \"$SrcPath$Src\" \$(DEPEND$Bld)\n", + "\t\$(CL$Bld) /TP /Fo\"\$(EPOCBLD$Bld)\\$BaseSrc\_.obj\" /FR\"\$(EPOCBLD$Bld)\\$BaseSrc\_.sbr\" /c \"$SrcPath$Src\"\n", + "\n", +# assembler listing target + "LISTING$Bld$BaseSrc\_ : \"\$(EPOCBLD$Bld)\\$BaseSrc\_.lis\"\n", + "\tcopy \$? \"$SrcPath$BaseSrc\_.$Plat.lst\"\n", + "\n", + "\"\$(EPOCBLD$Bld)\\$BaseSrc\_.lis\": \"$SrcPath$Src\" \$(DEPEND$Bld)\n", + "\t\$(CL$Bld) /TP /Fa\"\$\@\" /Fo\"\$(EPOCBLD$Bld)\\$BaseSrc\_.obj\" /FR\"\$(EPOCBLD$Bld)\\$BaseSrc\_.sbr\" /c \"$SrcPath$Src\"\n", + "\n" + ); + } else { + &main::Output( + "\"\$(EPOCBLD$Bld)\\$BaseSrc.obj\" \"\$(EPOCBLD$Bld)\\$BaseSrc.sbr\" : \"$SrcPath$Src\" \$(DEPEND$Bld)\n", + "\t\$(CL$Bld) /Fo\"\$(EPOCBLD$Bld)/\" /FR\"\$(EPOCBLD$Bld)\\$BaseSrc.sbr\" /c \"$SrcPath$Src\"\n", + "\n", +# assembler listing target + "LISTING$Bld$BaseSrc : \"\$(EPOCBLD$Bld)\\$BaseSrc.lis\"\n", + "\tcopy \$? \"$SrcPath$BaseSrc.$Plat.lst\"\n", + "\n", + "\"\$(EPOCBLD$Bld)\\$BaseSrc.lis\": \"$SrcPath$Src\" \$(DEPEND$Bld)\n", + "\t\$(CL$Bld) /Fa\"\$\@\" /Fo\"\$(EPOCBLD$Bld)/\" /FR\"\$(EPOCBLD$Bld)\\$BaseSrc\_.sbr\" /c \"$SrcPath$Src\"\n", + "\n" + ); + } +} + +sub PMEndSrc { + + &main::Output( + "\n", + "\n" + ); +} + +sub PMEndSrcList { + if ($Win32Resrc) { + my @BldList=&main::BldList; + my @DepList=&main::Deps_GenDependsL($Win32Resrc); + + &main::Output( + "# Win32 Resource $Win32Resrc\n", + "\n", + "DEPEND=" + ); + foreach (@DepList) { + &main::Output( + " \\\n\t\"$_\"" + ); + } + &main::Output( + "\n", + "\n" + ); + + my $Bld; + foreach $Bld (@BldList) { + &main::Output( + "\"\$(EPOCBLD$Bld)\\",&main::Path_Split('Base',$Win32Resrc),".res\" : \"$Win32Resrc\" \$(DEPEND)\n", + "\trc /l 0x809 /fo\$\@ /i \"",&main::Path_Chop(&main::Path_Split('Path',$Win32Resrc)),"\" \"$Win32Resrc\"\n", + "\n" + ); + } + &main::Output( + "\n", + "\n" + ); + } + + # Deal with accumulated MAKEDIRS etc. + + &Generic_End; +} + +1;