sbsv1/abld/bldmake/wrappermakefile.pm
changeset 599 fa7a3cc6effd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/bldmake/wrappermakefile.pm	Fri Jun 25 17:29:25 2010 +0800
@@ -0,0 +1,158 @@
+# Copyright (c) 2007-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		wrappermakefile;
+require Exporter;
+@wrappermakefile::ISA=qw(Exporter);
+@wrappermakefile::EXPORT=qw(
+	GenerateWrapper
+);
+
+use Output;
+
+my (@ExtensionUsedBefore);
+my $ExtTemplatesPath="$ENV{EPOCROOT}epoc32/tools/makefile_templates/";
+$ExtTemplatesPath=~ s/\\/\//g;  # convert win32 slashes to unix slashes
+my $DieRef;
+our $ExtMakefileMissing = 0;
+
+# Add prototyes to avoid -w warnings
+sub GenerateWrapper($$$$@);  
+sub ReadMetaFile($$$$);
+
+
+sub GenerateWrapper($$$$@) {	
+	my ($Plat,$OutDir, $ErrorString, $dieRef, @ExtensionBlockData) = @_;
+	$DieRef = $dieRef;
+	
+#	Generates a makefile which contains the settings for each invocation of an extension and calls
+#	through to the extension template makefile in /epoc32/tools/makefile_templates.
+#	@ExtensionBlockData holds the settings (makefile MACROs) defined within the start..end block in the bld.inf.
+
+	my $ExtHeader = shift(@ExtensionBlockData);
+
+	if (uc $ExtHeader->[0] ne "EXTENSION") {
+		&main::FatalError("$ErrorString : Extension Template blocks must contain the 'extension' keyword.\n");
+	}
+	if ($ExtHeader->[1] eq "") {
+		&main::FatalError("$ErrorString : The 'extension' does not have a name, the correct format is: 'start extension <name>'.\n");
+	}
+	my $ExtName = $ExtHeader->[1];
+
+#	Ensure that each extension invocation is uniquely identified by means of the global array 
+#	ExtensionUsedBefore.
+	my $Count=0;
+	push @ExtensionUsedBefore, $ExtName.$Plat;
+	foreach my $item(@ExtensionUsedBefore) {
+		if ($item eq $ExtName.$Plat) {
+			$Count = $Count + 1;
+		}
+	}
+
+#	Process the meta information for this extension template.
+	my %Data;
+	my %WrapperMakefileData = ReadMetaFile($ExtName, $ErrorString, \$Data{Makefile},$dieRef);
+	if ($ExtMakefileMissing)
+	{
+		main::ExtensionMakefileMissing($ExtMakefileMissing);
+		return;
+	}
+	$Data{Ext}='.MK';
+	$Data{Base}=$ExtName."_".$Plat."_".$Count;
+	$Data{Path}=$OutDir."wrappermakefiles/";
+
+#	Process ExtensionBlockData
+	foreach my $ExtBlockStatement (@ExtensionBlockData) {
+		my $Key = shift(@$ExtBlockStatement);
+		$WrapperMakefileData{$Key}=$ExtBlockStatement;
+	}
+
+#	CreateWrapperMakefile
+	&Output("# Bldmake generated wrapper makefile\n\n");
+	foreach my $Key (keys (%WrapperMakefileData))
+	{
+			&Output("$Key = "); 
+			foreach my $item(@{$WrapperMakefileData{$Key}}) {
+				&Output(" $item");
+			}
+			&Output("\n");
+	}
+	my $Filename = lc("$ExtName$Data{Ext}");
+	&Output("\ninclude $ExtTemplatesPath$Filename"); 
+	my $Path = lc("$Data{Path}");
+	&main::WriteOutFileL(lc ($Path.$ExtName."_".$Plat."_".$Count.$Data{Ext}));
+	%WrapperMakefileData = ();
+	return %Data;  
+}
+
+#  Read extension meta file data
+sub ReadMetaFile($$$$) {
+	my ($ExtName, $ErrorString, $Makefile,$dieRef) = @_;
+
+#	Parse the .meta file (found via $ExtName) for this extension template and return a hash 
+#	containing the default values (makefile MACROs) for this template.
+#	$Makefile is updated to indicate whether this a gnumake or nmake makefile.
+
+	my %MetaData;
+	my $Filename = lc("$ExtName");
+	$ExtMakefileMissing=0;
+	if (!open(METAFILE,"$ExtTemplatesPath$Filename.meta"))
+	{
+		&main::WarnOrDie($dieRef, "$ErrorString : Extension: $ExtName - cannot open META file: $ExtTemplatesPath$Filename.meta\n");
+		$ExtMakefileMissing = 1;
+		return;
+	}
+	LINE: while (<METAFILE>) {
+		chomp;		
+		my @Elements = split(/\s*\s\s*/);		
+		my $Keyword = uc shift(@Elements);
+
+		if ((! $Keyword) or ($Keyword =~ m/^#/)) {
+			next LINE;
+		}
+
+		if ($Keyword eq "MAKEFILE") {	
+			my $Makefiletype = uc shift(@Elements);		
+			if ($Makefiletype eq "GNUMAKE") {
+				$$Makefile=1;
+			}
+			if ($Makefiletype eq "NMAKE") {
+				$$Makefile=2;
+			}
+		}
+		elsif ($Keyword eq "OPTION") {
+			my $Key = shift(@Elements);
+			if ((! $Key) or (! $Elements[0])) {
+					&main::FatalError("$ErrorString : There is a syntax error in the META file ($ExtTemplatesPath$Filename.meta) for this extension ($ExtName) - the correct format for default options is: 'option <key> <value>'");
+				}
+			my @Values = @Elements;
+			$MetaData{$Key}=\@Values;
+		} 
+		elsif (($Keyword eq "TECHSTREAM") or ($Keyword eq "PLATFORM")) {
+			# not used
+		}
+		else {
+			&main::FatalError("$ErrorString : There is a syntax error in the META file ($ExtTemplatesPath$Filename.meta) for this extension ($ExtName) - unrecognised keyword:$Keyword");	
+		}
+	}
+	if (! $$Makefile) {
+		&main::FatalError("$ErrorString : There is a syntax error in the META file ($ExtTemplatesPath$Filename.meta) for this extension ($ExtName) - makefile type not specified [gnumake|nmake]");
+	}
+	close(METAFILE) or &main::FatalError("$ErrorString : Extension: $ExtName - cannot close Meta File:$ExtTemplatesPath$ExtName.meta\n");
+	return %MetaData;
+}
+
+1;