sbsv1/abld/bldmake/wrappermakefile.pm
author Mike Kinghan <mikek@symbian.org>
Thu, 25 Nov 2010 13:59:07 +0000
changeset 40 68f68128601f
permissions -rw-r--r--
1) Add the sbsv1 components from sftools/dev/build to make the linux_build package independent of the obsolete buildtools package. 2) Enhance romnibus.pl so that it generate the symbol file for the built rom when invoked by Raptor 3) Make the maksym.pl tool portable for Linux as well as Windows. 4) Remove the of armasm2as.pl from the e32tools component in favour of the copy now exported from sbsv1/e32util.

# 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;