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

219 lines
5.9 KiB
Batchfile

@REM -----------------------------------------------------------------
@REM
@REM layout.cmd - WadeLa
@REM Updates layout.inf for each sku with the sizes of the binaries
@REM
@REM Copyright (c) Microsoft Corporation. All rights reserved.
@REM
@REM -----------------------------------------------------------------
@if defined _CPCMAGIC goto CPCBegin
@perl -x "%~f0" %*
@goto :EOF
#!perl
use strict;
use lib $ENV{RAZZLETOOLPATH} . "\\PostBuildScripts";
use lib $ENV{RAZZLETOOLPATH};
use File::Temp;
use File::Copy;
use PbuildEnv;
use ParseArgs;
use Logmsg;
use cksku;
sub Usage { print<<USAGE; exit(1) }
layout [-l <language>]
Updates layout.inf for each sku with the sizes of the binaries
USAGE
parseargs('?' => \&Usage);
# Support incremental runs.
if ( -f "$ENV{_NTPOSTBLD}\\build_logs\\bindiff.txt" ) {
if ( system "findstr /ilc:\"layout\" $ENV{_NTPOSTBLD}\\build_logs\\bindiff.txt" ) {
logmsg "Not running layout.cmd - layout has not changed";
exit;
}
}
# Find file sizes for all of the skus.
my %filesizes;
my %dirs = (
PRO => "$ENV{_NTPOSTBLD}",
PER => "$ENV{_NTPOSTBLD}\\perinf",
SRV => "$ENV{_NTPOSTBLD}\\srvinf",
BLA => "$ENV{_NTPOSTBLD}\\blainf",
SBS => "$ENV{_NTPOSTBLD}\\sbsinf",
ADS => "$ENV{_NTPOSTBLD}\\entinf",
DTC => "$ENV{_NTPOSTBLD}\\dtcinf"
);
my %profs = {};
logmsg "Reading in default file sizes.";
addDefaults(\%profs);
logmsg "Finding actual file sizes...";
addSizes($dirs{PRO}, \%profs);
$filesizes{PRO} = \%profs;
my %perfs = %profs;
addSizes($dirs{PER}, \%perfs);
$filesizes{PER} = \%perfs;
my %srvfs = %profs;
addSizes($dirs{SRV}, \%srvfs);
$filesizes{SRV} = \%srvfs;
my %blafs = %srvfs;
addSizes($dirs{BLA}, \%blafs);
$filesizes{BLA} = \%blafs;
my %sbsfs = %srvfs;
addSizes($dirs{SBS}, \%sbsfs);
$filesizes{SBS} = \%sbsfs;
my %adsfs = %srvfs;
addSizes($dirs{ADS}, \%adsfs);
$filesizes{ADS} = \%adsfs;
my %dtcfs = %adsfs;
addSizes($dirs{DTC}, \%dtcfs);
$filesizes{DTC} = \%dtcfs;
# Figure out what skus need to be done.
foreach my $sku (keys %dirs) {
if ( !cksku::CkSku($sku, $ENV{LANG}, $ENV{_BUILDARCH}) ) {
delete $dirs{$sku};
logmsg "Sku $sku skipped.";
}
}
# Figure out what files need to be updated.
foreach my $sku (keys %dirs) {
my $i;
for ($i=0; $i < 2; ++$i ) {
my $dir = $i ? "$dirs{$sku}\\realsign":$dirs{$sku};
my $inf_file = "$dir\\layout.inf";
my $temp_inf = "$dir\\layout.inf.tmp";
logmsg "Adding file sizes to $inf_file.";
# Open files for making changes to layout.inf.
if ( !open TEMP, ">$temp_inf" ) {
errmsg "Unable to create temporary file -- fatal";
die;
}
if ( !open INF, $inf_file ) {
errmsg "Could not open $inf_file ($!)";
die;
}
# Insert file sizes into the inf.
my $arch = $ENV{_BUILDARCH};
my $fParseLine;
my $line_num = 0;
foreach (<INF>) {
$line_num++;
next if /^\s*(;.*)?$/;
# Check for new SourceDisksFiles section entries
if (/^\s*\[([^\]]*)\]\s*$/) {
my $sect = $1;
if ( $sect =~ /^sourcedisksfiles(\.$arch)?$/i ) {
$fParseLine = 1;
} else {
undef $fParseLine;
}
next;
}
# Process lines inside of matching sections
if( $fParseLine ) {
if (/^(\s*([^\s=]+)[^\,]*\,[^\,]*\,)(\d*)(.*)$/) {
# Get size of file
my $file_name = lc $2;
my $file_size = $filesizes{$sku}->{$file_name};
if ( !$file_size ) {
wrnmsg "Unable to get size info for: $file_name";
$file_size = 222222;
}
# Add/replace size
$_ = "$1$file_size$4\n";
} else {
wrnmsg( "Unrecognized entry in $inf_file at line $line_num: $_" );
}
}
} continue {
print TEMP $_;
}
close INF;
close TEMP;
# Move the new version into place.
if ( !unlink $inf_file ) {
errmsg "Could not remove old $inf_file ($!) -- new version is located at $temp_inf";
die;
}
if ( !copy( $temp_inf, $inf_file ) ) {
errmsg "Unable to copy new $inf_file ($!) -- new version is located at $temp_inf";
die;
}
unlink $temp_inf;
}
}
# Populate the oc infs with file sizes.
foreach my $dir (values %dirs) {
logmsg "Calling ocinf for $dir\\sysoc.inf";
sys("ocinf.exe -inf:$dir\\sysoc.inf -layout:$dir\\layout.inf >> $ENV{TEMP}\\layout.err");
}
# Call an external function, then handle errors.
sub sys {
my $cmd = shift;
print "$cmd\n";
system($cmd);
if ($?) {
die "ERROR: $cmd ($?)\n";
}
}
# Add file sizes from a directory to a hash.
sub addSizes {
my ($dir, $hash) = @_;
return if !-d $dir;
if ( !opendir DIR, $dir ) {
errmsg "Could not open dir $dir ($!)";
die;
}
my @files = readdir DIR;
closedir DIR;
foreach my $file (@files) {
my $full = "$dir\\$file";
next if -d $full;
my $size = -s $full;
$hash->{lc$file} = $size;
}
return;
}
# Add file sizes from the defaults file.
sub addDefaults {
my ($hash) = @_;
my $deffile = "$ENV{RazzleToolPath}\\postbuildscripts\\infsizedefs.$ENV{_BuildArch}.tbl";
return if !-f $deffile;
if ( !open DEFAULT, $deffile ) {
errmsg "Could not open $deffile ($!)";
die;
}
my $line_num = 0;
foreach (<DEFAULT>) {
$line_num++;
if ( /^\s*$/ ) {next} # skip empty lines
if ( /^\s*;/ ) {next} # skip comments (;)
if ( /^([^:]+):(\d+)\s*$/ ) {
$hash->{lc$1} = $2;
} else {
wrnmsg "Unrecognized entry in $deffile at line $line_num: $_";
}
}
close DEFAULT;
return;
}