ROM Tools 13.1.0.1
Bug468 initialized static data built into a static library does not get initialized correctly
# 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;