sbsv1/abld/platform/cl_mingw.pm
changeset 629 541af5ee3ed9
parent 599 fa7a3cc6effd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/cl_mingw.pm	Wed Aug 18 17:23:33 2010 +0300
@@ -0,0 +1,591 @@
+# Copyright (c) 2008-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_mingw;
+
+my $MinGWInstall='$(EPOCROOT)epoc32\\gcc_mingw\\bin';
+my $MinGWPreInclude='$(EPOCINC)\\gcc_mingw\\gcc_mingw.h';
+
+my $GccPrefix='';
+my $ToolPrefix='';
+my $HelperLib='';
+my %PlatOpt=(
+	'Dlltool'=>'',
+    'Gcc'=>'',
+	'Ld'=>'',
+	# MinGW > 3.2.3 has been found to generate programs that crash (rombuild in particular) 
+	# and a workaround this appears to be to use specific optimisations rather than
+	# specifying -O options
+	'Optimize'=>'-fdefer-pop -fmerge-constants '.
+	  '-fthread-jumps -floop-optimize '.
+	  '-fif-conversion -fif-conversion2 '.
+	  '-fguess-branch-probability -fcprop-registers '.
+          '-fforce-mem -foptimize-sibling-calls -fstrength-reduce '.
+	  '-fcse-follow-jumps  -fcse-skip-blocks '.
+          '-frerun-cse-after-loop  -frerun-loop-opt '.
+          '-fgcse  -fgcse-lm  -fgcse-sm  -fgcse-las '.
+          '-fdelete-null-pointer-checks '.
+          '-fexpensive-optimizations '.
+          '-fregmove '.
+          '-fschedule-insns  -fschedule-insns2 '.
+          '-fsched-interblock  -fsched-spec '.
+          '-fcaller-saves '.
+          '-fpeephole2 '.
+          '-freorder-blocks  -freorder-functions '.
+          '-fstrict-aliasing '.
+          '-funit-at-a-time '.
+          '-falign-functions  -falign-jumps '.
+          '-falign-loops  -falign-labels '.
+          '-fcrossjumping'
+
+);
+my $Dlltool;
+my $Archive;
+my $Link;
+my $Objcopy;
+
+my @Win32LibList=();
+my $Win32StdHeaders;
+
+
+require Exporter;
+@ISA=qw(Exporter);
+
+@EXPORT=qw(
+	PMHelp_Mmp
+	PMCheckPlatformL
+	PMPlatProcessMmp
+	PMStartBldList
+	PMBld
+	PMStartSrcList
+	PMStartSrc
+	PMSrcDepend
+	PMSrcBldDepend
+	PMEndSrcBld
+	PMEndSrc
+	PMEndSrcList
+);
+
+use cl_generic;
+use Genutl;
+use Winutl;
+
+sub PMHelp_Mmp {
+}
+
+sub PMCheckPlatformL {
+	if ((&main::Plat eq 'TOOLS2') 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{EPOCROOT}epoc32\\gcc_mingw\\include");
+	@Win32LibList=&Winutl_Win32LibList;
+	$Win32StdHeaders=&Winutl_Win32StdHeaders;
+}
+
+my $Makecmd;
+
+sub PMStartBldList($) {
+	($Makecmd) = @_;
+	my $BaseTrg=&main::BaseTrg;
+	my $BasicTrgType=&main::BasicTrgType;
+	my @BldList=&main::BldList;
+	my @SysIncPaths=&main::Path_Chop(&main::SysIncPaths);
+	my @UserIncPaths=&main::Path_Chop(&main::UserIncPaths);
+
+	my $EPOCPath=&main::EPOCPath;
+	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 $ExportLibrary=&main::ExportLibrary;
+	my $NoExportLibrary=&main::NoExportLibrary;
+	my $CompilerOption=&main::CompilerOption("GCC");
+	my $LinkerOption=&main::LinkerOption("GCC");
+
+	$Dlltool=$ToolPrefix.'$(DLLTOOL)';
+	$Archive=$ToolPrefix.'$(AR)';
+	$Link=$ToolPrefix.'$(GCC)';
+	$Objcopy=$ToolPrefix.'$(OBJCOPY)';
+
+	&Generic_Header(0, $Makecmd);	# define standard things using absolute paths
+	
+	push @MacroList, "__TOOLS__";
+	push @MacroList, "__TOOLS2_WINDOWS__";
+	push @MacroList, "__SUPPORT_CPP_EXCEPTIONS__";
+	push @MacroList, "__PRODUCT_INCLUDE__=\\\"${VariantFile}\\\"" if ($VariantFile);
+
+	# Remove __GCC32__ for TOOLS2 builds from the macro list.
+	my $count = 0;
+	foreach my $item (@MacroList) {
+		if ($item =~ m/GCC32/i) {
+			splice (@MacroList,$count,1)
+		}
+		$count++;
+	}
+
+
+#	GCC needs a fully-qualified path
+	&main::Output(
+		"\n",
+		"# must set both PATH and Path to make it work correctly\n",
+		"Path:=\$(Path)\n",
+		"PATH:=\$(Path)\n",
+		"\n"
+	);
+
+	&main::Output(
+		"INCDIR= -isystem \"$ENV{EPOCROOT}epoc32\\include\\tools\\stlport\" "
+	);
+
+	foreach (@SysIncPaths) {
+		&main::Output(
+			" -isystem \"$_\""
+		);
+	}
+
+	foreach (@UserIncPaths) {
+		&main::Output(
+			" -I \"$_\""
+		);
+	}
+
+	if($VariantFile){
+	    &main::Output("\\\n  -include $MinGWPreInclude");
+	}
+
+
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"GCCFLAGS=$PlatOpt{Gcc} \\\n",
+		"\t\t-pipe -c -Wall -W -Wno-ctor-dtor-privacy -Wno-unknown-pragmas",
+	);
+	
+	&main::Output(
+		" $CompilerOption",		# user-supplied compiler options
+		"\n",
+		"\n"
+	);
+	
+	&main::Output(
+ 		"\n# ADDITIONAL LINKER OPTIONS",
+ 		"\nUSERLDFLAGS = ",
+ 		$LinkerOption,
+  		"\n\n"
+  	);
+
+	&main::Output(
+		"GCCDEFS="
+	);
+
+	foreach(@MacroList) {
+		&main::Output(
+			" -D$_"
+		);
+	}
+
+	&main::Output(
+		" \$(USERDEFS)\n",
+		"\n"
+	);
+
+	&main::Output(
+		"MINGWPATH?=$MinGWInstall", "\n",
+		"DLLTOOL:=\$(MINGWPATH)\\dlltool", "\n",
+		"AR:=\$(MINGWPATH)\\ar", "\n",
+		"OBJCOPY:=\$(MINGWPATH)\\objcopy", "\n",
+		"GCC:=\$(MINGWPATH)\\g++", "\n" 
+	);
+	foreach (@BldList) {
+		&main::Output(
+			"GCC$_=\$(GCC)"
+		);
+		if (/^REL$/o) {
+			&main::Output(' -s ', $PlatOpt{Optimize});
+		}
+		elsif (/^DEB$/o) {
+			&main::Output(' -g');
+			unless (&main::SrcDbg) {
+				&main::Output(' ', $PlatOpt{Optimize});
+			}
+		}
+		&main::Output(' $(GCCFLAGS)');
+		foreach (&main::MacroList($_)) {
+			&main::Output(" -D$_");
+		}
+		&main::Output(" \$(GCCDEFS)\n");
+	}
+
+	&main::Output("\n","\n");
+
+	foreach (@BldList) {
+		&main::Output("$_ :");
+
+		if ($BasicTrgType !~ /IMPLIB/io) {
+			&main::Output (" \\\n\t",&Generic_Quote("\$(EPOCTRG$_)\\$Trg"));
+		}
+		&main::Output("\n","\n");
+	}
+
+	# Resource building is done entirely via cl_generic.pm
+
+	foreach (@BldList) {
+		&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(" $_");
+		}
+	}
+
+	&main::Output(
+		"\n",
+		"CLEANLIBRARY :\n"
+	);
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&Generic_MakeWorkDir('MAKEWORKLIBRARY',"${LibPath}LIB");
+
+	&Generic_Releaseables;
+}
+
+
+sub PMBld {
+	my @SrcList=&main::SrcList;
+	my $BaseTrg=&main::BaseTrg;
+	my $Bld=&main::Bld;
+	my $ChopBldPath=&main::Path_Chop(&main::BldPath);
+	my $EPOCIncPath=&main::EPOCIncPath;
+	my $BasicTrgType=&main::BasicTrgType;
+	my @LibList;
+	my $LibPath=&main::LibPath;
+	my $ChopRelPath=&main::Path_Chop(&main::RelPath);
+	my $RelPath=&main::RelPath;
+	my @StatLibList=&main::StatLibList;
+	my $StatLinkPath=&main::StatLinkPath;
+	my $Trg=&main::Trg;
+	my $TrgType=&main::TrgType;
+	my $ExportLibrary=&main::ExportLibrary;
+	my $NoExportLibrary=&main::NoExportLibrary;
+
+	if ($Bld =~ /DEB/) {
+		@LibList = &main::DebugLibList;
+	} else {
+		@LibList = &main::LibList;
+	}
+
+	# REAL TARGETS
+	#-------------
+	&main::Output(
+		"# REAL TARGET - BUILD VARIANT $Bld\n",
+		"\n"
+	);
+
+#	releasables
+	my @releaseables;
+	my $toolspath=&main::EPOCToolsPath();
+
+	if ($BasicTrgType!~/^LIB$/io)
+		{
+		push @releaseables, "$toolspath$Trg";
+		}
+	else
+		{
+		push @releaseables, "$RelPath$Trg";
+		}
+
+	if (!$NoExportLibrary && ($BasicTrgType!~/^(LIB|EXE)$/io)) {	
+		push @releaseables, "\$(EPOCLINK$Bld)\\lib$ExportLibrary.a";
+	}
+
+	&main::Output(
+		"WHAT$Bld : WHATGENERIC\n",
+		"\n",
+		"CLEAN$Bld : CLEANBUILD$Bld CLEANRELEASE$Bld\n",
+		"\n",
+		"CLEANBUILD$Bld : \n",
+		"\t\@perl -S ermdir.pl \"\$(EPOCBLD$Bld)\"\n",
+		"\n",
+		"CLEANRELEASE$Bld : CLEANGENERIC\n",
+		"\n"
+	);
+	&Generic_WhatCleanTargets($Bld, "WHAT$Bld", "CLEANRELEASE$Bld", @releaseables);
+
+	&Generic_MakeWorkDir("MAKEWORK$Bld",$ChopBldPath);
+	&Generic_MakeWorkDir("MAKEWORK$Bld",$ChopRelPath);
+
+	return if ($BasicTrgType=~/^IMPLIB$/io);
+
+	&main::Output(
+		"LISTING$Bld : MAKEWORK$Bld"
+	);
+	foreach (@SrcList) {
+		my $BaseSrc = &main::Path_Split('Base', $_);
+		my $Ext = &main::Path_Split('Ext', $_);
+   		&main::Output(
+			" \\\n\tLISTING$Bld$BaseSrc"
+   		);
+   	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	
+	&main::Output(
+		"OBJECTS$Bld="
+	);
+	foreach (@SrcList) {
+		my $BaseSrc = &main::Path_Split('Base', $_);
+		my $Ext = &main::Path_Split('Ext', $_);
+		&main::Output(
+			" \\\n\t", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o")
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		&Generic_Quote("\$(EPOCTRG$Bld)\\$Trg"), " : ",
+		&Generic_Quote("\$(OBJECTS$Bld)")
+	);
+	&main::Output(
+		" \$(LIBS$Bld)\n"
+	);
+#	Link target
+	if ($BasicTrgType=~/^EXE/o) {
+#		call g++ to link the target
+		&main::Output(
+			"\t$Link $PlatOpt{Ld}"
+		);
+		if ($Bld=~/^REL$/o) {
+			&main::Output(
+				" -s"
+			);
+		}
+		
+		&main::Output(
+			" -o \"\$(EPOCTRG$Bld)\\$Trg\" \\\n",
+			"\t\t\$(OBJECTS$Bld) \\\n"
+		);
+		&main::Output(
+			"\t\t-L\$(EPOCTRG$Bld) \\\n"
+		);
+			
+		# Add dynamic libraries (dlls on Windows, .so on *nix systems) to linker options
+		if (scalar @LibList)
+		{
+			&main::Output("\t\t-Wl,-Bdynamic ");
+		}
+		my $libs="";
+		foreach my $lib (@LibList)
+		{
+			$libs.="-l$lib ";
+		}
+		if ($libs ne "")
+		{
+			&main::Output(
+				"$libs \\\n"
+			);
+		}
+		
+		# Add static libraries (.a on both Windows and *nix) to linker options
+		if (scalar @StatLibList)
+		{
+			&main::Output("\t\t-Wl,-Bstatic ");
+		}
+		my $statLibs="-lstlport.5.1 ";
+		foreach my $lib (@StatLibList)
+		{
+			$statLibs.="-l$lib ";
+		}
+		if ($statLibs ne "")
+		{
+			$statLibs.="\\\n";
+		}
+		&main::Output(
+			"$statLibs"
+		);
+		
+		&main::Output(
+			"\t\t \$(USERLDFLAGS)\n"
+		);
+		&main::Output(
+			"\tcopy \"\$(EPOCTRG$Bld)\\$Trg\" \"",&main::EPOCToolsPath,"$Trg\"\n"
+		);
+	}
+	elsif ($BasicTrgType=~/^LIB$/o) {
+		&main::Output(
+			"\tif exist \"\$\@\" del \"\$\@\"\n",
+			"\t$Archive cr \$\@ \$^\n"
+		);
+	}
+	elsif ($BasicTrgType =~ /^DLL$/o)
+	{
+		&main::Output(
+			"\t$Link -shared -o \$@ -Wl,--out-implib,\$(EPOCLINK$Bld)\\" . "lib" . "$ExportLibrary.a \$(OBJECTS$Bld)",
+			"\n"
+		);
+		&main::Output(
+			"\tcopy \"\$@\" \"",&main::EPOCToolsPath,"$Trg\"\n"
+		);
+
+	}
+
+
+	&main::Output(
+		"\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;
+	my $ExtSrc=&main::ExtSrc;
+
+	return if (@DepList == 0);
+
+	foreach (@BldList) {
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$_)\\$BaseSrc.lis"), " ",
+			&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;
+	my $ExtSrc=&main::ExtSrc;
+
+	return if (@DepList == 0);
+
+	&main::Output(
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), " ",
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o"), " :",
+	);
+	foreach (@DepList) {
+		&main::Output(
+			" \\\n\t", &Generic_Quote($_)
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMEndSrcBld {
+	my $BaseSrc=&main::BaseSrc;
+	my $Bld=&main::Bld;
+	my $Src=&main::Src;
+	my $SrcPath=&main::Path_Chop(&main::SrcPath);
+	my $Ext=&main::Path_Split('Ext', $Src);
+	my $Plat=$main::Plat;
+
+	# Use GCC trick to get assembler source files preprocessed with CPP
+	$Src =~ s/\.s$/.S/i;	
+	&main::Output(
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o"), " : ",
+		&Generic_Quote("$SrcPath\\$Src"), "\n",
+		"\techo $Src\n",
+		"\t\$(GCC$Bld) -I \"$SrcPath\" \$(INCDIR) -o \$\@ \"$SrcPath\\$Src\"\n",
+		"\n",
+#		generate an assembly listing target too
+		"LISTING$Bld$BaseSrc : ", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), "\n",
+		"\t", &Generic_CopyAction("$SrcPath\\$BaseSrc.tools2.lst"),
+		"\n",
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), " : ",
+		&Generic_Quote("$SrcPath\\$Src"), "\n",
+		"\t\$(GCC$Bld) -Wa,-adln -I \"$SrcPath\" \$(INCDIR) -o nul: \"$SrcPath\\$Src\" > \$\@\n",
+		"\n"
+	);
+	
+}
+
+sub PMEndSrc {
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMEndSrcList {
+
+	# Deal with accumulated MAKEDIRS etc.
+
+	&Generic_End;
+}
+
+1;