Windows2003-3790/tools/postbuildscripts/comminf.cmd
2020-09-30 16:53:55 +02:00

478 lines
14 KiB
Batchfile

@echo off
REM ------------------------------------------------------------------
REM
REM MUICommInf.cmd
REM Parse MUI component INF and comment out those lines contain files don't exist
REM
REM
REM Copyright (c) Microsoft Corporation. All rights reserved.
REM
REM ------------------------------------------------------------------
perl -x "%~f0" %*
goto :EOF
#!perl
use strict;
use File::Basename;
use IO::File;
use lib $ENV{RAZZLETOOLPATH} . "\\PostBuildScripts";
use lib $ENV{RAZZLETOOLPATH};
use PbuildEnv;
use ParseArgs;
use Logmsg;
use cksku;
require Exporter;
BEGIN {
$ENV{SCRIPT_NAME} = 'Comminf.cmd';
}
sub Usage { print<<USAGE; exit(1) }
MUIcommINF
-m:Path_of_INF
-d:Mofified_INF_Path
-s:Default Install Section
-p:Bin Path
-o:yes (overwrite file)
Parse MUI component INF and cooment out those lines contain files don't exist
USAGE
my ($INFPath, $INF_Mod_Path, $DefaultInstallSection, $BinPath, $OverwriteFlag, $Overwrite, $Progname, $_BuildArch, $_NTPOSTBLD, $RAZZLETOOLPATH);
my (@Items, $Dirty);
my ($LogFilename, $TempDir);
$Progname=$0;
parseargs( '?' => \&Usage,
'm:' => \$INFPath,
'd:' => \$INF_Mod_Path,
's:' => \$DefaultInstallSection,
'p:' => \$BinPath,
'o:' => \$OverwriteFlag
);
$Overwrite=0;
if (defined ($OverwriteFlag))
{
$OverwriteFlag="\L$OverwriteFlag";
if ( $OverwriteFlag eq "yes")
{
$Overwrite=1;
}
}
&main();
sub main
{
my ($Line);
$Dirty=0;
$LogFilename = $ENV{ "LOGFILE" };
if ( ! defined( $LogFilename ) )
{
$TempDir = $ENV{ "TMP" };
$LogFilename = "$TempDir\\$Progname.log";
}
if ($ENV{_BuildArch}=~/x86/i)
{
$_BuildArch="i386";
}
else
{
$_BuildArch=$ENV{_BuildArch};
}
$_NTPOSTBLD=$ENV{_NTPOSTBLD};
#
#
#
$RAZZLETOOLPATH=$ENV{RazzleToolPath};
if (! defined($DefaultInstallSection))
{
logthemsg("$Progname: ** Warning: Default install section is not set");
exit 3;
}
if (! -e $INFPath)
{
logthemsg("$Progname: ** Warning: $INFPath doesn't exist");
exit 1;
}
if (! -d $BinPath)
{
logthemsg("$Progname: ** Warning: Bin folder $BinPath doesn't exist");
exit 2;
}
unless (open(INFILE,$INFPath))
{
logthemsg("$Progname: ** Warning: Can't open $INFPath for Read");
exit 1;
}
@Items=<INFILE>;
close(INFILE);
&DoTheChange();
#
# Rewrite the INF file if we commented out some lines
#
if (($Dirty) && ($Overwrite))
{
unless(open(OUTFILE,">$INF_Mod_Path"))
{
logthemsg("$Progname: ** Fatal: can't rewrite $INF_Mod_Path");
exit 4;
}
foreach $Line (@Items)
{
print(OUTFILE "$Line");
}
close(OUTFILE);
logthemsg("$Progname: $INF_Mod_Path is rewritten");
}
exit 0;
}
sub DoTheChange
{
my (@ComponentFileInstall, $ComponentInstall, $Start_idx, $End_idx, $Result);
my ($ComponentFileCopySections, $CopyFileSectionName, @ComponentFileList, $total_files_copied,$file_errors);
my (%TheStringSection);
$Result=0;
if ( !&GetTheSection($DefaultInstallSection,\@Items,\@ComponentFileInstall,\$Start_idx,\$End_idx))
{
logthemsg("$Progname: ** Warning: can't find Default Insatll Section : $DefaultInstallSection from $INFPath");
return $Result;
}
&BuildUpStringSection(\%TheStringSection);
#
# Read the default install section
#
foreach $ComponentInstall (@ComponentFileInstall)
{
#logthemsg ($ComponentInstall);
#
#Parse CopyFiles list
#
if ($ComponentInstall =~ /.*CopyFiles.*=(.*)/i)
{
$ComponentFileCopySections = $1;
#Loop through all sections
while ($ComponentFileCopySections ne "")
{
if ($ComponentFileCopySections =~ /([^\,]*),(.*)/i)
{
$ComponentFileCopySections = $2;
$CopyFileSectionName = $1;
}
else
{
$CopyFileSectionName = $ComponentFileCopySections;
$ComponentFileCopySections = "";
}
@ComponentFileList=();
if ( !&GetTheSection($CopyFileSectionName,\@Items,\@ComponentFileList,\$Start_idx,\$End_idx))
{
logthemsg("$Progname: ** Warning: can't find Section : $CopyFileSectionName from $INFPath");
return $Result;
}
&CheckCopyFileList($BinPath,\$Dirty,$Start_idx,$End_idx,\@Items,\$total_files_copied,\$file_errors,\%TheStringSection);
}
}
}
}
sub CheckCopyFileList
{
my ($SrcRootDir, $Dirty, $StartIdx, $EndIdx, $FileList, $total_files_copied,$file_errors, $pTheStringSection) = @_;
my ($Idx, $Line,$SrcFile,$SrcCopyFile);
my ($Replaced, $SrcFileNew, $Doit, $DoCnt, $TheLine);
$$file_errors = 0;
$$total_files_copied = 0;
#Loop through all control file entries
for ($Idx=$StartIdx; $Idx <= $EndIdx; $Idx++)
{
$SrcFile=$$FileList[$Idx];
chomp $SrcFile;
if ($SrcFile !~ /\w/)
{
next;
}
if (substr($SrcFile,0,1) eq ";")
{
next;
}
$$total_files_copied+=1;
#
# Source file could be in the format of "[original file], [compressed file]"
#
if ($SrcFile =~ /(.*),\s*(.*)\s*/)
{
$SrcFile = $2;
}
#Make sure source file doesn't contain MUI extension
if ($SrcFile =~ /(.*)\.mu_/i ||$SrcFile =~ /(.*)\.mui/i )
{
$SrcFile = $1;
}
#
# Check if $SrcFile contains strings as %string1%%string2%....
#
#%DATAFILE2%%LCID2%.dat
$Doit=1;
$DoCnt=0;
$SrcFileNew=$SrcFile;
while( ($Doit) && ($SrcFileNew =~ /(.*)%(.*)%(.*)/))
{
if ( defined ($$pTheStringSection{$2}))
{
$Replaced=$$pTheStringSection{$2};
$SrcFileNew=$1.$Replaced.$3;
$DoCnt++;
}
else
{
logthemsg("**** Can't map:$2*");
$SrcFileNew=$SrcFile;
$Doit=0;
}
}
if (($Doit) && ($DoCnt))
{
logthemsg("$SrcFile is mapped to $SrcFileNew");
#
# We want to also replace this line so that MSI can handle easily
#
$Line=$$FileList[$Idx];
$Line =~ s/$SrcFile/$SrcFileNew/g;
$TheLine=$Idx+1;
logthemsg("Line_no:$TheLine is changed from $$FileList[$Idx] to $Line");
$$FileList[$Idx]=$Line;
$$Dirty+=1;
}
$SrcFile=$SrcFileNew;
$SrcCopyFile = "$SrcRootDir\\$SrcFile";
if (!(-e $SrcCopyFile))
{
$SrcCopyFile = "$SrcRootDir\\dump\\$SrcFile";
}
if (!(-e $SrcCopyFile))
{
$SrcCopyFile = "$SrcRootDir\\netfx\\$SrcFile";
}
if (!(-e $SrcCopyFile))
{
$SrcCopyFile = "$SrcRootDir\\mui\\drop\\$SrcFile";
}
if (!(-e $SrcCopyFile))
{
$SrcCopyFile = "$SrcRootDir\\uddi\\system32\\$SrcFile";
}
if (!(-e $SrcCopyFile))
{
$SrcCopyFile = "$SrcRootDir\\uddi\\resources\\$SrcFile";
}
if (!(-e $SrcCopyFile))
{
$SrcCopyFile = "$SrcRootDir\\uddi\\help\\$SrcFile";
}
if (!(-e $SrcCopyFile))
{
$SrcCopyFile = "$SrcRootDir\\uddi\\webroot\\help\\default\\$SrcFile";
}
if (!(-e $SrcCopyFile))
{
$SrcCopyFile = "$SrcRootDir\\uddi\\webroot\\help\\default\\images\\$SrcFile";
}
#
# For ia64, we need to try some extral step to get external files
# from wow64 or i386 release server
if (!(-e $SrcCopyFile) && ($_BuildArch =~ /ia64/i))
{
if (!(-e $SrcCopyFile))
{
$SrcCopyFile = "$SrcRootDir\\wowbins_uncomp\\$SrcFile";
}
if (!(-e $SrcCopyFile))
{
$SrcCopyFile = "$SrcRootDir\\wowbins\\$SrcFile";
}
if (-e "$_NTPOSTBLD\\build_logs\\cplocation.txt" && !(-e $SrcCopyFile))
{
if (open (X86_BIN, "$_NTPOSTBLD\\build_logs\\cplocation.txt"))
{
$SrcRootDir = <X86_BIN>;
chomp ($SrcRootDir);
$SrcCopyFile = "$SrcRootDir\\$SrcFile";
if (!(-e $SrcCopyFile))
{
$SrcCopyFile = "$SrcRootDir\\dump\\$SrcFile";
}
if (!(-e $SrcCopyFile))
{
$SrcCopyFile = "$SrcRootDir\\mui\\drop\\$SrcFile";
}
logthemsg("$Progname: ** Copy $SrcCopyFile from i386 release");
close (X86_BIN);
}
}
}
if ( ( ! -e $SrcCopyFile) && (!($SrcCopyFile =~ /\.inf/i)) )
{
#
#
# File doesn't exist, cooment out this line
#
$$Dirty+=1;
$Line=$$FileList[$Idx];
$Line=';'.$Line;
$$FileList[$Idx]=$Line;
$$file_errors+=1;
$TheLine=$Idx+1;
logthemsg("Line no: $TheLine is commented out=> $Line ");
}
}
return $$file_errors;
}
#-----------------------------------------------------------------------------
# Build the hash for the string in [Strings] sections of a INF file
#-----------------------------------------------------------------------------
sub BuildUpStringSection
{
my ($pTheStringSection) = @_;
my (@StringItems, $Section, $Line, $Counter, $Start_idx,$End_idx);
$Section='Strings';
%$pTheStringSection={};
$Counter=0;
if ( !&GetTheSection($Section,\@Items,\@StringItems,\$Start_idx,\$End_idx))
{
return $Counter;
}
;
foreach $Line (@StringItems)
{
chomp($Line);
if (length($Line) == 0)
{
next;
}
if ($Line !~ /\w/)
{
next;
}
if (substr($Line,0,1) eq ";")
{
next;
}
#logmsg("StringLine:$Line");
if ( $Line =~ /\s*(\S+)\s*=\s*(\S*)/ )
{
$$pTheStringSection {$1} = $2;
$Counter++;
#logmsg("*****$1\\$2****");
}
}
return $Counter;
}
sub GetTheSection
{
my ($SectioName, $pItems, $pSectionContent, $Start_Idx, $End_Idx) = @_;
my ($Idx, $Limit, $InSection, $LeadingChar, $Line, $Pattern, $Result);
$Idx=0;
$InSection=0;
$Limit=scalar(@$pItems);
$Pattern='^\[' . $SectioName . '\]$';
$$Start_Idx = -1;
$$End_Idx = -1;
$Result=0;
for ($Idx=0; $Idx < $Limit; $Idx++)
{
$Line=$$pItems[$Idx];
$LeadingChar=substr($Line,0,1);
if ($LeadingChar ne ";")
{
if ($LeadingChar eq "[")
{
if ( $Line =~ /$Pattern/i )
{
if ( ! $InSection)
{
$InSection = 1;
}
}
else
{
if ($InSection)
{
$$End_Idx=$Idx-1;
$InSection=0;
}
}
next;
}
if ($InSection)
{
if ($$Start_Idx == -1)
{
$$Start_Idx=$Idx;
}
push(@$pSectionContent,$Line);
}
}
}
if ($InSection && ($$End_Idx== -1 ))
{
$$End_Idx=$Idx-1;
}
if (($$Start_Idx != -1) && ($$End_Idx != -1))
{
$Result=1;
}
return $Result;
}
sub logthemsg
{
my ($Msgs) = @_;
logmsg("$Msgs");
}