sbsv1/abld/platform/cl_gccxml.pm
changeset 629 541af5ee3ed9
parent 599 fa7a3cc6effd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/cl_gccxml.pm	Wed Aug 18 17:23:33 2010 +0300
@@ -0,0 +1,964 @@
+# Copyright (c) 2004-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:
+# Cl_gccxml;
+# 
+#
+
+package Cl_gccxml;
+
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+	PMHelp_Mmp
+	PMStartBldList
+	PMBld
+	PMStartSrcList
+	PMStartSrc
+	PMSrcDepend
+	PMSrcBldDepend
+	PMEndSrcBld
+	PMEndSrc
+	PMEndSrcList
+	PMBitMapBld
+	PMResrcBld
+
+);
+use cl_generic;
+use Genutl;
+use File::Path;
+use Cwd;
+use Pathutl;
+
+sub PMHelp_Mmp {
+	print "// No additional keywords for this platform\n";
+}
+
+	# takes an 'expression'  to evaluate with $_ bound to each of the
+	# remaining args
+	sub PrintList
+	{
+		my $expr = shift @_;
+		foreach (@_) {
+		my $str = eval($expr);
+		&main::Output($str);
+		}
+	}
+
+my $epocroot = $ENV{EPOCROOT};
+$epocroot=~ s-\\$--;            # chop trailing \\
+my $Makecmd;
+sub PMStartBldList($) {
+	($Makecmd) = @_;
+	my $BasicTrgType=&main::BasicTrgType;
+	my @BldList=&main::BldList;
+	my @ChopSysIncPaths=&main::Path_Chop(&main::SysIncPaths);
+	my @ChopUserIncPaths=&main::Path_Chop(&main::UserIncPaths);
+	my $RelPath="$epocroot\\EPOC32\\RELEASE";
+	my @MacroList=&main::MacroList();
+	my $VariantFile=&main::VariantFile();
+	my $Trg=&main::Trg;
+	my $DPath = &main::Path_RltToWork($epocroot);
+	my $DefFile = &main::DefFile;
+	my $EABIDefFile = &main::EABIDef;
+	my $ExtCompileOption = &main::CompilerOption("GCCXML");
+	
+	&Generic_Header(0,$Makecmd);	# define standard things using absolute paths
+
+	$DefFile="" if(!(-e $DefFile));
+	&main::Output(
+		"GXPTRGUDEB = $RelPath\\GCCXML\\UDEB\n",
+		"GXPTRGUREL = $RelPath\\GCCXML\\UREL\n\n",
+		"DEFFILE = $DefFile\n\n",
+        "EABIDEFFILE = $EABIDefFile\n\n"
+	);
+
+	&main::Output(
+		"INCDIR  ="
+	);
+
+	foreach (@ChopUserIncPaths) {
+		&main::Output(
+			" -I \"$_\""
+		);
+	}
+
+	&main::Output(
+		" -I- "
+	);
+
+	foreach (@ChopSysIncPaths) {
+		&main::Output(
+			" -I \"$_\""
+		);
+	}
+	if($VariantFile){
+	    &main::Output("\\\n  -include \"$VariantFile\"");
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output( 		
+		"GCCFLAGS= -nostdinc -Wall -Wno-ctor-dtor-privacy -Wno-unknown-pragmas -UWIN32 -fshort-wchar -quiet -w $ExtCompileOption\n",  # -fsyntax-only
+		"\n"
+	);
+
+	&main::Output(
+		"GCCDEFS = -D __EABI__ -D __SUPPORT_CPP_EXCEPTIONS__"
+	);
+	foreach(@MacroList) {
+		&main::Output(
+			" -D$_"
+		);
+	}
+	&main::Output(
+		" \$(USERDEFS)\n",
+		"\n"
+	);
+
+	foreach (@BldList) {
+		&main::Output(
+			"GCC$_ = gccxml_cc1plus -bi"
+		);
+		if (/REL$/o) {
+			&main::Output(
+				      ' -fomit-frame-pointer '
+			);
+		}
+		elsif (/DEB$/o) {
+			&main::Output(
+				' -g'
+			);
+		}
+		&main::Output(
+			' $(GCCFLAGS)'
+		);
+		foreach (&main::MacroList($_)) {
+			&main::Output(
+				" -D$_"
+			);
+		}
+                
+		&main::Output(
+			" \$(GCCDEFS)\n"
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+	
+	&main::Output(
+			"LIBRARY:\n",
+			"\t\@echo Nothing to do\n"
+	);
+
+	# Resource building is done entirely via cl_generic.pm
+	PrintList("\"\nRESOURCE\$_ : MAKEWORK\$_\"", @BldList)
+	&main::Output(
+		"\n",
+		"\n",
+	);
+
+	foreach (@BldList) {
+		&main::Output(
+			"$_ :"
+		);
+
+		if ($BasicTrgType !~ /IMPLIB/io) {
+			my $TrgBase = &main::Path_Split('base',$Trg);           
+			&main::Output (
+			" \\\n\t",
+			&Generic_Quote("\$(GXPTRG$_)\\$TrgBase$BasicTrgType.gxp")
+			);
+		}
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	}
+}
+
+# DumpToFile
+sub DumpMMPToFile
+{
+	my $rfiFileList;
+	my @rfiFiles;
+	if(scalar @_) # if an argument has been passed then it is a reference to the list of .RFI files.
+	{
+		($rfiFileList) = @_;
+		@rfiFiles = @$rfiFileList;
+	}
+
+	my $BldPath=&main::BldPath;
+	my $Target = &main::Trg; 
+	my $TargetBase = &main::Path_Split('Base', $Target); 
+	my $Gxpurel="$epocroot\\epoc32\\release\\gccxml\\urel";
+	my $Gxpudeb="$epocroot\\epoc32\\release\\gccxml\\udeb";
+	unless (-d $BldPath) {
+		mkpath([$BldPath]);
+	}
+	unless (-d $Gxpurel) {
+		mkpath([$Gxpurel]);
+	}
+	unless (-d $Gxpudeb) {
+		mkpath([$Gxpudeb]);
+	}
+    $BldPath = (&main::Path_StepDirs($BldPath))[-2];
+	use File::Basename;
+    my $FileName = basename(&main::MmpFile());
+    $FileName = $BldPath.$FileName.".xml";
+    open FILE,"> $FileName" or die "Cannot open mmp info dump file $FileName: $!";
+    print FILE "<?xml version=\"1.0\"?>\n<mmpInfo>\n"; 
+   
+    my $Path = &main::RelPath();
+    my $MmpFile = &main::MmpFile();  
+    my $TrgType = &main::TrgType(); 
+    my $TrgPath = &main::TrgPath(); 
+    print FILE "\t<mmp path=\"$MmpFile\"/>\n"; 
+	print FILE "\t<target name=\"$Target\" type=\"$TrgType\" ";
+    
+	if(not $TrgPath eq '') 
+	{
+		print FILE "path=\"$TrgPath\""; 
+	}
+	print FILE "/>\n";
+	# insert current working directory
+	my $WorkPath = &main::Path_WorkPath();
+	print FILE "\t<cwd path=\"$WorkPath\"/>\n";
+    
+    my $ABI = &main::ABI; 
+    print FILE "\t<abi type=\"$ABI\"/>\n"; 
+    my $LinkAs = &main::LinkAs;
+    print FILE "\t<linkAs name=\"$LinkAs\"/>\n"; 
+    my $LinkAsBase = &main::LinkAsBase;
+    print FILE "\t<linkAsBase name=\"$LinkAsBase\"/>\n"; 
+    
+    # Uids
+    my @UidList=&main::UidList;
+    my $count = 0;
+    print FILE "\t<uids";
+    foreach my $uid(@UidList)
+    {
+		print FILE " u$count=\"$uid\"" ;
+		$count++; 
+    }
+    print FILE "/>\n";
+    
+    # Versioning 
+    my %Version = &main::Version; 
+    print FILE "\t<version";
+    foreach my $var (sort keys %Version)
+    {
+        print FILE " $var=\"$Version{$var}\"";
+    }
+    print FILE "/>\n";
+    
+    # Capabilities
+    my $Capability = &main::Capability;
+    print FILE "\t<capability id=\"$Capability\"/>\n"; 
+    
+	# DefFile
+	my $DefFile = &main::DefFile;
+	$DefFile="" if(!(-e $DefFile));
+	print FILE "\t<defFile path=\"$DefFile\" type=\"GCC\"/>\n";
+
+	# EABIDefFile
+	my $EABIDefFile = &main::EABIDef;
+	print FILE "\t<defFile path=\"$EABIDefFile\" type=\"EABI\"/>\n";
+        
+    # Handle All types of libraries
+    my $FirstLib = &main::FirstLib; 
+    my @LibList = &main::LibList;
+    my @ASSPLibList = &main::ASSPLibList;
+    my @StatLibList = &main::StatLibList;;    
+    print FILE "\t<libs>\n"; 
+    
+	#first
+    print FILE "\t\t<lib name=\"$FirstLib\" type=\"First\"/>\n"; 
+    
+    #  normal
+    foreach my $lib (@LibList)
+    {
+        print FILE "\t\t<lib name=\"$lib\"/>\n"; 
+    }
+    # ASSP Specific
+    foreach my $lib (@ASSPLibList)
+    {
+        print FILE "\t\t<lib name=\"$lib\" type=\"ASSP\"/>\n";
+    }
+    
+    # Static Libraries
+    foreach my $lib (@StatLibList)
+    {
+        print FILE "\t\t<lib name=\"$lib\" type=\"Static\"/>\n";
+    }
+    print FILE "\t</libs>\n";
+
+    # Resources
+    print FILE "\t<resources>\n";
+    my $rfiFile;
+    foreach $rfiFile (@rfiFiles)
+    {
+	    print FILE "\t\t<resource name=\"$rfiFile\"/>\n";
+    }
+    print FILE "\t</resources>\n";
+
+    close FILE;
+}
+	
+sub PMBld {
+	my @ASSPLibList=&main::ASSPLibList;
+	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 $ChopRelPath=&main::Path_Chop(&main::RelPath);
+	my $RelPath=&main::RelPath;
+	my $Trg=&main::Trg;
+	my $TrgType=&main::TrgType;
+	my @UidList=&main::UidList;
+	# DefFile
+	my $DefFile = &main::DefFile;
+	# EABIDefFile
+	my $EABIDefFile = &main::EABIDef;
+
+	my $rfiList = GatherResourceInformation();
+	my @RfiFiles = @$rfiList;
+
+
+
+	DumpMMPToFile(\@RfiFiles);
+
+	# REAL TARGETS
+	#-------------
+	&main::Output(
+		"# REAL TARGET - BUILD VARIANT $Bld\n",
+		"\n"
+	);
+
+	&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"
+	);
+	my @releaseables;
+	&Generic_WhatCleanTargets($Bld, "WHAT$Bld", "CLEANRELEASE$Bld", @releaseables);
+	&Generic_MakeWorkDir("MAKEWORK$Bld",$ChopBldPath);
+	&Generic_MakeWorkDir("MAKEWORK$Bld",$ChopRelPath);
+	&Generic_Releaseables;
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	# XML Stuff
+	&main::Output(
+				&Generic_Quote("\$(GXPTRG$Bld)\\$BaseTrg$BasicTrgType.gxp"), " : ",
+				&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseTrg$BasicTrgType.gxp"),
+				"\n\tcopy \"\$(EPOCBLD$Bld)\\$BaseTrg$BasicTrgType.gxp\" \"\$@\""
+	); 
+	
+	&main::Output(
+		"\n",
+		"\n"
+	);
+        
+	# TARGET *.GXP
+	#------------
+	if (scalar @SrcList >150) {
+		# deal with very long lists by splitting them into 150 file pieces, which allows
+		# about 200 bytes per filename if the underlying max size is 32K
+		#
+
+		my $counter1=150;	# i.e. trigger new variable immediately
+		my $counter2=0;
+		my @objvarlist=();
+		foreach (@SrcList) {
+			if ($counter1==150) {
+				$counter1=0;
+				$counter2++;
+				my $objvar = "OBJECTS$Bld$counter2";
+				push @objvarlist, " \$($objvar)";
+				&main::Output(
+					"\n",
+					"$objvar="
+				);
+			}
+			my $BaseSrc = &main::Path_Split('Base', $_);
+			my $Ext = &main::Path_Split('Ext', $_);
+			$BaseSrc.='_' if (lc($Ext) eq '.cia');
+			&main::Output(
+				" \\\n\t", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.xml")
+			);
+			$counter1++;
+		}
+		use File::Basename;
+	    my $FileName = basename(&main::MmpFile()).".xml";
+		&main::Output(
+			" \\\n\t\$(EPOCBLD)\\$FileName",
+			"\n",
+			"\n",
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseTrg$BasicTrgType.gxp"), " : ", @objvarlist,"\n",
+			"\tif exist \"\$\@\" del \"\$\@\"\n"
+		);
+		foreach (@objvarlist) {
+			&main::Output(
+				"\tzip -j \$\@$_\n"
+			);
+		}
+		&main::Output(
+			"\tif exist \$(EABIDEFFILE) zip -j \$\@ \$(EABIDEFFILE)\n",
+			"\n\n"
+		);
+	} else {
+		# shorter lists remain unchanged
+		#
+		&main::Output(
+			"OBJECTS$Bld="
+		);
+		use File::Basename;
+	    my $FileName = basename(&main::MmpFile()).".xml";
+
+		&main::Output("\$(EPOCBLD)\\$FileName");
+        foreach (@SrcList) {
+			my $BaseSource = &main::Path_Split('Base', $_);
+			my $Ext = &main::Path_Split('Ext', $_);
+			$BaseSource.='_' if (lc($Ext) eq '.cia');
+			&main::Output(
+			" \\\n\t", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSource.xml")
+			);
+		}       
+		
+		&main::Output(
+			"\n",
+			"\n"
+		);
+
+		&main::Output("RESOURCEINFO$Bld=");
+		foreach (@RfiFiles)
+		{
+			&main::Output(" \\\n\t\$(EPOCBLD)\\$_");
+		}
+		&main::Output("\n\n");
+
+		&main::Output(
+
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseTrg$BasicTrgType.gxp"), " : \$(OBJECTS$Bld) \$(EABIDEFFILE) \$(RESOURCEINFO$Bld)\n",
+
+			"\tif exist \"\$\@\" del \"\$\@\"\n",
+			"\tzip -j \$\@ \$^ \$(EABIDEFFILE) \$(RESOURCEINFO$Bld)\n",
+			"\n\n"
+		);
+	}
+}
+
+
+sub PMStartSrcList {
+
+	&main::Output(
+		"# SOURCES\n",
+		"\n"
+	);
+}
+
+sub PMBitMapBld {
+	&Generic_BitMapBld;
+}
+
+sub PMResrcBld {
+	&Generic_ResrcBld;
+}
+
+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;
+	my $cia = (lc($ExtSrc) eq '.cia') ? "_" : "";
+
+	return if (@DepList == 0);
+
+	foreach (@BldList) {
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$_)\\$BaseSrc$cia.lis"), " ",
+			&Generic_Quote("\$(EPOCBLD$_)\\$BaseSrc$cia.xml"), " \\\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;
+	my $cia = (lc($ExtSrc) eq '.cia') ? "_" : "";
+
+	return if (@DepList == 0);
+
+	&main::Output(
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc$cia.lis"), " ",
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc$cia.xml"), " :",
+	);
+	foreach (@DepList) {
+		&main::Output(
+			" \\\n\t", &Generic_Quote($_)
+		);
+	}
+	&main::Output( 
+		"\n",
+		"\n"
+	);
+}
+
+my %sources;
+
+sub PMEndSrcBld {
+	my $ABI=&main::ABI;
+	my $BaseSrc=&main::BaseSrc;
+	my $Bld=&main::Bld;
+	my $Src=ucfirst lc &main::Src;
+	my $SrcPath=&main::SrcPath;
+	my $Ext = &main::Path_Split('Ext', $Src);
+	my $Cia = (lc($Ext) eq '.cia') ? 1 : 0;
+
+	my $ChopSrcPath=&main::Path_Chop($SrcPath);
+
+	# add source path, source file and build type to hashmap. 
+    $sources{$SrcPath}{$Src}{$Bld}=1;
+   
+	# Use GCC trick to get assembler source files preprocessed with CPP
+	$Src =~ s/\.s$/.S/i;
+
+	if ($Cia) {
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.xml"), " : ",
+			&Generic_Quote("$SrcPath$Src"), "\n",
+			"\t\$(GCC$Bld) -D__CIA__ -I \"$ChopSrcPath\" \$(INCDIR) -fxml=\$\@ -o nul \"$ChopSrcPath\\$Src\"\n",
+			"\n",
+		);
+	} else {
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.xml"), " : ",
+			&Generic_Quote("$SrcPath$Src"), "\n",
+			"\t\$(GCC$Bld) -I \"$ChopSrcPath\" \$(INCDIR) -fxml=\$\@ -o nul \"$ChopSrcPath\\$Src\"\n",
+			"\n",
+		);
+	}
+
+	#Keep the staus of the dependency-generation-flag was enabled or disabled.
+	my $Deps_Stat = &main::Deps_GetNoDependencies();
+	if($Deps_Stat){
+		#If the no-dependency-generation-flag turned on, turn it off temporarily, so that we can get 
+		#the dependencies.
+		&main::Deps_SetNoDependenciesStatus(0);
+	}
+	# Code to print the log file includeheaders.txt
+	my $IncFileName = "$epocroot\\epoc32\\release\\gccxml\\includeheaders.txt";
+	open INC_FILE,">> $IncFileName" or die "Cannot open file $IncFileName";
+
+	#Get the dependencies for the current source file.
+	my @DepList=&main::Deps_GenDependsL("$SrcPath$Src");
+	foreach(@DepList) {
+		print INC_FILE "$_\n";
+	}
+	close INC_FILE;
+	
+	#Set the dependency-generation-flag to its original state so that, it doesn't affect the other target 
+	#builds.
+	&main::Deps_SetNoDependenciesStatus($Deps_Stat);
+
+	# Code to print the existance of the file in logs
+	my $neededfile="$epocroot\\epoc32\\release\\gccxml\\includeheaders.txt";
+	if (!-e $neededfile)
+	{ 
+		print "!!! File $epocroot\\epoc32\\release\\gccxml\\includeheaders.txt does not exist\n";
+	}
+}
+
+sub PMEndSrc {
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMEndSrcList {
+        my $BldPath=&main::BldPath;
+        my $Target = &main::Trg; 
+        my $TargetBase = &main::Path_Split('Base', $Target);
+		use File::Basename;
+	    my $FileName = basename(&main::MmpFile());
+	    $FileName = $BldPath.$FileName.".xml";
+        open FILE,">> $FileName" or die "Cannot open mmp info dump file $FileName: $!";
+		my $path;
+        foreach $path (keys %sources)
+        {
+            my %thing =  %{$sources{$path}}; # {"UREL"}; 
+            my $file;
+            foreach $file (keys %thing)
+            {
+                if( defined $thing{$file}{"UREL"})
+                {
+                    if( defined  $thing{$file}{"UDEB"} )
+                    {
+                        print FILE "\t<sourceFile name=\"$file\" path=\"$path\"/>\n";
+                    }
+                    else
+                    {
+                        print FILE "\t<sourceFile name=\"$file\" path=\"$path\" type=\"UREL\"/>\n";
+                    }
+                }
+                else
+                {
+                    if(defined $thing{$file}{"UDEB"})
+                    {
+                        print FILE "\t<sourceFile name=\"$file\" path=\"$path\" type=\"UDEB\"/>\n";
+                    }
+                    else
+                    {
+                        die "Should Never Get HERE!";
+                    }
+                }
+                
+            }
+        }
+        
+
+
+        my $BldInfDir=&Path_WorkPath;
+        my $PrjBldDir=$E32env::Data{BldPath};
+        $PrjBldDir=~s-^(.*)\\-$1-o;
+        $PrjBldDir.=$BldInfDir;
+        $PrjBldDir=~m-(.*)\\-o; # remove backslash because some old versions of perl can't cope
+
+
+        ### the export call is like this
+        my $lCmd = "make -r -f \"${PrjBldDir}EXPORT.make\" WHAT";
+        my @lExportDump = split(/\n/,`$lCmd`);
+        foreach my $lLine (@lExportDump) {
+            $lLine =~ s/"//g;
+            chomp($lLine);
+            if($lLine =~ /.*\.h/i) {
+                print FILE "\t<export name=\"$lLine\"/>\n";
+            }
+        }
+
+		print FILE "</mmpInfo>\n\n";
+        close FILE;
+
+
+
+		&Generic_End;
+}
+
+
+sub GetRelDir
+{
+	my ($fileName) = @_;
+	$fileName = CleanPath($fileName); # make sure that /'s are use rather than \ or \\
+	if($fileName!~m-\/-) # no directory, just a file name, so return ./
+	{
+		return "./";
+	}
+	elsif($fileName=~m-^(.*\/)[^\/]+$-) # return directory
+	{
+		return $1;
+	}
+	else # don't know how could get here
+	{
+		return "./";
+	}
+}
+
+
+sub SearchMmpFile
+{
+	my @rfiFiles;
+	my @SystemIncludes = &main::SysIncPaths;
+	my @UserIncludes = &main::UserIncPaths;
+	my $ResourceStruct = &main::ResourceStructRef;
+	
+	foreach my $ResourceStructure (@$ResourceStruct)
+	{
+		push @rfiFiles, AnalyseResourceFile($$ResourceStructure{Source}, \@SystemIncludes, \@UserIncludes);
+	}
+	return \@rfiFiles;
+}
+
+sub AnalyseResourceFile
+{ # when get to here $rssFile should be fully qualified relative to mmp file location (i.e. base: .../name.rss)
+	my ($rssFile, $systemIncludeList, $userIncludeList) = @_;
+	my @resourceRelatedFiles = ($rssFile);
+	my $baseFile = 0; #flag to indicate whether this is the base file which the rfi file is named after
+	my $rssItem;
+	my $containerFile;
+	foreach $rssItem (@resourceRelatedFiles) #@resourceRelatedFiles is added to during this foreach loop as included files are found
+	{
+		$rssItem = CleanPath($rssItem);
+		if( ! ($baseFile) )
+		{
+			$baseFile = 1; # set to non-zero so that setting up the rfi file is only done once
+			if($rssItem =~m-\/-)
+			{
+				if($rssItem =~m-^\S*\/([^\/]+)$-) # just extracts file name
+				{
+					$containerFile = $1 . ".rfi";
+				}
+			}
+			else
+			{
+				$containerFile = $rssItem . ".rfi";
+			}
+			open CONTAINER, ">$containerFile";
+		}
+		OutputHeader($rssItem);
+		my $resourceFiles = ReadFile($rssItem, \@resourceRelatedFiles, $systemIncludeList, $userIncludeList);
+		@resourceRelatedFiles = @$resourceFiles;
+	}
+	close CONTAINER;
+	return $containerFile;
+}
+
+sub CheckForInclude
+{ # check whether the passed line from the resource type file is a #include line, if it is then store it to be added to the rfi file
+	my ($line, $dir, $resourceFiles, $systemIncludeList, $userIncludeList) = @_;
+	my @resourceFiles = @$resourceFiles;
+	if($line =~ /^\s*\#include\s+([\<\"])(\S+)([\>\"])(\s+\/\/.*)?/)
+	{
+		if( ($1 eq "\"") and ($3 eq "\"") )
+		{
+			my $possibleAddition = SearchDirectories($2, "quoted", $dir, $systemIncludeList, $userIncludeList);
+			if($possibleAddition ne "")
+			{
+				push @resourceFiles, $possibleAddition;
+			}
+		}
+		elsif( ($1 eq "\<") and ($3 eq "\>") )
+		{
+			my $possibleAddition = SearchDirectories($2, "angle", $dir, $systemIncludeList, $userIncludeList);
+			if($possibleAddition ne "")
+			{
+				push @resourceFiles, $possibleAddition;
+			}
+		}
+	}
+	return \@resourceFiles;
+}
+
+sub ReadFile
+{ # copy the passed file into the rfi file and check it for included files
+	my ($fileName, $resourceFiles, $systemIncludeList, $userIncludeList) = @_;
+	my $dir = GetRelDir($fileName);
+
+	open RESOURCE, $fileName or die "Can't open file $fileName from " . cwd() . "\n";
+	my $line;
+	foreach $line (<RESOURCE>)
+	{
+		print CONTAINER $line;
+		$resourceFiles = CheckForInclude($line, $dir, $resourceFiles, $systemIncludeList, $userIncludeList);
+	}
+	close RESOURCE;
+	return $resourceFiles;
+}
+
+sub OutputHeader
+{
+	my ($fileName) = @_;
+	print CONTAINER "\n\n/* GXP ***********************\n";
+	if($fileName =~m-\/-)
+	{ # remove path as only want to store file name
+		if($fileName =~m-^\S*\/([^\/]+)$-)
+		{
+			print CONTAINER " * $1\n";
+		}
+	}
+	else
+	{
+		print CONTAINER " * $fileName\n";
+	}
+	print CONTAINER " ****************************/\n\n";
+}
+
+
+sub RecordSystemIncludes
+{
+	my ($line) = @_;
+	my @terms = split(/ /, $line);
+	my $term;
+	my @systemIncludes = ();
+	foreach $term (@terms)
+	{
+		if($term!~m/\/\//) # if term is not the start of a c++ style comment
+		{
+			push @systemIncludes, $term;
+		}
+		else
+		{
+			last;
+		}
+	}
+	return \@systemIncludes;
+}
+
+sub RecordUserIncludes
+{
+	my ($line) = @_;
+	my @terms = split(/ /, $line);
+	my $term;
+	my @userIncludes = ();
+	foreach $term (@terms)
+	{
+		if($term!~m/\/\//) # if term is not the start of a c++ style comment
+		{
+			push @userIncludes, $term;
+		}
+		else
+		{
+			last;
+		}
+	}
+	return \@userIncludes;
+}
+
+sub CleanPath # change \ and \\ in path to /
+{
+	my ($fileName) = @_;
+	$fileName =~ s-\\\\-\/-og;
+	$fileName =~ s-\\-\/-og;
+	return $fileName;
+}
+
+sub RecordSourcePath
+{
+	my ($line) = @_;
+	my $sourcePath;
+	if($line=~/^(\S+)/) # in case of comments at end of line
+	{
+		$sourcePath = $1;
+		$sourcePath = CleanPath($sourcePath);
+		if($sourcePath !~ m/\/$/)
+		{
+			$sourcePath .= "\/";
+		}
+	}
+	return $sourcePath;
+}
+
+sub SearchDirectories
+{
+	my ($fileName, $includeType, $base, $systemIncludeList, $userIncludeList) = @_;
+	my @systemIncludes = @$systemIncludeList;
+	my @userIncludes = @$userIncludeList;
+
+	$fileName = CleanPath($fileName);
+
+	if(-e $base.$fileName)
+	{
+		return $base.$fileName;
+	}
+	if($includeType eq "quoted")
+	{
+		# search through the user includes and return dir + file name if found
+		my $directory;
+		foreach $directory (@userIncludes)
+		{
+			my $qualifiedFileName = $directory . "/" . $fileName;
+			if(-e $qualifiedFileName)
+			{
+				return $qualifiedFileName;
+			}
+		}
+	}
+
+	# search through the system includes
+	my $directory;
+	foreach $directory (@systemIncludes)
+	{
+		my $qualifiedFileName = $directory . "/" . $fileName;
+		if(-e $qualifiedFileName)
+		{
+			return $qualifiedFileName;
+		}
+	}
+	return "";
+}
+
+
+sub GatherResourceInformation
+{
+	my $BldPath=&main::BldPath;
+	unless (-d $BldPath) {
+		mkpath([$BldPath]);
+	}
+	$BldPath = (&main::Path_StepDirs($BldPath))[-2];
+	my $bldInfDirectory = cwd(); # store current directory so can return to it later
+	my $MmpFile = &main::MmpFile();
+	$MmpFile = CleanPath($MmpFile);
+	my $MmpFileDir = "./";
+	my $MmpFileName = $MmpFile;
+	if($MmpFile=~m-\/-)
+	{
+		if($MmpFile=~m-^(.*)\/([^\/]*)$-)
+		{
+			$MmpFileDir = $1;
+			$MmpFileName = $2;
+		}
+	}
+	chdir($MmpFileDir) or die "Error: Could not change to MMP file directory: $MmpFileDir\n";
+	
+	my $rfiFileList = &SearchMmpFile; # analyse the mmp file for resource files
+
+	my @RfiFiles = @$rfiFileList;
+	foreach (@RfiFiles) # copy the rfi files to the BldPath and delete them from temporary locations
+	{
+		system("copy \"$_\" \"$BldPath$_\"");
+		unlink $_;
+	}
+	chdir($bldInfDirectory); # return to the orignial directory
+
+	return \@RfiFiles; # return list of rfi files to be added to .mmp.xml file
+}
+1;