diff -r fa9d7d89d3d6 -r 68f68128601f sbsv1/abld/genutil/prepfile.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sbsv1/abld/genutil/prepfile.pm Thu Nov 25 13:59:07 2010 +0000 @@ -0,0 +1,172 @@ +# Copyright (c) 1997-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: +# module for preprocessing makmake-style project files +# +# + + +package Prepfile; + +require Exporter; +@ISA=qw(Exporter); + +@EXPORT=qw( + Prepfile_SetVerbose Prepfile_SetUpperCase Prepfile_ProcessL Prepfile_SetCmdOptions +); + + +use Checkgcc; +use Pathutl; +use Preprocessor; + +my %Mode=( + Verbose=>0, + UpperCase=>0, + CmdOptions=>'' +); + +sub Prepfile_SetVerbose () { + $Mode{Verbose}=1; +} + +sub Prepfile_SetUpperCase () { + $Mode{UpperCase}=1; +} + +sub Prepfile_SetCmdOptions ($) { + $Mode{CmdOptions} = shift; + $Mode{CmdOptions} .= ' ' if $Mode{CmdOptions}; +} + +sub Prepfile_ProcessL ($$;$@) { +# use the C++ preprocessor to process a file. The function fills the data structure specified +# by the first argument, an array reference, according to the contents of the second argument - +# a filehandle. Any other arguments are assumed to be MACROS and are defined for preprocessing. + + my ($ArrayRef,$FILE,$VariantHRHFile,@Macros)=@_; + die "\nERROR: Project File \"$FILE\" not found\n" unless -e $FILE; + + my $exe = &PreprocessorToUseExe(); + my $cpp = "$exe.EXE $Mode{CmdOptions}-undef -nostdinc -+ "; + my @CppCall; + push @CppCall, $cpp; + + push @CppCall, join '', "-I ",&Path_PrefixWithDriveAndQuote("$ENV{EPOCROOT}epoc32\\include"), + " -I .", + " -I ",&Path_PrefixWithDriveAndQuote(&Path_Split('Path',$FILE)); + + my $Macro; + # add CL macros to the CPP call for preprocessing of the file + foreach $Macro (@Macros) { + $Macro=uc $Macro; # add the underscores so we can tell what has been + push @CppCall, "-D $Macro=_____$Macro"; # expanded and remove the space CPP puts in most of the time + } + #if a variant file is used + if(defined($VariantHRHFile)){ + my $variantFilePath = Path_Split('Path',$VariantHRHFile); + chop( $variantFilePath ); + push @CppCall, " -I " . &Path_PrefixWithDriveAndQuote($variantFilePath) . " -include " . &Path_PrefixWithDriveAndQuote($VariantHRHFile); + } + # all macros made upper case and suppress user-expansion of macros for nefarious purposes + + push @CppCall, &Path_PrefixWithDriveAndQuote($FILE); + if ($Mode{'Verbose'}) { + print "@CppCall\n"; + } + my $CPPPIPE; + open CPPPIPE,"@CppCall |" or die "ERROR: Can't invoke CPP.EXE\n"; + + # read the processed output + #-------------------------- + + my $LineNum=0; + my $FileName; + while () { + + # skip blank lines + if (/^\s*$/o) { + $LineNum++; + next; + } + + my @Tmp=(); + + # Process the file information lines that cpp inserts. + # (note that we don't currently do anything with the + # number cpp sometimes puts out after the filename - + # it's something to do with inclusion nesting levels) + if (/^# (\d+) "(.*)"( \d+)?/o) { + $LineNum = scalar $1; + my $CurFile=$2; + $CurFile=~s-\\\\-\\-go; + $CurFile=~s-\\\/-\\-go; + $CurFile=~s-\/\\-\\-go; + $CurFile=~s-\/\/-\\-go; + $CurFile=~s-\/-\\-go; + $CurFile=~s-(.:)--go; + + $CurFile=&Path_AbsToWork($CurFile); + @Tmp=('#', $CurFile); + push @{$ArrayRef}, [ @Tmp ]; + next; + } + + # Process file data + push @Tmp, $LineNum; + # get rid of the space that cpp puts in most of the time after macro expansion (CPP help doesn't say exactly when!) + # don't upper case everything until you've done this. + + foreach $Macro (@Macros) { + s/\/ _____$Macro /\/$Macro/g; + s/_____$Macro /$Macro/g; + s/_____$Macro/$Macro/g; + } + if(/^macro/i) + { + #Parse and Store the mmp file statement by retaining double quotes + while (/("([^\t\n\r\f]+)"|([^ \t\n\r\f]+))/go) { + my $Flag = $2 ? $2 : $3; + if($Flag =~ m/\\\"/) { + $Flag =~ s/\"\\/\\/g; + $Flag =~ s/\""/\"/g; + } + push @Tmp, $Flag; + } + } + else + { + #Parse and Store the mmp file statement by removing double quotes + while (/("([^"\t\n\r\f]+)"|([^ "\t\n\r\f]+))/go) { + push @Tmp, $2 ? $2 : $3; + } + } + push @{$ArrayRef}, [ @Tmp ]; + $LineNum++; + } + + if ($Mode{UpperCase}) { +# upper-case all the data + my $Line; + my $Item; + foreach $Line (@{$ArrayRef}) { + foreach $Item (@$Line) { + $Item=uc $Item; + } + } + } + close CPPPIPE or die $! ? "ERROR: Error closing $exe.exe pipe ($!)\n\t@CppCall\n" + : "ERROR: $exe.exe returned non-zero exit status ($?)\n\t@CppCall\n"; +} + +1;