diff -r 000000000000 -r 83f4b4db085c sbsv1_os/e32toolp/platform/cl_tools.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sbsv1_os/e32toolp/platform/cl_tools.pm Tue Feb 02 01:39:43 2010 +0200 @@ -0,0 +1,570 @@ +# Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# + +package Cl_tools; + +# declare variables global for module +my @Win32LibList=(); +my $BaseAddressFlag; +my $Win32Resrc; + +my $MWCC; +my $MWLD; + +require Exporter; +@ISA=qw(Exporter); +@EXPORT=qw( + PMHelp_Mmp + PMCheckPlatformL + PMPlatProcessMmp + PMStartBldList + PMBld + PMStartSrcList + PMStartSrc + PMSrcDepend + PMSrcBldDepend + PMEndSrcBld + PMEndSrc + PMEndSrcList +); + +use strict; +use Winutl; +use cl_generic; + +sub PMHelp_Mmp { + &Winutl_Help_Mmp; +} + +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{MWCSym2Includes}); + $BaseAddressFlag=&Winutl_BaseAddress; + if ($BaseAddressFlag ne "") { + $BaseAddressFlag=" -imagebase \"$BaseAddressFlag\""; + } + @Win32LibList=&Winutl_Win32LibList; + $Win32Resrc=&Winutl_Win32Resrc; +} + +sub PMStartBldList($) { + my ($makecmd) = @_; + my $BaseTrg=&main::BaseTrg; + my @BldList=&main::BldList; + my @ChopSysIncPaths=&main::Path_Chop(&main::SysIncPaths); + my @ChopUserIncPaths=&main::Path_Chop(&main::UserIncPaths); + my $DefFile=&main::DefFile; + my $BasicTrgType=&main::BasicTrgType; + my $LibPath=&main::LibPath; + my @MacroList=&main::MacroList(); + my $VariantFile=&main::VariantFile(); + my $Plat=&main::Plat; + my $Trg=&main::Trg; + my $TrgType=&main::TrgType; + my $WarningLevel=&main::CompilerOption("CW"); + + # check version of CodeWarrior for Symbian OS + if (defined($ENV{MWSym2Libraries})) { + my $allthere=1; + foreach (split/;/,$ENV{MWSym2Libraries}) { + s/^\+//; # remove leading "+", if any + if (!-d $_) { + $allthere=0; + last; + } + } + if ($allthere) { + $MWCC = "mwccsym2.exe"; + $MWLD = "mwldsym2.exe"; + print "Detected CodeWarrior for Symbian OS, version 2.0\n"; + } + } + if (!defined($MWCC)) { + if (defined($ENV{CWFolder}) && -d $ENV{CWFolder}) { + $MWCC = "mwcc.exe"; + $MWLD = "mwld.exe"; + print "Detected CodeWarrior for Symbian OS, version 1.0\n"; + die "ERROR: This version of CodeWarrior is not suitable for Symbian OS version 8\n"; + } + else { + die "ERROR: Unable to identify a valid CodeWarrior for Symbian OS installation\n"; + } + } + + Generic_Header(0,$makecmd); # define standard things using absolute paths + + my $TrgDir=""; + if (&Generic_Definition("TRGDIR") ne "") { + $TrgDir="\$(TRGDIR)\\"; + } + +# Change - winutl.pm checks MWCWinx86Includes, but mwccsym2.exe seems to use MWCIncludes + if ($MWCC eq "mwccsym2.exe" && !defined($ENV{MWCIncludes})) { + &main::Output( + "\n", + "MWCIncludes:=\$(MWCSym2Includes)\n", + "export MWCIncludes\n", + "\n" + ); + } + + &main::Output( + "# EPOC DEFINITIONS\n", + "\n", + "INCDIR = -cwd source -i-" + ); + foreach (@ChopUserIncPaths,@ChopSysIncPaths) { + &main::Output( + " \\\n -i \"$_\"" + ); + } + use Pathutl; + if($VariantFile){ + my $variantFilePath = Path_Split('Path',$VariantFile); + $VariantFile = Path_Split('FILE',$VariantFile); + # workaround for codewarrior defect: + # codewarrior at the moment doesn't accept an absolute path with the + # the -include option unless it contains a drive letter, this is solved + # by including the directory and the file separately + &main::Output("\\\n -i \"$variantFilePath\" -include \"$VariantFile\""); + } + &main::Output( + "\n", + "\n" + ); + + &main::Output( + "CWFLAGS =", + " -wchar_t off", # do not treat wchar_t as a predefined type + " -align 4", # long alignment + " -warnings on", # selection of warnings + " -w nohidevirtual", # turn off "hides inherited virtual function" warning + ",nounusedexpr", # turn off "expression has no side effect" warning + " -msgstyle gcc", # use GCC-style message format + # " -strict on", # strict ANSI/ISO C++ checking + " -enum int", # use int for enumeration types + " -str pool", # pool strings into a single data object + " $WarningLevel" + + ); + + &main::Output( + " -stdinc" # insist because mwccsym2 has -nostdinc as the default(?) + ); + + &main::Output( + "\n", + "\n" + ); + + &main::Output( + "CWDEFS = " + ); + foreach(@MacroList) { + &main::Output( + " -d \"$_\"" + ); + } + &main::Output( + " \$(USERDEFS)\n", + "\n" + ); + + foreach (@BldList) { + &main::Output( + "CW$_ = $MWCC" + ); + if (/DEB$/o) { + &main::Output( + ' -g -O0' # debug information, no optimisation + ); + } + elsif (/REL$/o) { + &main::Output( + ' -O4,s' # highest level of optimisation, optimise for space + ); + } + &main::Output( + ' $(CWFLAGS)' + ); + foreach (&main::MacroList($_)) { + &main::Output( + " -d $_" + ); + } + &main::Output( + " \$(CWDEFS) \$(INCDIR)\n" + ); + } + &main::Output( + "\n", + "\n" + ); + + foreach (@BldList) { + &main::Output( + "$_ :" + ); + + &main::Output ( + " \\\n", + "\t", &Generic_Quote("\$(EPOCTRG$_)\\$TrgDir$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" + ); + } + + &main::Output( + "LIBRARY : MAKEWORKLIBRARY", + "\n" + ); + &main::Output( + "\n", + "FREEZE :\n" + ); + &main::Output( + "\n", + "CLEANLIBRARY :\n" + ); + &Generic_MakeWorkDir('MAKEWORKLIBRARY',"${LibPath}UDEB"); + + &Generic_Releaseables; +} + +my $uidfile; +sub PMBld { + + my @SrcList=&main::SrcList; + my $BaseTrg=&main::BaseTrg; + 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 $RelPath=&main::RelPath; + my $Trg=&main::Trg; + my $TrgPath=&main::TrgPath; + my $TrgType=&main::TrgType; + + $uidfile = "$BaseTrg.UID"; + + if ($Bld =~ /DEB/) { + @LibList=&main::DebugLibList; + } else { + @LibList=&main::LibList; + } + + my $BLDTRGPATH = "\$(EPOCTRG$Bld)\\"; + if ($TrgPath) { + $BLDTRGPATH .= "\$(TRGDIR)\\"; # handles TARGETPATH + } + + +# releasables + my @releaseables; + + 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 : \n", + "\t\@perl -w -S ermdir.pl \"\$(EPOCBLD$Bld)\"\n", + "\n", + "CLEANRELEASE$Bld : CLEANGENERIC\n", + "\n" + ); + + &Generic_WhatCleanTargets($Bld, "WHAT$Bld", "CLEANRELEASE$Bld", @releaseables); + &Generic_MakeWorkDir("MAKEWORK$Bld", &main::BldPath); + &Generic_MakeWorkDir("MAKEWORK$Bld", "$RelPath$TrgPath"); + + &main::Output( + "\n", + "\n" + ); + + &main::Output( + "LISTING$Bld : MAKEWORK$Bld" + ); + foreach (@SrcList) { + my $BaseSrc = &main::Path_Split('Base', $_); + my $Ext = &main::Path_Split('Ext', $_); + $BaseSrc = "uid" if ($BaseSrc eq $uidfile); + + &main::Output( + " \\\n\tLISTING$Bld$BaseSrc" + ); + } + &main::Output( + "\n", + "\n" + ); + + &main::Output( + "LIBS$Bld=" + ); + + foreach (@LibList) { + &main::Output( + " \\\n\t", &Generic_Quote("\$(EPOCLINK$Bld)\\$_") + ); + } + &main::Output( + "\n", + "\n" + ); + + &main::Output( + "LINK_OBJS$Bld=" + ); + my $have_uidfile = 0; + foreach (@SrcList) { + my $BaseSrc = &main::Path_Split('Base', $_); + my $Ext = &main::Path_Split('Ext', $_); + if ($BaseSrc eq $uidfile) { + $have_uidfile = 1; + next; + } + &main::Output( + " \\\n", + "\t", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o") + ); + } + + if ($have_uidfile) { + # ensure that the uid file is at the end of the list, as it's implicit in + # CodeWarrior IDE projects. + &main::Output( + " \\\n", + "\t", &Generic_Quote("\$(EPOCBLD$Bld)\\uid.o") + ); + } + &main::Output( + "\n", + "\n" + ); + + &main::OutFormat( + "COMMON_LINK_FLAGS$Bld=", + ' -msgstyle gcc', + ' -stdlib' # use default runtime library for compiler help functions + ); + if ($MWLD eq "mwcc.exe") { + &main::OutFormat( + ' -warnings on' # on by default in mwccsym2.exe + ); + } + + &main::OutFormat( + ' -subsystem console' + ); + + if ($Bld=~/DEB$/o) { + &main::OutFormat( + ' -g' + ); + } + + &main::Output( + "\n", + "\n" + ); + + &main::Output( + "LINK_FLAGS$Bld= \$(COMMON_LINK_FLAGS$Bld) \$(LIBS$Bld) \\\n\t", + " -o \"$BLDTRGPATH$Trg\"" + ); + + &main::Output( + ' -noimplib' + ); + + &main::Output( + "\n", + "\n" + ); + + &main::Output( + &Generic_Quote("$BLDTRGPATH$Trg"), " : \$(LINK_OBJS$Bld) " + ); + if (-e $DefFile) { # effectively "if project frozen ..." + &main::Output( + &Generic_Quote($DefFile) + ); + } + + &main::Output( + " \$(LIBS$Bld)\n" + ); + +# Perform the final link step + &main::Output( + "\t$MWLD " + ); + + &main::Output( + "\$(LINK_FLAGS$Bld) \$(LINK_OBJS$Bld)\n", + ); + + &main::Output( + "\tcopy \"$BLDTRGPATH$Trg\" \"",&main::EPOCToolsPath,"$Trg\"\n" + ); + + &main::Output( + "\n", + "\n" + ); +} + +sub PMStartSrcList { + + &main::Output( + "# SOURCES\n", + "\n" + ); +} + + +sub PMStartSrc { + my $Src=&main::Src; + + &main::Output( + "# Source $Src\n", + "\n" + ); +} + +sub PMSrcDepend { + my @BldList=&main::BldList; + my @DepList=&main::DepList; + my $BaseSrc=&main::BaseSrc; + $BaseSrc = "uid" if ($BaseSrc eq $uidfile); + + return if (@DepList == 0); + + foreach (@BldList) { + &main::Output( + &Generic_Quote("\$(EPOCBLD$_)\\$BaseSrc.o"), " \\\n", + ); + } + &main::Output( + ":" + ); + foreach (@DepList) { + &main::Output( + " \\\n\t", &Generic_Quote($_) + ); + } + &main::Output( + "\n", + "\n" + ); +} + +sub PMSrcBldDepend { + my $Bld=&main::Bld; + my @DepList=&main::DepList; + my $BaseSrc=&main::BaseSrc; + $BaseSrc = "uid" if ($BaseSrc eq $uidfile); + + return if (@DepList == 0); + + &main::Output( + &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o"), " :", + ); + foreach (@DepList) { + &main::Output( + " \\\n\t", &Generic_Quote($_) + ); + } + &main::Output( + "\n", + "\n" + ); +} + +sub PMEndSrcBld { + my $BaseSrc=&main::BaseSrc; + $BaseSrc = "uid" if ($BaseSrc eq $uidfile); + my $Bld=&main::Bld; + my $Plat=&main::Plat; + my $Src=&main::Src; + my $SrcPath=&main::SrcPath; + + &main::Output( + &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o"), " : ", + &Generic_Quote("$SrcPath$Src"), "\n", + "\t\$(CW$Bld) -o \"\$\@\" -c \"$SrcPath$Src\"\n", + "\n", +# assembler listing target - uses implicit rule to do disassembly + "LISTING$Bld$BaseSrc : ", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), "\n", + "\t", &Generic_CopyAction("$SrcPath$BaseSrc.$Plat.lst"), + "\n" + ); +} + +sub PMEndSrc { + + &main::Output( + "\n", + "\n" + ); +} + +sub PMEndSrcList { + + my $show_options = "source"; + $show_options = "source,unmangled,comments" if ($MWLD eq "mwldsym2.exe"); + + &main::Output( + "\n", + "# Implicit rule for generating .lis files\n", + "\n", + ".SUFFIXES : .lis .o\n", + "\n", + ".o.lis:\n", + "\t$MWLD -S -show $show_options \$< -o \$\@\n", + "\n", + "\n" + ); + + # Deal with accumulated MAKEDIRS etc. + + &Generic_End; +} + +1;