sbsv1/abld/platform/cl_x86.pm
changeset 607 378360dbbdba
parent 599 fa7a3cc6effd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/cl_x86.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,963 @@
+# 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_x86;
+
+# declare variables global for module
+
+
+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 Genutl;
+use Pathutl;
+
+use constant NOCOMPRESSIONMETHOD => 0;
+use constant INFLATECOMPRESSIONMETHOD => 1;
+use constant BYTEPAIRCOMPRESSIONMETHOD => 2;
+
+use constant NOTPAGED => 0;
+use constant UNPAGED => 1;
+use constant PAGED => 2;
+sub PMHelp_Mmp {
+	&Winutl_Help_Mmp;
+}
+
+sub PMCheckPlatformL {
+}
+
+sub PMPlatProcessMmp (@) {
+
+}
+
+sub PMStartBldList($) {
+	my ($makecmd) = @_;
+	die "Cannot generate $makecmd makefiles\n" if ($makecmd ne "nmake");
+	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 $LinkAs=&main::LinkAs;
+	my $ExportLibrary=&main::ExportLibrary;
+	my $NoExportLibrary=&main::NoExportLibrary;
+	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 @UidList=&main::UidList;	
+	my $WarningLevel=&main::CompilerOption("MSVC");
+	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;
+	}
+
+	&Generic_Header(0,$makecmd);	# define standard things using absolute paths
+
+#	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);
+	}
+
+	my $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"
+	);
+
+	&main::Output(
+		"CLFLAGS = /nologo /Zp4 $WarningLevel /Zm256"
+		);	
+	&main::Output(
+		" /X"
+		);
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"CLDEFS  ="
+	);
+	foreach(@MacroList) {
+		&main::Output(
+			" /D \"$_\""
+		);
+	}
+	&main::Output(
+		" \$(USERDEFS)\n",
+		"\n"
+	);
+
+	foreach (@BldList) {
+		&main::Output(
+			"CL$_ = cl.exe"
+		);
+		if (/DEB$/o) {
+			&main::Output(
+				' /Od /Gs0x10000 /Gy /GR- /GX-'
+			);
+#			euser change to apply inlining on the _NAKED functions
+			if ($BaseTrg=~/^EUSER$/oi) {
+				&main::Output(
+					' /Ob1'
+				);
+			}
+		}
+		elsif (/REL$/o) {
+#			euser change to prevent minimum size optimisation from disrupting the maths functions
+				&main::Output(
+					' /O1 /Op /Gs0x10000 /Gy /GF /GR- /GX-'
+				);
+		}
+		&main::Output(
+			' $(CLFLAGS)'
+		);
+		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\""
+			);
+		}
+
+#		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
+	
+	foreach (@BldList) {
+		my $makework="MAKEWORK$_";
+		&main::Output(
+			"\n",
+			"RESOURCE$_ : $makework"
+		);
+	}
+	&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)\\UREL\\$PrimaryExportLibrary.LIB\"\n"
+				);
+			}
+			else {
+				&main::Output(
+					"\n",
+					"\t\@echo WARNING: Not attempting to create \"\$(EPOCLIB)\\UREL\\$PrimaryExportLibrary.LIB\".\n",
+					"\t\@echo When exports are frozen in \"$DefFile\", regenerate Makefile.\n"
+				);
+			}
+		}
+		else {
+			&main::Output(
+				"\n",
+				"\t\@echo Not attempting to create \"\$(EPOCLIB)UREL\\$PrimaryExportLibrary.LIB\"\n",
+				"\t\@echo from frozen .DEF file, since EXPORTUNFROZEN specified.\n"
+			);
+		}
+		&main::Output(
+			"\n",
+			"\n",
+			"# REAL TARGET - LIBRARY\n",
+			"\n",
+			"\"\$(EPOCLIB)\\UREL\\$ExportLibrary.LIB\" : \"$DefFile\"\n",
+			"\tperl -S prepdef.pl \"$DefFile\" \"\$(EPOCBLD)\\$ExportLibrary.prep.def\"\n",
+			"\tlib.exe /nologo /machine:i386 /nodefaultlib /subsystem:native /name:\"$LinkAs\" /def:\"\$(EPOCBLD)\\$ExportLibrary.prep.def\" /out:\"\$(EPOCLIB)\\UREL\\$ExportLibrary.LIB\"\n",
+			"\tdel \"\$(EPOCLIB)\\UREL\\$ExportLibrary.exp\"\n"
+		);
+		if ($ExtraExportLibrary) {
+			&main::Output(
+				"\n",
+				&Generic_Quote("\$(EPOCLIB)\\UREL\\$ExtraExportLibrary.lib"), " : ",
+				&Generic_Quote("\$(EPOCLIB)\\UREL\\$ExportLibrary.lib"), "\n",
+				"\tcopy ", &Generic_Quote("\$(EPOCLIB)\\UREL\\$ExportLibrary.lib"), " \$@\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)\\UREL\\$ExportLibrary.LIB\"\n"
+		);
+		if ($ExtraExportLibrary) {
+			&main::Output(
+				"\t-\$(ERASE) \"\$(EPOCLIB)\\UREL\\$ExtraExportLibrary.LIB\"\n"
+			);
+		}
+	}
+	&Generic_MakeWorkDir('MAKEWORKLIBRARY',"${LibPath}UREL");
+
+	&Generic_Releaseables;
+}
+
+sub PMBld {
+
+	my @ASSPLibList=&main::ASSPLibList;
+	my @SrcList=&main::SrcList;
+	my $BaseTrg=&main::BaseTrg;
+	my $Bld=&main::Bld;
+	my $DefFile=&main::DefFile;
+	my $EPOCIncPath=&main::EPOCIncPath;
+	my $FirstLib=&main::FirstLib;
+	my $BasicTrgType=&main::BasicTrgType;
+	my @LibList;
+	my $LinkAs=&main::LinkAs;
+	my $ExportLibrary=&main::ExportLibrary;
+	my $NoExportLibrary=&main::NoExportLibrary;
+	my $LibPath=&main::LibPath;
+	my $RelPath=&main::RelPath;
+	my @StatLibList=&main::StatLibList;
+	my $Trg=&main::Trg;
+	my $TrgPath=&main::TrgPath;
+	my $TrgType=&main::TrgType;
+	my @UidList=&main::UidList;	
+	my $HasExports=0;
+	if (-e $DefFile or scalar(&main::Exports)!=0) {
+		$HasExports=1;
+	}
+	my %Version = &main::Version();
+	my $ExtraExportLibrary;
+	unless ($Version{explicit}) {
+		$ExtraExportLibrary = $ExportLibrary;
+		$ExtraExportLibrary =~ s/\{(\d|a|b|c|d|e|f){8}\}//i;
+	}
+
+	my $WarningLevel='/WARN:3';
+	$WarningLevel='/WARN:1';    # avoid LNK4005 warnings about unused libraries
+
+	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);
+	}
+
+	my $BLDTRGPATH = "\$(EPOCTRG$Bld)\\";
+	my $BLDDATAPATH = "\$(EPOCTRG$Bld)\\";
+	my $Entry="";
+	my $Include="";
+	my $EntrySymbol='';
+	if ($BasicTrgType=~/^DLL$/o) {
+		$Entry="_E32Dll";
+		$Include="/include:\"__E32Dll\"";
+		$EntrySymbol='_E32Dll';
+	}
+	elsif ($BasicTrgType=~/^EXE$/o) {
+		$Entry="_E32Startup";
+		$Include="/include:\"__E32Startup\"";
+		$EntrySymbol='_E32Startup';
+	}
+	my $AbsentSubst = '';
+	if ($EntrySymbol) {
+		$AbsentSubst = " -absent $EntrySymbol";
+	}
+
+	# REAL TARGETS
+	#-------------
+	&main::Output(
+		"# REAL TARGET - BUILD VARIANT $Bld\n",
+		"\n"
+	);
+
+#	releasables
+	my @releasables;
+ 	push @releasables, "$RelPath$Trg" if ($BasicTrgType !~ /^IMPLIB$/io);
+   	if ($BasicTrgType=~/^(DLL|EXE)$/o) {
+ 		push @releasables, "$RelPath$Trg.MAP";
+	}
+	if (-e $DefFile and !$NoExportLibrary) { # effectively "if project frozen ..."
+ 		push @releasables, "$LibPath$ExportLibrary.LIB";
+ 		push @releasables, "$LibPath$ExtraExportLibrary.LIB" if ($ExtraExportLibrary);
+	}
+
+	&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",
+		"\t-\$(ERASE) \"$BLDTRGPATH$BaseTrg.ILK\"\n",
+		"\n",
+		"CLEANRELEASE$Bld : CLEANGENERIC\n",
+		"\n"
+	);
+ 	&Generic_WhatCleanTargets($Bld, "WHAT$Bld", "CLEANRELEASE$Bld", @releasables);
+
+	&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"
+	);
+
+	&main::Output(
+		"LIBS="
+	);
+	foreach (@StatLibList) {
+		&main::Output(
+			" \\\n\t\"\$(EPOCSTATLINK$Bld)\\$_\""
+		);
+	}
+	foreach (@ASSPLibList) {
+		&main::Output(
+			" \\\n\t\"\$(EPOCASSPLINK$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\""
+   		);
+   	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+		&main::OutFormat(
+			"STAGE1_LINK_FLAGS="
+		);
+		&main::OutFormat(
+			"\"\$(EPOCSTATLINK$Bld)\\$FirstLib\" /PDB:NONE"
+		);
+		if ($BasicTrgType=~/^(DLL)$/o) {	# Add the DLL stub
+			&main::OutFormat(
+				" \"\$(EPOCSTATLINK$Bld)\\EDLLSTUB.LIB\""
+			);
+		}
+		&main::OutFormat(
+			" \$(LIBS) /nologo /entry:$Entry /subsystem:native"
+		);
+		if ($BasicTrgType=~/^DLL$/o) {
+			&main::OutFormat(
+				" /dll"
+			);
+		}
+		if ($Bld=~/DEB$/o) {
+			&main::OutFormat(
+				' /debug'
+			);
+		}
+		&main::OutFormat(
+			" /incremental:no /machine:IX86 /nodefaultlib $Include /out:\"\$(EPOCBLD$Bld)\\$Trg\" $WarningLevel",
+			" /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
+		);
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	}
+
+	&main::OutFormat(
+		'LINK_FLAGS='
+	);
+	if ($BasicTrgType=~/^(EXE|DLL)$/o) {
+		&main::OutFormat(
+			" \"\$(EPOCSTATLINK$Bld)\\$FirstLib\" /PDB:NONE "
+		);
+		if ($BasicTrgType=~/^(DLL)$/o) {	# Add the DLL stub
+			&main::OutFormat(
+				" \"\$(EPOCSTATLINK$Bld)\\EDLLSTUB.LIB\""
+			);
+		}
+	}
+	&main::OutFormat(
+		' $(LIBS) /nologo'
+	);
+	if ($BasicTrgType=~/^(EXE|DLL)$/o) {
+		&main::OutFormat(
+			" /fixed:no "
+		);
+		&main::OutFormat(
+			" /entry:$Entry"
+		);
+	}
+	&main::OutFormat(
+		' /subsystem:native'
+	);
+	if ($BasicTrgType=~/^DLL$/o) {
+		if ($HasExports) {
+			&main::OutFormat(
+				" /dll \"\$(EPOCBLD$Bld)\\$ExportLibrary.exp\""
+			);
+		} else {
+			&main::OutFormat(
+				" /dll"
+			);
+		}
+	} elsif ($TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+		&main::OutFormat(
+			" \"\$(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
+	);
+	&main::OutFormat(
+		" /nodefaultlib $Include"
+	);
+	if ($BasicTrgType=~/^(DLL|EXE)$/o) {
+		&main::OutFormat(
+			" /out:\"\$(EPOCBLD$Bld)\\$Trg\"",
+			" /implib:\"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\""
+		);
+		&main::OutFormat(
+			" $WarningLevel"
+		);
+	} else {
+		&main::OutFormat(
+			" /out:\"$BLDTRGPATH$Trg\""
+		);
+	}
+	&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) {
+		&main::Output(
+			" \"\$(EPOCSTATLINK$Bld)\\$FirstLib\""
+		);
+	}
+	&main::Output(
+		" \$(LIBS)\n"
+	);
+
+
+#	Link by name first time round for dlls
+	if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+		&main::Output(
+			"\techo $Entry>\"\$(EPOCBLD$Bld)\\$ExportLibrary.ord\"\n",
+			"\tlink.exe \@<<\n",
+			"\t\t\$(STAGE1_LINK_FLAGS) /order:@\"\$(EPOCBLD$Bld)\\$ExportLibrary.ord\" \$(LINK_OBJS)\n",
+			"<<\n",
+			"\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.ord\"\n",
+			"\tdel \"\$(EPOCBLD$Bld)\\$Trg\"\n",
+#			"\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.exp\"\n"
+		);
+
+	if ($HasExports) {
+	#		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 (-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 /subsystem:native /name:\"$LinkAs\" /def:\"\$(EPOCBLD)\\$ExportLibrary.def\" /out:\"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"\n"
+			);
+			if (&main::ExportUnfrozen) {
+				&main::Output(
+				"\tcopy \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\" \"\$(EPOCLIB)\\UREL\\$ExportLibrary.lib\"\n"
+				);
+				if ($ExtraExportLibrary) {
+					&main::Output(
+						"\n",
+						"\tcopy \"\$(EPOCLIB)\\UREL\\$ExportLibrary.lib\" ",
+						"\"\$(EPOCLIB)\\UREL\\$ExtraExportLibrary.lib\"",
+						"\n"
+					);						
+				}				
+			}
+			&main::Output(
+				"\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"\n"
+			);
+		}
+	}
+
+	if ($BasicTrgType=~/^(DLL|EXE)$/o) {
+		&main::Output(
+			"\techo $Entry>\"\$(EPOCBLD$Bld)\\$ExportLibrary.ord\"\n",
+			"\tlink.exe /order:@\"\$(EPOCBLD$Bld)\\$ExportLibrary.ord\" /MAPINFO:EXPORTS /MAP:\"$RelPath$Trg.MAP\" \@<<\n"
+		);
+	}
+	elsif ($BasicTrgType=~/^LIB$/o) {
+		&main::Output(
+			"\tlib.exe \@<<\n"
+		);
+	}
+	&main::Output(
+		"\t\t\$(LINK_FLAGS) \$(LINK_OBJS)\n",
+		"<<\n"
+	);
+
+	if ($BasicTrgType=~/^(DLL|EXE)$/o) {
+		&main::Output(
+			"\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.ord\"\n"
+		);
+		if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+			if ($HasExports) {
+				&main::Output(
+					"\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.exp\"\n"
+				);
+			}
+		}
+		&main::Output(
+			"\tperl -S findimp.pl \"$RelPath$Trg.MAP\" \"\$(EPOCBLD$Bld)\\$ExportLibrary.imp\"\n"
+		);
+		&main::Output(
+			"\tpetran -x86imp=\"\$(EPOCBLD$Bld)\\$ExportLibrary.imp\" -version ", &Genutl_VersionToUserString(%Version), " -sid ", &main::SecureId(), " \"\$(EPOCBLD$Bld)\\$Trg\" \$\@ \\\n",
+			"\t\t"
+		);
+		if (&main::AllowDllData) {
+			&main::Output(
+				' -allow'
+			);
+		}
+		if (not &main::CallDllEntryPoints) {
+			&main::Output(
+				' -nocall'
+			);
+		}
+		if (&main::DataLinkAddress) {
+			&main::Output(
+				' -datalinkaddress ',&main::DataLinkAddress
+			);
+		}
+		if (&main::FixedProcess) {
+			&main::Output(
+				' -fixed'
+			);
+		}
+		if (&main::HeapSize) {
+			my %HeapSize=&main::HeapSize;
+			&main::Output(
+				' -heap ',$HeapSize{Min},' ',$HeapSize{Max}
+			);
+		}
+		if (&main::ProcessPriority) {
+			&main::Output(
+				' -priority ',&main::ProcessPriority
+			);
+		}
+		if (&main::SmpSafe) {
+			&main::Output(
+				' -smpsafe'
+			);
+		}
+		if (&main::StackSize) {
+			&main::Output(
+				' -stack ',&main::StackSize
+			);
+		}
+		my $i=1;
+		foreach (@UidList) {
+			&main::Output(
+				" -uid$i $_"
+			);
+			$i++;
+		}
+		if(&main::VendorId) {
+			&main::Output(
+				' -vid ',&main::VendorId
+			);
+		}
+		&main::Output(
+			' -capability ',&main::Capability,
+		);
+		if (&main::CompressTarget)
+		    {
+		    &main::Output(
+		    " -nocompress"
+		    );
+		    }
+		else
+		    {
+		    if(&main::CompressTargetMode == NOCOMPRESSIONMETHOD)
+			{
+				# Do nothing
+			}
+		    elsif(&main::CompressTargetMode == INFLATECOMPRESSIONMETHOD)
+			{
+			&main::Output(
+				" -compressionmethod deflate"
+			);
+			}
+		    elsif(&main::CompressTargetMode == BYTEPAIRCOMPRESSIONMETHOD)
+			{
+			&main::Output(
+				" -compressionmethod bytepair"
+			);
+			}
+
+		    }
+		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");
+		&main::Output(
+			"\tdel \"\$(EPOCBLD$Bld)\\$Trg\"\n"
+		);
+	}
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMStartSrcList {
+
+	&main::Output(
+		"# SOURCES\n",
+		"\n"
+	);
+}
+
+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 @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",
+			"\tperl -S tranasm_x86.pl \"$SrcPath$Src\" \"\$(EPOCBLD$Bld)\\$BaseSrc\_.transd.cia\"\n",
+			"\t\$(CL$Bld) /I \"$SrcPath\.\" /TP /Fo\"\$(EPOCBLD$Bld)\\$BaseSrc\_.obj\" /GF /c \"\$(EPOCBLD$Bld)\\$BaseSrc\_.transd.cia\"\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 /FAsc /Fa\"\$\@\" /Fo\"\$(EPOCBLD$Bld)\\$BaseSrc\_.obj\" /GF /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)/\" /GF /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) /FAsc /Fa\"\$\@\" /Fo\"\$(EPOCBLD$Bld)/\" /GF /c \"$SrcPath$Src\"\n",
+			"\n"
+		);
+	}
+}
+
+sub PMEndSrc {
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMEndSrcList {
+
+	# Deal with accumulated MAKEDIRS etc.
+
+	&Generic_End;
+}
+
+1;