sbsv1_os/e32toolp/platform/cl_codewarrior.pm
changeset 0 83f4b4db085c
child 1 d4b442d23379
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1_os/e32toolp/platform/cl_codewarrior.pm	Tue Feb 02 01:39:43 2010 +0200
@@ -0,0 +1,1498 @@
+# Copyright (c) 2001-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_codewarrior;
+
+# declare variables global for module
+my @Win32LibList=();
+my $Win32StdHeaders;
+my $BaseAddressFlag;
+my $Win32Resrc;
+
+my $MWCC;
+my $MWLD;
+my $MWIncludePath;
+my $MWIncludeVar;
+my $CWVersion;
+my $CWVersionReadable;
+my $CWBuildNum;
+my $CWRuntimeLibs="";
+
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+	PMHelp_Mmp
+
+	PMCheckPlatformL
+
+	PMPlatProcessMmp
+
+	PMPlatCheckSource
+	
+	PMStartBldList
+		PMBld
+	PMStartSrcList
+		PMBitMapBld
+		PMResrcBld
+		PMAifBld
+		PMStartSrc
+		PMSrcDepend
+			PMSrcBldDepend
+			PMEndSrcBld
+		PMEndSrc
+	PMEndSrcList
+);
+
+use strict;
+use Winutl;
+use cl_generic;
+use E32Variant;
+
+my $NamedSymLkup = 0;
+
+my $stdcpp_tag_file = 'tag_coff';
+my $stdcpp_tag_path = '$(EPOCROOT)epoc32\tools\tag';
+
+sub RoundUp1k($) {
+	# Accept C hexadecimal number (0xNNN).  Convert argument to Kb
+	# rounded up to the next 1kb boundary.
+	use integer;
+	return (hex($_[0]) + 1023) / 1024;
+}
+
+
+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 {
+
+	my $IsProxyWrapperOption=&main::ProxyWrapperOption();
+
+	# check version of CodeWarrior for Symbian OS
+	
+	if (defined($ENV{MWCSym2Includes})) {
+		$MWCC = "mwccsym2.exe";
+		$MWLD = "mwldsym2.exe";
+	}
+	if (!defined($MWCC) && defined($ENV{MWSym2Libraries})) {
+		$MWCC = "mwccsym2.exe";
+		$MWLD = "mwldsym2.exe";
+	}
+	if (!defined($MWCC) && defined($ENV{CWFolder})) {
+		$MWCC = "mwcc.exe";
+		$MWLD = "mwld.exe";
+	}
+	if (!defined($MWCC)) {
+		die "ERROR: Unable to identify a valid CodeWarrior for Symbian OS installation\n";
+	}
+
+	# determine default include path
+	
+	$MWIncludeVar = 'MWCIncludes';	# default, even if it doesn't exist
+	$MWIncludePath = '';			# default is empty
+	
+	foreach my $var ('MWCSym2Includes','MWCWinx86Includes','MWCIncludes') {
+		if (defined($ENV{$var})) {
+			$MWIncludePath = $ENV{$var};
+			$MWIncludeVar = $var;
+			last;
+		}
+	}
+
+	open PIPE, "$MWCC |", or &main::FatalError( "Failed to find version information for $MWCC \n");
+	while (<PIPE>) {
+		if($_ =~ /Version\s+(\d+)\.(\d+)\.(\d+)\s+build\s+(\d+)/) {
+			my $MajorVer = $1;
+			my $MinorVer = $2;
+			my $PatchNum = $3;
+			
+			$CWBuildNum = $4;
+
+            $CWVersionReadable = "$1.$2.$3 build $4";
+
+#			The CW compiler documentation says that the compiler version is a 2-byte value as
+#			0xMnpp (the corresponding CW's pre-defined macro is __MWERKS__), where,
+#				M is the major version number (which means it is accomodated in the first 4 bits, 
+#				n is the minor version number (which means it is accomodated in the next 4 bits, 
+#				pp is the patch number (which means it is accomodated in the next 8 bits.
+#			Here, an integer is formed from these 3 values to uniquely identify the compiler version.
+			$CWVersion = ($MajorVer << 12) + ($MinorVer << 8) + $PatchNum;
+			last;
+		}
+	}
+	close PIPE;
+	
+	if ($IsProxyWrapperOption){
+		$MWCC = "$ENV{ABLD_COMPWRAP} " . $MWCC;
+		$MWLD = "$ENV{ABLD_COMPWRAP} " . $MWLD;
+	}
+}
+
+sub PMPlatProcessMmp (@) {
+	&Winutl_DoMmp(\@_, $MWIncludePath);
+	$BaseAddressFlag=&Winutl_BaseAddress;
+	if ($BaseAddressFlag ne "") {
+		$BaseAddressFlag=" -imagebase \"$BaseAddressFlag\"";
+	}
+	@Win32LibList=&Winutl_Win32LibList;
+	$Win32Resrc=&Winutl_Win32Resrc;
+	$Win32StdHeaders=&Winutl_Win32StdHeaders;
+}
+
+sub PMPlatCheckSource () {
+	&Winutl_CheckSourceMMPMetaData ();
+}
+
+sub PMStartBldList($) {
+	my ($makecmd) = @_;
+	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 @MacroList=&main::MacroList();
+	push @MacroList, "__SUPPORT_CPP_EXCEPTIONS__";
+
+	push @MacroList, "__SYMBIAN_STDCPP_SUPPORT__" if StdCppTarget();
+	
+    my $VariantFile=&main::VariantFile();
+	my $ResourceStructRef=&main::ResourceStructRef;
+	my $Plat=&main::Plat;
+	my $Trg=&main::Trg;
+	my $TrgType=&main::TrgType;
+	my $WarningLevel=&main::CompilerOption("CW");
+	my $LinkAs=&main::LinkAs;
+
+	Generic_Header(0,$makecmd);	# define standard things using absolute paths
+
+	my $TrgDir="";
+	my $AifTrgDir="";
+	if (&Generic_Definition("TRGDIR") ne "") {
+		$TrgDir="\$(TRGDIR)\\";
+		$AifTrgDir=$TrgDir;
+	}
+
+# Handle migration of binaries to secure location
+
+	&Winutl_AdjustTargetPath(\$TrgDir);
+	
+# Change - mwwinrc.exe uses MWWinx86Includes or MWCIncludes, but some installations
+# fail to install either. Set MWCIncludes from the chosen variable as part
+# of the Makefile.
+	if (!defined($ENV{MWCIncludes}) && $MWIncludeVar ne 'MWCIncludes') {
+		&main::Output(
+			"\n",
+			"MWCIncludes:=\$($MWIncludeVar)\n",
+			"export MWCIncludes\n",
+			"\n"
+		);
+	}
+	if( ($CWVersion == 0x3205 && $CWBuildNum == 465)){
+		if($TrgType =~ /^(STDDLL|STDEXE|STDLIB)$/o) {
+		&main::Output(
+				"\n",
+				"MWSym2LibraryFiles:=msl_all_mse_symbian_d.lib;gdi32.lib;user32.lib;kernel32.lib;\n",
+				"export MWSym2LibraryFiles\n",
+				"\n"
+			);
+		}
+		else {
+			&main::Output(
+				"\n",
+				"MWSym2LibraryFiles:=msl_all_static_mse_symbian_d.lib;gdi32.lib;user32.lib;kernel32.lib;\n",
+				"export MWSym2LibraryFiles\n",
+				"\n"
+			);
+		}
+	}
+		
+	if($WarningLevel =~ /\-cwd\s\s*include/){	
+		&main::Output(
+			"# EPOC DEFINITIONS\n",
+			"\n",
+			"INCDIR  = -cwd include -i-"
+		);
+	}
+	else {
+		&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' should be treated as default datatype for OE targets because when wchar_t option is turned off, 
+	# using 'wchar_t' defaults to the unsigned short int and wrong functionality. 
+	if ( $TrgType =~ /^(STDEXE|STDDLL|STDLIB)$/io || StdCppTarget() ) 
+	{
+		&main::Output(
+			" -wchar_t on"
+		);	
+	}
+	else 
+	{
+		&main::Output(
+			" -wchar_t off"
+		);
+	}
+
+	&main::Output(		
+		" -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
+		" -exc ms",			# SEH C++ exception implementation
+		" -trigraphs on",		# Enable recognition of C-style trigraphs, e.g. '??/' -> '\'
+		" $WarningLevel"		
+	
+	);
+
+	if ($Win32StdHeaders or &main::Plat eq 'TOOLS') {
+		&main::Output(
+			" -stdinc"		# insist because mwccsym2 has -nostdinc as the default(?)
+		);
+	}
+	else {
+		&main::Output(
+			" -nostdinc"	# insist because mwcc has -stdinc 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
+			);
+#			euser change to apply inlining on the _NAKED functions
+
+#			stdexe/stddll change so that the inline functions dont 
+#			get exported (in debug build) causing a different export list for debug and release builds
+			if ($BaseTrg!~/^EUSER$/oi && $TrgType !~ /^(STDEXE|STDDLL)$/io) {
+				&main::Output(
+					' -inline off'
+				);
+			}	
+		}
+		elsif (/REL$/o) {
+			&main::Output(
+				' -O4,s'	# highest level of optimisation, optimise for space
+			);
+		}
+
+		if( ($CWVersion == 0x3205 && $CWBuildNum >= 465) || $CWVersion > 0x3205){
+			if ($TrgType =~ /^(STDEXE|STDDLL|STDLIB)$/io) {
+				&main::Output(
+					' -runtime dllmulti'
+				);
+			}
+			else {
+				&main::Output(
+					' -runtime staticmulti'
+				);
+			}
+		}
+
+		&main::Output(
+			' $(CWFLAGS)'
+		);
+		foreach (&main::MacroList($_)) {
+			&main::Output(
+				" -d $_"
+			);
+		}
+		&main::Output(
+			" \$(CWDEFS) \$(INCDIR)\n"
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+	
+	foreach (@BldList) {
+		&main::Output(
+			"$_ :"
+		);
+
+		if ($BasicTrgType !~ /IMPLIB/io) {
+			&main::Output (
+				" \\\n",
+				"\t", &Generic_Quote("\$(EPOCTRG$_)\\$TrgDir$Trg")
+			);
+			if (&Winutl_CopyForStaticLinkage) {
+				&main::Output(
+					" \\\n",
+					"\t", &Generic_Quote("\$(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", &Generic_Quote($file)
+			);
+		}
+		undef $BitMapRef;
+
+		my $ResourceRef;
+		foreach $ResourceRef (@$ResourceStructRef) {
+			if(! defined $$ResourceRef{Hdronly}) {
+				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$_)\\$AifTrgDir$$AifRef{Trg}";
+			&Generic_MakeWorkFile($makework,$file);
+			&main::Output(
+				" \\\n",
+				"\t", &Generic_Quote($file)
+			);
+		}
+		undef $AifRef;
+
+		&main::Output(
+			"\n"
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n",
+	);
+
+	&main::Output(
+		"\n",
+		"# REAL TARGET - LIBRARY\n",
+		"\n",
+		"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 ..."
+				my $LibLinkAs = ($BasicTrgType=~/^IMPLIB$/io) ? $LinkAs : $Trg;
+				&main::Output(
+					" ", &Generic_Quote("\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib"), "\n",
+					"\n",
+					&Generic_Quote("\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib"), " : ",
+					&Generic_Quote($DefFile), "\n",
+					"\tperl -S prepdef.pl ",&Generic_Quote($DefFile)," \"\$(EPOCBLD)\\$ExportLibrary.prep.def\"\n",
+					"\t$MWLD \"\$(EPOCBLD)\\$ExportLibrary.prep.def\" -importlib -o \$\@",
+					" -addcommand \"out:$LibLinkAs\" -warnings off",
+					"\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"
+			);
+		}
+	}
+	&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 -w -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)\\UDEB\\$ExportLibrary.lib\"\n"
+		);
+	}
+	&main::Output(
+		"\n"
+	);
+	&Generic_MakeWorkDir('MAKEWORKLIBRARY',"${LibPath}UDEB");
+
+	&Generic_Releaseables;
+}
+
+my $uidfile;
+sub PMBld {
+
+	my $AifStructRef=&main::AifStructRef;
+	my @SrcList=&main::SrcList;
+	my $BaseTrg=&main::BaseTrg;
+	my $BitMapStructRef=&main::BitMapStructRef;
+	my $Bld=&main::Bld;
+	my $ChopBldPath=&main::Path_Chop(&main::BldPath);
+	my $ExportLibrary=&main::ExportLibrary;
+	my $NoExportLibrary=&main::NoExportLibrary;
+	my $DefFile=&main::DefFile;
+	my $EPOCIncPath=&main::EPOCIncPath;
+	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;
+	# Get the information regarding supporting Compiler Wrapper Option
+	my $IsCompilerWrapperOption=&main::CompilerWrapperOption();
+
+	$NamedSymLkup = 1 if($TrgType =~ /^(STDDLL|STDEXE)$/o);
+
+	$uidfile = "$BaseTrg.UID";
+
+	if ($Bld =~ /DEB/) {
+		@LibList=&main::DebugLibList;
+	} else {
+		@LibList=&main::LibList;
+	}
+
+	# OE Glue Code
+	my @oe_exe_libs=("libcrt0.lib");
+	my @oe_exe_libs_wchar=("libwcrt0.lib");
+
+	# OE Import Libraries
+	my @oe_import_libs=("euser.lib"); 
+ 	if(not (grep /^libc.lib$/i, @LibList)){
+ 			push @oe_import_libs, "libc.lib";
+ 	}	   	
+	   	
+   # Handle migration of binaries to secure location
+
+	my $BLDTRGPATH = "";
+	my $AIFBLDTRGPATH = "";
+	if ($TrgPath) {
+		$BLDTRGPATH = "\$(TRGDIR)\\";	    # handles TARGETPATH
+		$AIFBLDTRGPATH = $BLDTRGPATH;
+		&Winutl_AdjustTargetPath(\$BLDTRGPATH);
+	}
+	$BLDTRGPATH = "\$(EPOCTRG$Bld)\\".$BLDTRGPATH;
+	$AIFBLDTRGPATH = "\$(EPOCTRG$Bld)\\".$AIFBLDTRGPATH;
+
+	# REAL TARGETS
+	#-------------
+	&main::Output(
+		"# REAL TARGET - BUILD VARIANT $Bld\n",
+		"\n"
+	);
+
+#	releasables
+	my @releaseables;
+	
+	unless (&main::Plat() eq 'TOOLS') {
+		if ($TrgType !~ /^IMPLIB$/io) {
+			if ($TrgType !~ /^NONE/io) {
+				push @releaseables, "$BLDTRGPATH$Trg";
+				if ($Bld=~/REL$/o && $BasicTrgType!~/^LIB$/o) {
+					push @releaseables,"$BLDTRGPATH$Trg.map";
+				}
+				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) {
+				if(! defined $$ResourceRef{Hdronly}) {
+					push @releaseables,"\$(EPOCTRG$Bld)\\$$ResourceRef{Trg}";
+				}
+			}
+			my $AifRef;
+			foreach $AifRef (@$AifStructRef) {
+				push @releaseables, "$AIFBLDTRGPATH$$AifRef{Trg}";
+			}
+		}
+		if (-e $DefFile and !$NoExportLibrary) { # effectively "if project frozen ..."
+			push @releaseables, "\$(EPOCLIB$Bld)\\$ExportLibrary.lib";
+		}
+		if ($Bld=~/DEB$/o) {
+			# debugging support files?
+		}
+	}
+	else {
+		if ($BasicTrgType !~ /^IMPLIB$/io) {
+			my $toolspath=&main::EPOCToolsPath();
+			push @releaseables, "$toolspath$Trg";
+		}
+	}
+
+
+	my $firstlib = "";
+	my $newlib = "";
+
+	if ( $BasicTrgType =~ /^(EXE|DLL)$/o && main::Plat() ne 'TOOLS' ) {
+
+		$firstlib = main::FirstLib();
+
+		unless ( StdCppTarget() || ! main::StdCppSupport()) {
+
+			$newlib = main::NewLib(); # Check if has been set in the MMP file.
+
+			unless ($newlib) {
+				if ( main::SystemTrg() ) {
+
+					$newlib = 'scppnwdl_kern.lib';
+				}
+				else {
+					$newlib = 'scppnwdl.lib';
+				}
+			}
+		}
+	}
+
+
+	&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);
+
+	my $adjustedTargetPath=$TrgPath;
+	&Winutl_AdjustTargetPath(\$adjustedTargetPath);
+	&Generic_MakeWorkDir("MAKEWORK$Bld", &main::BldPath);
+	&Generic_MakeWorkDir("MAKEWORK$Bld", "$RelPath$adjustedTargetPath");
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	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');
+		$BaseSrc =~ s/\.UID/_UID_/i if ($BaseSrc eq $uidfile);
+		
+   		&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', $_);
+			my $Ext = &main::Path_Split('Ext', $_);
+			$BaseSrc.='_' if (lc($Ext) eq '.cia');
+			$BaseSrc =~ s/\.UID/_UID_/i if ($BaseSrc eq $uidfile);
+			
+			&main::Output(
+				" \\\n\tCOMPWRAP$Bld$BaseSrc"
+			);
+		}
+
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	}
+	#--Compiler wrapper support ends
+
+	# Flag that tells whether to run checklib.exe on static libraries.
+	my $run_checklib = 0;
+
+	if (@StatLibList && $BasicTrgType =~ /^(EXE|DLL)$/o && !main::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=");
+		for (@StatLibList) {
+			&main::Output(
+				" \\\n\t", &Generic_Quote("\$(EPOCSTATLINK$Bld)\\$_")
+			);
+		}
+
+		main::Output("\n\n");
+	}
+
+	&main::Output(
+		"LIBS$Bld="
+	);
+	foreach (@StatLibList) {
+		&main::Output(
+			" \\\n\t", &Generic_Quote("\$(EPOCSTATLINK$Bld)\\$_")
+		);
+	}
+	
+	#OE Glue Code
+	if ($TrgType=~/^STDEXE$/o) {
+		if (&main::IsWideCharMain()) {
+			foreach (@oe_exe_libs_wchar) {
+				&main::Output(
+					" \\\n\t", &Generic_Quote("\$(EPOCSTATLINK$Bld)\\$_")
+				);
+			}
+		}
+		else {
+			foreach (@oe_exe_libs) {
+				&main::Output(
+					" \\\n\t", &Generic_Quote("\$(EPOCSTATLINK$Bld)\\$_")
+				);
+			}
+		}
+	}
+
+	foreach (@LibList) {
+		&main::Output(
+			" \\\n\t", &Generic_Quote("\$(EPOCLINK$Bld)\\$_")
+		);
+	}
+
+	#OE Import Libraries
+	if ($TrgType =~ /^STDEXE$/o || $TrgType =~ /^STDDLL$/o) {
+		foreach (@oe_import_libs) {
+		&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;
+		}
+		$BaseSrc.='_' if (lc($Ext) eq '.cia');
+   		&main::Output(
+			" \\\n",
+			"\t", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o")
+   		);
+   	}
+
+	my $add_stdcpp_tag = 0;
+
+	if ($BasicTrgType=~/^LIB$/o && StdCppTarget() ) {
+		$add_stdcpp_tag = 1;
+	}
+
+	if ($add_stdcpp_tag) {
+		&main::Output(
+			" \\\n",
+			"\t", &Generic_Quote("$stdcpp_tag_path\\$stdcpp_tag_file")
+		);
+	}
+	if ($Win32Resrc) {
+		my $resbase=&main::Path_Split('Base',$Win32Resrc);
+		&main::Output(
+			" \\\n",
+			"\t", &Generic_Quote("\$(EPOCBLD$Bld)\\$resbase.res")
+		);
+	}
+	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)\\$BaseTrg"."_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 =~ /mwcc.exe/) {
+		&main::OutFormat(
+			' -warnings on'	# on by default in mwccsym2.exe
+		);
+	}
+
+	main::OutFormat(" \"\$(EPOCSTATLINK$Bld)\\$firstlib\" ") if $firstlib;
+	main::OutFormat(" \"\$(EPOCSTATLINK$Bld)\\$newlib\" ")   if $newlib;
+
+	foreach my $lib (@Win32LibList) {
+		 my $win32lib = $lib;    # take a copy, to avoid updating contents of Win32LibList!
+		$win32lib = "-l$win32lib" unless ($win32lib =~ /\\/);
+		&main::OutFormat(
+			" ",lc $win32lib
+		);
+	}
+	if ($BasicTrgType=~/^DLL$/o) {
+		&main::OutFormat(
+			"$BaseAddressFlag",
+			' -main __Win32DllMain@12',
+			' -shared'
+		);
+	}
+	elsif ($TrgType=~/^EXEXP$/o) {
+		&main::OutFormat(
+			"$BaseAddressFlag",
+			' -noentry',
+			' -shared'
+		);
+	}
+	elsif ($BasicTrgType=~/^EXE$/o) {
+		unless (&main::Plat eq 'TOOLS') {
+			&main::OutFormat(
+				' -m "?_E32Bootstrap@@YGXXZ"'
+			);
+		}
+	}
+	if (&main::Plat=~/^(WINC|TOOLS)$/o && $BasicTrgType=~/^EXE$/o) {
+		&main::OutFormat(
+			' -subsystem console'
+		);
+	}
+	else {
+		&main::OutFormat(
+			' -subsystem windows'
+		);
+	}
+	if (&main::HeapSize) {
+		my %HeapSize=&main::HeapSize;
+		&main::OutFormat(
+			' -heapreserve=',RoundUp1k($HeapSize{Max}),' -heapcommit=',RoundUp1k($HeapSize{Min})
+		);
+	}
+	if ($BasicTrgType=~/^(DLL|EXE)$/o) {
+		if ($Bld=~/DEB$/o) {
+			&main::OutFormat(
+				' -g'
+			);
+		}
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	if($TrgType =~/^(STDEXE|STDDLL|STDLIB)$/o) {
+		if(! (( $CWVersion == 0x3205 && $CWBuildNum >= 465 ) || $CWVersion > 0x3205 ) ) {
+			&main::FatalError("TargetType $TrgType requires CodeWarrior version `3.2.5 build 465' or later but you have $CWVersionReadable.");
+		}
+	}
+
+	my $EntrySymbol='';
+	if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $NamedSymLkup) {
+		my $Include="";
+		if ($BasicTrgType=~/^DLL$/o) {
+			$Include="-m __E32Dll";
+			$EntrySymbol='__E32Dll';
+		}
+		else {
+			$Include="-m __E32Startup";
+			$EntrySymbol='__E32Startup';
+		}
+		&main::Output(
+			"STAGE1_LINK_FLAGS$Bld= \$(COMMON_LINK_FLAGS$Bld) \$(LIBS$Bld) \\\n\t",
+			" -o \"\$(EPOCBLD$Bld)\\$Trg\"");
+		
+		if ($NamedSymLkup) {
+			&main::Output(
+			" -export all",
+			" -map \"\$(EPOCBLD$Bld)\\$Trg.map\""
+			);
+		}
+		else {
+			&main::Output(' -export dllexport');
+		}
+
+		if($CWRuntimeLibs ne "") {
+			&main::Output(
+				" -l$CWRuntimeLibs "
+			);
+		}
+		if($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o) {
+			&main::Output(
+				" $Include",
+				' -nocompactimportlib', 
+				" -implib \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"",
+				" -addcommand \"out:$Trg\" -warnings off",
+				"\n",
+			);
+		}
+		else{
+#		Dont generate import libs for an Exe
+			&main::Output(
+				" $Include",
+				" -addcommand \"out:$Trg\" -warnings off",
+				"\n",
+			);
+		}
+	}
+	my $AbsentSubst = '';
+	if ($EntrySymbol) {
+		$AbsentSubst = " -absent $EntrySymbol";
+	}
+
+	&main::Output(
+		"LINK_FLAGS$Bld= \$(COMMON_LINK_FLAGS$Bld) \$(LIBS$Bld) \\\n\t",
+		" -o \"$BLDTRGPATH$Trg\" ", &main::LinkerOption("CW") 
+	);
+	if($CWRuntimeLibs ne "") {
+			&main::Output(
+				" -l$CWRuntimeLibs "
+			);
+	}
+	if ($Bld=~/REL$/o && $BasicTrgType!~/^LIB$/o) {
+		# Generate map file for release build executables
+		&main::Output(
+			" -map \"$BLDTRGPATH$Trg.map\"", 
+		);
+	}
+	if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o) {
+		&main::Output(
+			" -f \"\$(EPOCBLD)\\$ExportLibrary.def\"",	# use generated .DEF file
+		);
+		if (&main::ExportUnfrozen) {
+			&main::Output(
+				" -implib \"\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib\"",
+				" -addcommand \"out:$Trg\" -warnings off"
+			);
+		}
+		else {
+			&main::Output(
+				' -noimplib'
+			);
+		}
+	}
+	else {
+		&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(" ", Generic_Quote("\$(EPOCSTATLINK$Bld)\\$firstlib") ) if $firstlib;
+	main::Output(" ", Generic_Quote("\$(EPOCSTATLINK$Bld)\\$newlib") )   if $newlib;
+
+	&main::Output(
+		" \$(LIBS$Bld)\n"
+	);
+
+	my $checklib = "checklib";
+
+	if ( StdCppTarget() ) {
+		$checklib .= " stdc++ --coff";
+	}
+	else {
+		$checklib .= " symc++ --coff";
+	}
+
+	&main::Output( "\t$checklib ","\$(USER_ADDED_ARCHIVES_$Bld)\n" ) if ($run_checklib);
+#	Link by name first time round for dlls
+	if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o) {
+		&main::Output(
+			"\t$MWLD \$(STAGE1_LINK_FLAGS$Bld) -l \$(EPOCBLD$Bld) -search \$(notdir \$(LINK_OBJS$Bld))\n",
+		);
+		if(!$NamedSymLkup){
+#		Dont delete the binary as we need to extract symbol/dependency info
+			&main::Output(
+			"\t\$(ERASE) \"\$(EPOCBLD$Bld)\\$Trg\"\n",
+			);
+		}
+
+#		Generate an export info file
+		my $show_options = "names,verbose";
+		$show_options = "names,unmangled,verbose" if ($MWLD =~ /mwldsym2.exe/);
+		&main::Output(
+			"\t$MWLD -S -show only,$show_options -o \"\$(EPOCBLD$Bld)\\$ExportLibrary.inf\" \"\$(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 -w -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\""
+			);
+		}
+		my $Export;
+		my $Ordinal=1;
+		foreach $Export (&main::Exports) {
+#				replace "$" with "$$" so that NMAKE doesn't think there's a macro in the function name
+			$Export=~s-\$-\$\$-go;
+			&main::Output(
+				" -$Ordinal $Export"
+			);
+			$Ordinal++;
+		}
+		&main::Output(" -sym_name_lkup") if($NamedSymLkup);
+
+		&main::Output(" -export_entrypoint_E32Dll") if ($TrgType =~ /^STDDLL$/i);  # Workaround: To export entry point _E32DLL for target type STDDLL
+
+		&main::Output(
+			" \"\$(EPOCBLD)\\$ExportLibrary.def\" \n",
+			"\t\$(ERASE) \"\$(EPOCBLD$Bld)\\$ExportLibrary.inf\"\n",
+			"\t\$(ERASE) \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"\n"
+		);
+	}
+	elsif($NamedSymLkup) {
+#	2-stage linking required for all those targets that enable symbol lookup
+		&main::Output( "\t$checklib ","\$(USER_ADDED_ARCHIVES_$Bld)\n" ) if ($run_checklib);
+		&main::Output(
+			"\t$MWLD \$(STAGE1_LINK_FLAGS$Bld) -l \$(EPOCBLD$Bld) -search \$(notdir \$(LINK_OBJS$Bld))\n",
+		);
+	}
+	my $gen_src_file = "";
+	if($NamedSymLkup){
+#		pick the symbols and the dependencies.
+		&main::Output(
+			"\t$MWLD -S -show only,names,verbose -o \"\$(EPOCBLD$Bld)\\$ExportLibrary.sym\" \"\$(EPOCBLD$Bld)\\$Trg\"\n",
+		);
+
+#		Generate the source file with symbol and dependency information in the named data segment.
+		$gen_src_file = "${BaseTrg}_SYM_";
+		
+		if($BasicTrgType=~/^EXE$/o){
+#		For an EXE, generate the symbols as well as the dependencies
+			&main::Output(
+				"\tperl -S sym_lkup_util.pl -o \"\$(EPOCBLD$Bld)\\$gen_src_file.cpp\" -sym \"\$(EPOCBLD$Bld)\\$ExportLibrary.sym\" -map \"\$(EPOCBLD$Bld)\\$Trg.map\"\n"
+			);
+		}
+		else {
+#		For DLLs, generate only the dependencies.
+			&main::Output(
+				"\tperl -S sym_lkup_util.pl -o \"\$(EPOCBLD$Bld)\\$gen_src_file.cpp\" -sym \"\$(EPOCBLD$Bld)\\$ExportLibrary.sym\" --ignore_export_dir\n"
+			);
+		}
+		main::Output(
+			"\t\$(CW$Bld) -c \"\$(EPOCBLD$Bld)\\$gen_src_file.cpp\" -o \"\$(EPOCBLD$Bld)\\$gen_src_file.o\"\n",
+		);
+	}
+
+#	Perform the final link step
+	&main::Output(
+		"\t$MWLD "
+	);
+	if ($BasicTrgType=~/^LIB$/o) {
+		&main::Output(
+			"-library "
+		);
+
+		&main::Output( "-l $stdcpp_tag_path ") if ($add_stdcpp_tag);
+	}
+	
+	if($NamedSymLkup){
+#	Final linking and cleanup
+		main::Output(
+		"\$(LINK_FLAGS$Bld) -l \$(EPOCBLD$Bld) -search \$(notdir \$(LINK_OBJS$Bld))",
+		" \"\$(EPOCBLD$Bld)\\$gen_src_file.o\"\n",
+		"\t\$(ERASE) \"\$(EPOCBLD$Bld)\\$gen_src_file.cpp\"\n",
+		"\t\$(ERASE) \"\$(EPOCBLD$Bld)\\$gen_src_file.o\"\n",
+		"\t\$(ERASE) \"\$(EPOCBLD$Bld)\\$ExportLibrary.sym\"\n",
+		"\t\$(ERASE) \"\$(EPOCBLD$Bld)\\$Trg.map\"\n",
+		"\t\$(ERASE) \"\$(EPOCBLD$Bld)\\$Trg\"\n",
+		);
+	}
+	else {
+		&main::Output(
+			"\$(LINK_FLAGS$Bld) -l \$(EPOCBLD$Bld) -search \$(notdir \$(LINK_OBJS$Bld))\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",
+			&Generic_Quote("\$(EPOCTRG$Bld)\\$Trg"), " : ", 
+			&Generic_Quote("$BLDTRGPATH$Trg"), "\n",
+			"\t", &Generic_CopyAction(),
+		);
+	}
+
+	&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) 
+	{
+		if(! defined $$ResourceRef{Hdronly})
+		{
+			&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)";
+	}
+
+	my @BldList=&main::BldList;
+	my $Bld;
+	foreach $Bld (@BldList) {
+		my $path="\$(EPOCTRG$Bld)$TrgDir";
+		&main::Output(
+			&Generic_Quote("$path\\$$AifRef{Trg}"), " : ",
+			&Generic_Quote("$$AifRef{GenericTrg}"), "\n",
+			"\t", &Generic_CopyAction(),
+			"\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 =~ s/\.UID/_UID_/i 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 =~ s/\.UID/_UID_/i 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 =~ s/\.UID/_UID_/i if ($BaseSrc eq $uidfile);
+	my $Bld=&main::Bld;
+	my $Plat=&main::Plat;
+	my $Src=&main::Src;
+	my $SrcPath=&main::SrcPath;
+	my $Ext=&main::ExtSrc;
+	my $Cia = (lc($Ext) eq '.cia') ? 1 : 0;
+	my $TrgType=&main::TrgType;
+	# Get the information regarding supporting Compiler Wrapper Option
+	my $IsCompilerWrapperOption=&main::CompilerWrapperOption();
+
+	if ($Cia) {
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.o"), " : ",
+			&Generic_Quote("$SrcPath$Src"), "\n",
+			"\techo $Src\n",
+			"\t\$(CW$Bld) -lang c++ -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"
+		);
+	} else {
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o"), " : ",
+			&Generic_Quote("$SrcPath$Src"), "\n",
+			"\techo $Src\n",
+			"\t\$(CW$Bld) -o \"\$\@\" -c \"$SrcPath$Src\" "
+		);
+		# When building for OE target type and source file is of C++ type, 
+ 		# then pass macro "__wchar_t_defined" to indicate that datatype "wchar_t" is enabled.
+ 		if ( StdCppTarget() || $TrgType =~ /^(STDEXE|STDDLL|STDLIB)$/io ) 
+ 		{			
+ 			if (lc($Ext) =~ /^(.cpp|.cc|.cxx|.c\+\+)$/)
+ 			{
+ 				&main::Output(
+ 					" -d \"__wchar_t_defined\" "					
+ 				);			
+ 			}
+ 		}
+ 		&main::Output(
+   			"\n",
+ 			"\n"
+ 		);
+		&main::Output(
+#			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"
+		);
+
+		# Output files if Compiler Wrapper Option is specified
+		if($IsCompilerWrapperOption)
+		{
+			my $Platcmpwrap=&main::Plat;
+			&main::Output(
+				"COMPWRAP$Bld$BaseSrc : ",
+				&Generic_Quote("$SrcPath$Src"), "\n",
+				"\techo Analysing $Src\n",
+				"\t\$(COMPWRAP) \$(CW$Bld) -o \"\$\@\" -c \"$SrcPath$Src\" ",
+				"\n\n"
+			);
+
+		}
+	}
+}
+
+sub PMEndSrc {
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMEndSrcList {
+
+	my $show_options = "source";
+	$show_options = "source,unmangled,comments" if ($MWLD =~ /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"
+	);
+
+	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", &Generic_Quote($_)
+			);
+		}
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	
+		my $Bld;
+		my $resbase=&main::Path_Split('Base',$Win32Resrc);
+		my $respath=&main::Path_Chop(&main::Path_Split('Path',$Win32Resrc));
+		foreach $Bld (@BldList) {
+			&main::Output(
+				&Generic_Quote("\$(EPOCBLD$Bld)\\$resbase.res"), " : ",
+				&Generic_Quote($Win32Resrc), " \$(DEPEND)\n",
+				"\tmwwinrc -o \$\@ \"$Win32Resrc\"\n",
+				"\n"
+			);
+		}
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	}
+
+	# Deal with accumulated MAKEDIRS etc.
+
+	&Generic_End;
+}
+
+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 );
+	}
+}
+
+
+1;