imgtools/buildrom/tools/buildrom.pm
changeset 697 818fe0ed324b
parent 654 7c11c3d8d025
child 706 5221386d044b
child 712 df89378e9223
--- a/imgtools/buildrom/tools/buildrom.pm	Wed Nov 17 16:47:55 2010 +0800
+++ b/imgtools/buildrom/tools/buildrom.pm	Thu Nov 18 16:02:32 2010 +0800
@@ -67,7 +67,7 @@
 my $enforceFeatureManager = 0; # Flag to make Feature Manager mandatory if SYMBIAN_FEATURE_MANAGER macro is defined. 
 
 my $BuildromMajorVersion = 3 ;
-my $BuildromMinorVersion = 31;
+my $BuildromMinorVersion = 32;
 my $BuildromPatchVersion = 0;
 
 
@@ -75,13 +75,18 @@
 {
 
 	# Option "-fm" will be supported instead of option "-f|fr" if SYMBIAN_FEATURE_MANAGER macro is defined.
-	my $featuresOptionUsage = "-ffeatureuids or -fr=featureuids -- feature registry database XML file name";
+	my $featuresOptionUsage = "-ffeatureuids or -fr=featureuids -- [obsolete] Feature registry database XML file name\n". 
+							   "                                       Please use featureconfigurator.pl to configurate features.\n\n".
+							   "   -nofm                            -- Don't perform feature configuration \n\n"; 
 	if ($enforceFeatureManager) 
 	{
-		$featuresOptionUsage = "-fm=featuredatabasefile          -- feature manager/feature registry database XML file name.\n".
-							   "\t\t\t\t    Multiple XML files can be passed seperated by commas.\n".
-							   "   -nofm=featuresdatafile           -- don't generate features data file.".
-							   " Instead use pre-built features data file.";
+		$featuresOptionUsage = "-fm=featuredatabasefile          -- [obsolete] Feature manager/feature registry database XML file name.\n".
+							   "                                       Multiple XML files can be passed seperated by commas.\n". 
+							   "                                       Please use featureconfigurator.pl to configurate features.\n\n".				
+							   "   -nofm=featuresdatafile           -- [obsolete] Don't generate features data file.\n".
+							   "                                       Use pre-built features data file instead.\n". 
+							   "                                       Please use featureconfigurator.pl to configurate features.\n\n".
+							   "   -nofm                            -- Don't perform feature configuration\n\n";							  
 	}
 
 #........1.........2.........3.........4.........5.........6.........7.....
@@ -117,7 +122,8 @@
    -p                               -- preserves the intermediate files pertaining to data drive, Z drive and BMCONV
    -spi                             -- enable producing SPI files
    -spiplacement                    -- enable positioning of spi file
-   -w                               -- warn if file has been selected from a different directory 
+   -w                               -- warn if file has been selected from a different directory
+   
    $featuresOptionUsage
    -etool                           -- external tool specification (xx is tool's perl module)
    -compress                        -- compression type of ROM image:
@@ -159,7 +165,9 @@
    -prependepocroot                 -- if there is no EPOCROOT## before /epoc32/, prepend EPOCROOT## to epoc32.
    -stdcpp                          -- ignore symbian customized cpp and try to find another cpp in the PATH.(for Windows only)
    -cpp=xxx                         -- specify a CPP preprocessor used by Buildrom.
-   -xiponly                      -- just create the XIP ROM image without creating the ROFS image.
+   -xiponly                         -- just create the XIP ROM image without creating the ROFS image.
+   -nopreprocess                    -- Input oby files have been or don't need to be preprocessed,
+                                       don't preprocess the input oby files.
    -inputoby=<finalOBYfile>         -- Ignore BUILDROM config phase, invoke Rombuild/Rofsbuild using <finalOBYfile>.
                                     <finalOBYfile> must contain one and ONLY one of romsize/rofssize/dataimagename/imagename keywords,
                                     The keywords will be used to identify the OBY type.
@@ -278,6 +286,7 @@
 my $featuremanager = 0; #Flag to enable support for feature manager database XML file and to generate  
 			# features data file.
 my $noFeatureManager = 0; # Flag to stop the generation of features.dat file and use pre-built features.dat if provided.
+my $noFeatureConf  = 0 ;
 my $preBuiltFeaturesDataFile  = ''; # To store the name of pre-built features.dat file provided with "-nofm" option.
 
 #Image Content XML file that supports specific feature to be added
@@ -359,6 +368,7 @@
 my $preprocessor = "cpp";
 my $opt_xiponly = 0;
 my $ignoreconfig = 0;
+my $nopreprocess = 0;
 my $romcount = 0;
 
 sub match_obyfile
@@ -755,8 +765,7 @@
 
 	my ($paramFileFlag, @argList); 
 
-	if (defined @_)
-	{
+	if (defined @_ && scalar(@_) > 0) {
 		($paramFileFlag, @argList) = @_;
 	}
 	else
@@ -783,13 +792,15 @@
 		}
 	}
 	# first searching argList for keepgoing option
+	my @newArgList = ();
 	foreach my $arg (@argList) {
-		if ( $arg =~ /^-k$/i || $arg =~ /^-keepgoing$/i )
-	  {
-			$opt_k = 1;		
-  		next;	
-		}
-		if ($arg =~ /^-workdir=(.*)/)
+		if ( $arg =~ /^-k$/i || $arg =~ /^-keepgoing$/i ) {
+			$opt_k = 1;	 
+		}
+		elsif($arg =~ /^-nopreprocess$/i ) {
+			$nopreprocess = 1 ; 
+		}
+		elsif ($arg =~ /^-workdir=(.*)/)
 		{
 			my $workdir = $1;
 			if (!-d $workdir)
@@ -806,11 +817,13 @@
 				$thisdir =~ s-\/-\\-g;
 			}
 			$opt_workdir = 1;
-			chdir "$currentdir";
-			next;	
+			chdir "$currentdir"; 
+		}
+		else {
+			push @newArgList, $arg ;
 		}
 	}
-	foreach my $arg (@argList)
+	foreach my $arg (@newArgList)
 	{
 	    if ($arg =~ /^-argfile=(.*)/) 
 		{
@@ -927,6 +940,7 @@
 				$errors++;
 				next;
 			}
+			$noFeatureConf = 0;
 			$featureXml = $1;
 			$xmlrequired = 1;
 			$featuremanager = 1;
@@ -978,14 +992,18 @@
 	    	}
 	    	next;
 	    }
-		if ($arg =~ /^-nofm(=(.*))?$/)
-		{
-			if (!$enforceFeatureManager) 
-			{
-				print "Unknown arg: $arg\n";
+		if ($arg =~ /^-nofm(=(.*))?$/) {
+			if(!$1) {
+                $noFeatureConf = 1 ;
+				next ;
+            }
+			 
+			if (!$enforceFeatureManager)  {
+				print "Unsupported option: $arg\n";
 				$errors++;
 				next;
-			}
+			} 
+			$noFeatureConf = 0;
    			$noFeatureManager = 1;
             #DEF125375 If caller is simply giving -nofm without any parameter, a warning message will be given.
             if(!$2)
@@ -1050,42 +1068,49 @@
 			$checkcase_test=1;
 			next;	
 		}
-		if ($arg =~ /^-workdir=(.*)/)
-		{
-			next;
-		}
+		 
 		if ($arg =~ /^-stdcpp$/)
-		{
-			if (&is_linux)
-			{
-				print "Warning: option -stdcpp only apply for Windows\n";
-				next;
+		{	
+			if($nopreprocess) {
+				print STDERR "Warning: -stdcpp option is invalid because the -nopreprocess option set.\n";
 			}
-			if ($cppoption)
-			{
-				die "Error: -stdcpp option and -cpp=xxx option cannot be used at the same time.\n";
+			else {
+				if (&is_linux)
+				{
+					print "Warning: option -stdcpp only apply for Windows\n";
+					next;
+				}
+				if ($cppoption)
+				{
+					die "Error: -stdcpp option and -cpp=xxx option cannot be used at the same time.\n";
+				}
+				$stdcpp = 1;
 			}
-			$stdcpp = 1;
 			next;
 		}
 		if ($arg =~ /^-cpp=(.*)/)
 		{
-			if ($stdcpp)
-			{
-				die "Error: -stdcpp option and -cpp=xxx option cannot be used at the same time.\n";
-			}
-			if ($cppoption)
-			{
-				print "Warning: -cpp option has been set before. The previous configuration will be overwritten!\n";
+			if($nopreprocess) {
+				print STDERR "Warning: -cpp option is invalid because the -nopreprocess option set.\n";
 			}
-			$cppoption = 1;
-			$preprocessor = $1;
-			$preprocessor =~ s-\\-\/-g;
-			$preprocessor =~ s-EPOCROOT##\/?-$epocroot-g;
-			if (-d $preprocessor)
-			{
-				$preprocessor .= "\/" unless $preprocessor =~ /\/$/;
-				$preprocessor .= "cpp";
+			else {
+				if ($stdcpp)
+				{
+					die "Error: -stdcpp option and -cpp=xxx option cannot be used at the same time.\n";
+				}
+				if ($cppoption)
+				{
+					print "Warning: -cpp option has been set before. The previous configuration will be overwritten!\n";
+				}
+				$cppoption = 1;
+				$preprocessor = $1;
+				$preprocessor =~ s-\\-\/-g;
+				$preprocessor =~ s-EPOCROOT##\/?-$epocroot-g;
+				if (-d $preprocessor)
+				{
+					$preprocessor .= "\/" unless $preprocessor =~ /\/$/;
+					$preprocessor .= "cpp";
+				}
 			}
 			next;
 		}
@@ -1265,11 +1290,6 @@
 			}
 			next;
 		}
-		if ( $arg =~ /^-k$/i || $arg =~ /^-keepgoing$/i )
-	    {
-			$opt_k = 1;
-			next;
-	    }
 		if ( $arg =~ /^-r$/i || $arg =~ /^-retainfolder$/i )
 	    {
 			$opt_r = 1;
@@ -1391,98 +1411,122 @@
 
 sub preprocessing_phase
 {
-	my $temp1OBYFile = $thisdir."tmp1.oby";
-	unlink "$temp1OBYFile";
-
-#	Macro "ROM_FEATURE_MANAGEMENT" is defined when "-f|fr" or "-fm" is used
-	if (defined ($featureXml))
-	{
-		$cppargs .= " -DROM_FEATURE_MANAGEMENT ";
-	}
-
-	# add pre-include file and include directories for feature variants
-	if ($featureVariant{'VALID'})
-	{
-		$cppargs .= " -I.";
-		my $incRef = $featureVariant{'ROM_INCLUDES'};
-		if ($incRef)
+	if($nopreprocess == 0) {
+		my $temp1OBYFile = $thisdir."tmp1.oby";
+		unlink "$temp1OBYFile";
+
+	#	Macro "ROM_FEATURE_MANAGEMENT" is defined when "-f|fr" or "-fm" is used
+		if (defined ($featureXml))
 		{
-			foreach (@$incRef)
+			$cppargs .= " -DROM_FEATURE_MANAGEMENT ";
+		}
+
+		# add pre-include file and include directories for feature variants
+		if ($featureVariant{'VALID'})
+		{
+			$cppargs .= " -I.";
+			my $incRef = $featureVariant{'ROM_INCLUDES'};
+			if ($incRef)
+			{
+				foreach (@$incRef)
+				{
+					$cppargs .= " -I \"$_\"";
+				}
+			}
+			my $HRH = $featureVariant{'VARIANT_HRH'};
+			if ($HRH)
 			{
-		    	$cppargs .= " -I \"$_\"";
+				$cppargs .= " -include \"$HRH\"";
 			}
 		}
-		my $HRH = $featureVariant{'VARIANT_HRH'};
-		if ($HRH)
+		else
+		{
+			# no feature variant so use the standard includes
+			$cppargs .= " -I. -I \"$rominclude\"";
+		}
+
+		if ($stdcpp)
+		{
+			$preprocessor = find_stdcpp();
+		}
+		print "* $preprocessor -Wno-endif-labels -o $temp1OBYFile $cppargs\n" if ($opt_v);
+		
+		is_existinpath("$preprocessor", romutl::DIE_NOT_FOUND);
+		$errors = 0;
+		open CPP, "| $preprocessor -Wno-endif-labels -o $temp1OBYFile $cppargs" or die "* Can't execute cpp";
+		foreach my $arg (@obyfiles)
 		{
-		    $cppargs .= " -include \"$HRH\"";
-		}
-	}
-	else
-	{
-		# no feature variant so use the standard includes
-		$cppargs .= " -I. -I \"$rominclude\"";
-	}
-
-	if ($stdcpp)
-	{
-		$preprocessor = find_stdcpp();
+			print CPP "\n#line 1 \"$arg\"\n";
+		
+			if(open(OBY, $arg)) {
+				print "* reading $arg\n" if ($opt_v);
+				while ($line=<OBY>) {
+					print CPP $line;
+				}
+				close OBY;
+			}
+			else {
+				print STDERR "* Can't open $arg\n";
+				if(!$opt_k){			
+					close CPP;
+					exit(1);
+				}
+			}
+		}
+		close CPP;
+		my $cpp_status = $?;
+		die "* cpp failed\n" if ($cpp_status != 0 || !-f "$temp1OBYFile");
+
+		if( defined ($image_content))
+		{
+			#Read the OBY file that was generated by the pre-processor
+			&ReadPreprocessedFile($temp1OBYFile);
+
+	#		Check if the static dependencies of the OBY binaries are resolved.
+			&ImageContentHandler::UpdateObyBinaryStaticDep();
+			
+			#Now append the files collected from cdfs.
+			&ImageContentHandler::GenObyFile($temp1OBYFile);
+		}
+
+		if($obycharset =~ /utf-?8/i)
+		{
+			my $utf8file = $thisdir."tmp1utf8.oby";
+			open INFILE, "<$temp1OBYFile" or die "* Can't open file $temp1OBYFile";
+			open CHARSETTRAN, "| charsettran -to=hostcharset > $utf8file" or die "* Can't execute charsetran";
+			while(<INFILE>)
+			{
+				print CHARSETTRAN $_;
+			}
+			close CHARSETTRAN;
+			close INFILE;	
+			unlink $temp1OBYFile  or die "* Can't remove file $temp1OBYFile";
+			rename 	$utf8file, $temp1OBYFile or die "* Can't rename file $utf8file to file $temp1OBYFile";
+		}
+		@obydata = ();
+		# load tmp1.oby here
+		open TMP1, "$temp1OBYFile" or die("* Can't open $temp1OBYFile\n");
+		while(<TMP1>) { 
+			push @obydata,$_;
+		}
+		close TMP1 ;
 	}
-	print "* $preprocessor -Wno-endif-labels -o $temp1OBYFile $cppargs\n" if ($opt_v);
-	
-	is_existinpath("$preprocessor", romutl::DIE_NOT_FOUND);
-	$errors = 0;
-	open CPP, "| $preprocessor -Wno-endif-labels -o $temp1OBYFile $cppargs" or die "* Can't execute cpp";
-	foreach my $arg (@obyfiles)
-	{
-		print CPP "\n#line 1 \"$arg\"\n";
-	
-		if(open(OBY, $arg)) {
-			print "* reading $arg\n" if ($opt_v);
-			while ($line=<OBY>) {
-				print CPP $line;
-			}
-			close OBY;
-		}
-		else {
-			print STDERR "* Can't open $arg\n";
-			if(!$opt_k){			
-				close CPP;
-				exit(1);
+	else {
+		foreach my $arg (@obyfiles) {		
+			if(open(OBY, $arg)) {
+				print "* reading $arg\n" if ($opt_v);
+				while (<OBY>) {
+					push @obydata,$_;
+				}
+				close OBY;
 			}
-		}
-	}
-	close CPP;
-	my $cpp_status = $?;
-	die "* cpp failed\n" if ($cpp_status != 0 || !-f "$temp1OBYFile");
-
-	if( defined ($image_content))
-	{
-		#Read the OBY file that was generated by the pre-processor
-		&ReadPreprocessedFile($temp1OBYFile);
-
-#		Check if the static dependencies of the OBY binaries are resolved.
-		&ImageContentHandler::UpdateObyBinaryStaticDep();
-		
-		#Now append the files collected from cdfs.
-		&ImageContentHandler::GenObyFile($temp1OBYFile);
-	}
-
-	# Setup default rom configuration
-	$romimage[0] = {xip=>1, compress=>0, extension=>0, composite=>"none",uncompress=>0 };
-	if($obycharset =~ /utf-?8/i)
-	{
-		my $utf8file = $thisdir."tmp1utf8.oby";
-		open INFILE, "<$temp1OBYFile" or die "* Can't open file $temp1OBYFile";
-		open CHARSETTRAN, "| charsettran -to=hostcharset > $utf8file" or die "* Can't execute charsetran";
-		while(<INFILE>)
-		{
-			print CHARSETTRAN $_;
-		}
-		close CHARSETTRAN;
-		close INFILE;	
-		unlink $temp1OBYFile  or die "* Can't remove file $temp1OBYFile";
-		rename 	$utf8file, $temp1OBYFile or die "* Can't rename file $utf8file to file $temp1OBYFile";
+			else {
+				print STDERR "* Can't open $arg\n";
+				if(!$opt_k){	 
+					exit(1);
+				}
+			}
+		}
 	}
 }
 
@@ -1553,50 +1597,46 @@
 		$substitutionData{"RIGHT_NOW"} = sprintf("%02d/%02d/%04d %02d:%02d:%02d", $mday, $mon+1, $year+1900, $hour, $min, $sec);
 		$substitutionData{"EPOCROOT"} = $epocroot;
 		@substitutionOrder = ("TODAY", "RIGHT_NOW", "EPOCROOT");
-	}
-
-	my $temp1OBYFile = $thisdir."tmp1.oby";
-	
-	open TMP1, "$temp1OBYFile" or die("* Can't open $temp1OBYFile\n");
-	while ($line=<TMP1>)
-	{
-		if(($line =~ /^\s*romsize\s*=/i) || ( $line=~ /^\s*rom_image/i) || ($line =~ /^\s*data_image/i))
-		{
+	}	 
+	 
+	foreach $line(@obydata) {
+		if(($line =~ /^\s*romsize\s*=/i) || ( $line=~ /^\s*rom_image/i) || ($line =~ /^\s*data_image/i)) {
 			$onlysmrimage = 0;
 			last;
 		}
 	}
-	close TMP1;	
-	if ($enforceFeatureManager && (!$featuremanager) && (!$noFeatureManager) )
-	{
-		my $defaultFeatureDbFlag = 0;
-		open TMP1, "$temp1OBYFile" or die("* Can't open $temp1OBYFile\n");
-		while ($line=<TMP1>)
-		{
-			if ($line=~/^\s*defaultfeaturedb\s*=?\s*(\S+)/i)
-			{	
-				# Get the default value for featuredatabasefile
-                
-				$featureXml = "$epocroot$1";
-				$featureXml =~ s-\\-\/-g;
-				$featuremanager = 1;				
-				$defaultFeatureDbFlag = 1;
-				load_featuresutil();				
-				last;
+	if($noFeatureConf == 0) { 
+		if ($enforceFeatureManager && (!$featuremanager) && (!$noFeatureManager) ) {
+			my $defaultFeatureDbFlag = 0;
+			foreach $line(@obydata) { 
+				if ($line=~/^\s*defaultfeaturedb\s*=?\s*(\S+)/i)
+				{	
+					# Get the default value for featuredatabasefile
+					
+					$featureXml = "$epocroot$1";
+					$featureXml =~ s-\\-\/-g;
+					$featuremanager = 1;				
+					$defaultFeatureDbFlag = 1;
+					load_featuresutil();				
+					last;
+				}
 			}
-		}
-		close TMP1;
-
-		if(!$defaultFeatureDbFlag && !$onlysmrimage)
-		{
-			print "Error: Neither option \"-fm|-nofm\" nor default value for featuredatabase file is provided.\n";
-			exit(1);			
+		 
+
+			if(!$defaultFeatureDbFlag && !$onlysmrimage)
+			{
+				print "Error: Neither option \"-fm|-nofm\" nor default value for featuredatabase file is provided.\n";
+				exit(1);			
+			}
 		}
 	}
-
-	open TMP1, "$temp1OBYFile" or die("* Can't open $temp1OBYFile\n");
-	while ($line=<TMP1>)
-	{
+	
+	# Setup default rom configuration
+	$romimage[0] = {xip=>1, compress=>0, extension=>0, composite=>"none",uncompress=>0 }; 
+		
+	my @savedObyData = @obydata;
+	@obydata = ();
+	foreach  $line(@savedObyData) {
 		track_source($line);
 		$line =~ s-\\-\/-g;
 
@@ -1653,19 +1693,19 @@
  				}
  			}
 		}
-
-		if($line =~ /^\s*FEATURE\s*(.*)/i || $line =~ /^\s*EXCLUDE_FEATURE\s*(.*)/i)
-		{
-			# Process the feature keywords only when "-f|fr" or "-fm" is passed to buildrom
-			if(defined ($featureXml))
-			{
-				push @obydata, "$line";
+		if($noFeatureConf == 0) { 
+			if($line =~ /^\s*FEATURE\s*(.*)/i || $line =~ /^\s*EXCLUDE_FEATURE\s*(.*)/i) {
+				# Process the feature keywords only when "-f|fr" or "-fm" is passed to buildrom
+				if(defined ($featureXml))
+				{
+					push @obydata, "$line";
+				}
+				else
+				{
+					push @obydata, "REM handled $line";
+				}
+				next;
 			}
-			else
-			{
-				push @obydata, "REM handled $line";
-			}
-			next;
 		}
 
 		if ($line=~/^\s*DEFINE\s+(\w+)\s+(\S+)/i)
@@ -2659,14 +2699,14 @@
 my $spicount=0; #counts number of spi files in each rom image
 my $filescount=0; #counts number of data files
 my $hidefilescount=0; #counts number of data files to be hidden
-my $romimage=0; #number of rom image currently working with
+my $romimagecount=0; #number of rom image currently working with
 
 sub locateexisting 
 { # if an SPI file of this type exists in a base image then returns name of SPI file from the array
-	my ($romimage, $spifile, $base) =@_;
+	my ($index, $spifile, $base) =@_;
 	my $i=0;
 	while(defined $spiarray[$base][$i]) {
-		if($spiarray[$base][$i]{spi} eq $spiarray[$romimage][$spifile]{spi}) {
+		if($spiarray[$base][$i]{spi} eq $spiarray[$index][$spifile]{spi}) {
 			my $spiname;
 			my $spiextension;
 			if($spiarray[$base][$i]{spifile} =~ /(.*)\.(.*)$/) {
@@ -2684,27 +2724,27 @@
 
 sub create 
 { #called to create SPI file and store in specified directory
-	my ($romimage, $spifile, $base) =@_; #$romimage = current rom image number, $spifile = current spifile number, $base=number of rom image basing on
+	my ($index, $spifile, $base) =@_; #$index = current rom image number, $spifile = current spifile number, $base=number of rom image basing on
 	my $existingspi = "";
 	if(defined($base)) { # checks core image for an existing SPI file of this type, if an existing file exists then $existingspi is set to -i<name of existing spi file> which will later be passed to spitool.pm
-		$existingspi = locateexisting($romimage, $spifile, $base);
+		$existingspi = locateexisting($index, $spifile, $base);
 		if($existingspi ne "") {
 			$existingspi = "-i$existingspi";
 			
 		}
 	}
-	if($spiarray[$romimage][$spifile]{spifile} =~ /(.+)\.(.*)$/) {
-		my $targetspi="$1-$romimage-$spifile\.$2"; #add romimage number and identifier for spi file to spi file name to distinguish from other spi files
+	if($spiarray[$index][$spifile]{spifile} =~ /(.+)\.(.*)$/) {
+		my $targetspi="$1-$index-$spifile\.$2"; #add romimage number and identifier for spi file to spi file name to distinguish from other spi files
 		my @dataforspi; # array to store names of data files to include in spi file
 		my @hidedatainspi; # array to store names of data files that are to be hidden in spi file
 		for(my $k=0;$k<scalar @datafiles;$k++) {
-			if($datafiles[$k]{rom}==$romimage && $datafiles[$k]{spifile} == $spifile) {
+			if($datafiles[$k]{rom}==$index && $datafiles[$k]{spifile} == $spifile) {
 				push @dataforspi, $datafiles[$k]{data}; #push name of data file onto array if correct romimage and spi type
 			}
 		}
 
 		for(my $j=0;$j<scalar @hidedatafiles;$j++) {
-			if($hidedatafiles[$j]{rom}==$romimage && $hidedatafiles[$j]{spifile} == $spifile)
+			if($hidedatafiles[$j]{rom}==$index && $hidedatafiles[$j]{spifile} == $spifile)
 			{
 				push @hidedatainspi, $hidedatafiles[$j]{data}; #push name of data file to be hidden onto array if correct romimage and spi type
 			}
@@ -2740,7 +2780,7 @@
 		{
 			if ($line=~/^\s*REM \s*ROM_IMAGE\[(\d)\]/) # specify which romimage following lines are part of
 			{
-				$romimage=$1;
+				$romimagecount=$1;
 				$spicount=0;
 			}	elsif ($line =~ /^\s*REM/i)
 			{
@@ -2751,36 +2791,36 @@
 				my $flag=1;
 				my $i;
 				for($i=0;$i<$spicount && $flag;$i++) { #loop to see if name of spi file already added to this romimage in array
-					if($spiarray[$romimage][$i]{spi} eq $targetspi) {
+					if($spiarray[$romimagecount][$i]{spi} eq $targetspi) {
 						$flag=0;
 					}
 				}
 			
 				if($flag) { # adds spi file if not yet listed for this romimage in array
-					$spiarray[$romimage][$spicount++]={spifile=>$3, spidir=>$4, spi=>$4.$3};
+					$spiarray[$romimagecount][$spicount++]={spifile=>$3, spidir=>$4, spi=>$4.$3};
 					$i=$spicount;
 				}
-					$datafiles[$filescount++]= {data=>$1, rom=>$romimage, spifile=>$i-1}; 
+					$datafiles[$filescount++]= {data=>$1, rom=>$romimagecount, spifile=>$i-1}; 
                         } elsif ($spiplacement && $line =~/^\s*SPI_POSITION/i){
         			# mark the image index at which the SPI_POSITION keyword has occured in order to avoid writing duplicate
         			# entries of the spi file.
-        			$spipositionflag{$romimage} = 1;
+        			$spipositionflag{$romimagecount} = 1;
         		} elsif ($line=~/^\s*spidatahide\s*=\s*(\S+)\s+(\S+)\s(\S+)\s*$/)	{
 				#spidatahide=\epoc32\data\Z\Resource\Plugins\Obexclasscontroller.RSC ecom.spi \private\10003a3f\
 				my $targetspi=$3.$2;
 				my $flag=1;
 				my $i;
 				for($i=0;$i<$spicount && $flag;$i++) { #loop to see if name of spi file already added to this romimage in array
-					if($spiarray[$romimage][$i]{spi} eq $targetspi) {
+					if($spiarray[$romimagecount][$i]{spi} eq $targetspi) {
 						$flag=0;
 					}
 				}
 			
 				if($flag) { # adds spi file if not yet listed for this romimage in array
-					$spiarray[$romimage][$spicount++]={spifile=>$2, spidir=>$3, spi=>$3.$2};
+					$spiarray[$romimagecount][$spicount++]={spifile=>$2, spidir=>$3, spi=>$3.$2};
 					$i=$spicount;
 				}
-					$hidedatafiles[$hidefilescount++]= {data=>$1, rom=>$romimage, spifile=>$i-1}; 
+					$hidedatafiles[$hidefilescount++]= {data=>$1, rom=>$romimagecount, spifile=>$i-1}; 
 			}
 
 		}
@@ -2970,10 +3010,13 @@
 #
 sub featurefile_creation_phase
 {
-	if($onlysmrimage)
-	{
+	if($onlysmrimage){
 		return;
 	}
+	if($noFeatureConf) {
+		checkcase() if ($checkcase);
+		return ;
+	}
 	# Set the name and Rom Image location of feature file.
 	if ($enforceFeatureManager) 
 	{