WindowsXP-SP1/tools/postbuildscripts/fixprn.pl

616 lines
17 KiB
Prolog

#---------------------------------------------------------------------------
# Script: fixprn.pl
#
# (c) 2000 Microsoft Corporation. All rights reserved.
#
# Purpose: This script populates the fixprnsv tree with the driver files.
#
# Version: <1.00> (10/03/2000) : (hsingh) Wrote it
# <1.01> (<mm/dd/yyyy>) : (<your alias>) <Purpose>
#---------------------------------------------------------------------
# Set Package
package fixprn;
# Set the script name
$ENV{script_name} = 'fixprn.pl';
# Set version
$VERSION = '1.00';
# Set required perl version
require 5.003;
# Use section
use lib $ENV{RAZZLETOOLPATH} . "\\PostBuildScripts";
use lib $ENV{RAZZLETOOLPATH};
use GetParams;
use LocalEnvEx;
use CkSKU;
use Logmsg;
use strict;
no strict 'vars';
sub Main {
# Convert to uppercase the env var names.
&UCENV();
#
# Get/Create Various Environment Variables.
# $lang : The build language.
# For US builds, this will be USA
# LOGFILE : Path to log file
# FIXPRNSRC : Root of fixprnsv tree. (the source)
# FIXPRNDST : Root of fixprnsv tree. (the destination)
# PRNTOOLS : Points to directory where we have infs etc ($FIXPRNROOT$\inf)...
# TEMP : temporary directory
# NTPOSTBLD : Path to the postbuild directory. This is where files are placed
# after buing built (or after being built & localized as the case may be)
&GetEnv();
&CreateEnv();
#
# Lets ensure that the required source files are present,
# lets create all the directories files etc...
#
&EnsurePathCorrectness();
#
# Create list of printer driver files
# NT4FILES : will have list of NT4 files.
# W2KFILES : will have list of Win2k/Whistler files.
#
$NT4FILES = "$TEMP\\nt4.txt";
$W2KFILES = "$TEMP\\w2k.txt";
#
# Lets create the list of NT4FILES and W2KFILES
# from the badnt4.inf and badw2k.inf
#
&CreateW2KFileList();
&CreateNT4FileList();
#
# Converting the contents of the file lists to lower case
#
&uc_to_lc($NT4FILES);
&uc_to_lc($W2KFILES);
#
# Copy Win2k/Whistler files from _NTPOSTBUILD
# to $FIXPRNDST\win2k\i386
#
&cp_w2k_files();
#
# Copy NT4 files from ............
# to $FIXPRNDST\nt4\i386
#
&cp_nt4_files();
#
# Create the catalogue files and do PRS signing.
# AdinaS says that international build lab people
# will own the signing of the non-US bld cats.
# But we still have to create cat for all languages.
#
logmsg("The lang is $lang");
&make_cats();
}
#
# Copy files in $W2KFILES to $FIXPRNDST\win2k\i386
#
sub cp_w2k_files
{
logmsg ("Deleting all files in $FIXPRNDST\\win2k\\i386");
do_cmd("del /q", "$FIXPRNDST\\win2k\\i386\\*.*");
logmsg ("Copying Whistler files");
open(W2K, "$W2KFILES") or &ExitError("Can not open $W2KFILES, created by infflist");
while(<W2K>)
{
$FILE = $_;
chomp($FILE);
if ($FILE ne "badw2k.inf")
{
if ( $FILE =~ /^srgb .+\.icm/i ) {
$FILE="srgb.icm";
}
logmsg ("Copying $NTPOSTBLD\\$FILE to $FIXPRNDST\\win2k\\i386");
do_cmd("copy /y", "$NTPOSTBLD\\$FILE", "$FIXPRNDST\\win2k\\i386");
}
}
}
#
# Copy files in $NT4FILES to $FIXPRNDST\nt4\i386
# NT4 files are of 3 types
# 1. Those that are similar to Win2k. (mainly gpd's)
# 2. Those that are specific to NT4 and do not need to be localized (gpds)
# 3. Those that are specific to NT4 but have to be localized (e.g. .dlls, .hlp)
# Files of type 2,3 will be checked into the source depot. During the build process
# they will be (localized and) binplaced into $FIXPRNDST\nt4\i386.
# Therefore we dont need to copy them using this script. We only need
# to take care of files of type 1.
# So we need to a list of files that are of type 1. This
# list will be checked into SD and placed in \printers\fixprnsv\nt4w2kcm.lst
# during the build process.
#
sub cp_nt4_files
{
#
# Because of some build/postbuild script that I dont really know about,
# some files are getting copied to $FIXPRNDST\\nt4\\386.
# Lets delete those files.
#
logmsg ("Deleting any files in $FIXPRNDST\\nt4\\i386");
do_cmd("del /q", "$FIXPRNDST\\nt4\\i386\\*.*");
#
# NT4 files are gathered from 2 places.
# 1. Those that are NT4 specific are copied from scratch directory.
# 2. Those that are common with Whistler are copied from Whistler
# post build directory.
#
# Lets first deal with files of type 1.
# Copying NT4 files that were binplaced during build time but
# are now in some scratch directory.
# Postbuild should not delete any files that has been binplaced
# during build time. Since we dont want to ship the uncompressed files
# and we cannot delete them either, therefore the build has to place
# the files in a scratch tree.
#
logmsg ("Copying files from scratch tree - $FIXPRN_NT4_SCRATCH");
do_cmd("copy /y", "$FIXPRN_NT4_SCRATCH\\nt4\\i386\\*.*", "$FIXPRNDST\\nt4\\i386");
logmsg ("Copying NT4 files that are same as Whistler files");
$nt4w2kcommon = "$FIXPRN_NT4_SCRATCH\\nt4w2kcm.lst";
#
# File of type 2. (i.e. those common with Whistler).
# 1. Open nt4w2kcm.lst (which has list of common files).
# 2. clean it i.e. remove blank lines, needless spaces etc..
# 3. Copy files from %NTPOSTBLD% to \printers\fixprnsv\nt4\i386
#
open(NT4W2K, "$nt4w2kcommon") or &ExitError("Can not open $nt4w2kcommon : list of files common to nt4,w2k");
while(<NT4W2K>)
{
$FILE = $_;
chomp($FILE);
if ($FILE ne "")
{
logmsg ("Copying $NTPOSTBLD\\$FILE to $FIXPRNDST\\nt4\\i386");
do_cmd("copy /y", "$NTPOSTBLD\\$FILE", "$FIXPRNDST\\nt4\\i386");
}
}
close NT4W2K;
#
# Dont need the filelist anymore.
# But should not delete it since post build can run more than once.
# Whenever this script runs, it needs this file. So if this file
# is deleted, script will fail, and that will be a build break.
# logmsg ("Deleting $nt4w2kcommon");
# do_cmd("del /q", "$nt4w2kcommon");
}
sub make_cats
{
my $CDFPATH="$TEMP\\cdf";
$W2KPATH = "$FIXPRNDST\\win2k";
$NT4PATH = "$FIXPRNDST\\nt4";
system "if not exist $CDFPATH md $CDFPATH";
#
# To create the .cat file there are two steps
# Step 1 = Create .cdf file
# Step 2 = Use the .cdf file to create .cat file.
#
#
# Step 1 . Create .cdf file for Whistler drivers.
#
logmsg("Creating w2kfspx.cat");
@W2KFILES = `dir /b /a-d $W2KPATH\\i386`;
open(CDFFILE, ">$CDFPATH\\w2kfpsx.cdf" ) or &ExitError("Can not create w2kfpsx.cdf");
print CDFFILE "\[CatalogHeader\]\nName=w2kfpsx\nPublicVersion=0x0000001\nEncodingType=0x00010001\nCATATTR1=0x10010001:OSAttr:2:5.1,2:5.0\n\[CatalogFiles\]\n";
print CDFFILE "<hash>$W2KPATH\\badw2k.inf=$W2KPATH\\badw2k.inf\n";
print CDFFILE "<hash>$FIXPRNDST\\printupg.inf=$FIXPRNDST\\printupg.inf\n";
foreach (@W2KFILES) {
chomp $_;
print CDFFILE "<hash>$W2KPATH\\i386\\$_=$W2KPATH\\i386\\$_\n";
}
close CDFFILE;
#
# Step 2. Create the .cat file for Whistler drivers
#
chdir "$W2KPATH";
if ( system ("makecat $CDFPATH\\w2kfpsx.cdf") )
{
&ExitError( "makecat $CDFPATH\\w2kfpsx.cdf failed" );
}
if ( $lang eq "usa" )
{
logmsg("Attempting to sign w2kfpsx.cat");
system ("ntsign.cmd -f w2kfpsx.cat");
}
#
# Compress the files in $W2KPATH\\i386 directory.
# Removes the uncompressed files.
#
&CompressAndRemove("$W2KPATH\\i386");
#
# Step 1. Create .cdf file for NT4 Drivers.
#
logmsg("Creating nt4fpsx.cat");
@NTXFILES = `dir /b /a-d $NT4PATH\\i386`;
open(CDFFILE, ">$CDFPATH\\nt4fpsx.cdf" ) or &ExitError("Can not create nt4fpsx.cdf");
print CDFFILE "\[CatalogHeader\]\nName=nt4fpsx\nPublicVersion=0x0000001\nEncodingType=0x00010001\nCATATTR1=0x10010001:OSAttr:2:4.x\n\[CatalogFiles\]\n";
print CDFFILE "<hash>$NT4PATH\\badnt4.inf=$NT4PATH\\badnt4.inf\n";
foreach(@NTXFILES) {
chomp $_;
print CDFFILE "<hash>$NT4PATH\\i386\\$_=$NT4PATH\\i386\\$_\n";
}
close CDFFILE;
#
# Step 2. Create .cat file for NT4 Drivers.
#
chdir "$NT4PATH";
if ( system ("makecat $CDFPATH\\nt4fpsx.cdf"))
{
&ExitError( "makecat $CDFPATH\\nt4fpsx.cdf failed" );
}
if ( $lang eq "usa" )
{
logmsg("Attempting to sign nt4fpsx.cat");
system ("ntsign.cmd -f nt4fpsx.cat");
}
&CompressAndRemove("$NT4PATH\\i386");
# $CDFPATH is in temp directory. So no need to remove it (Bug # 342330)
# logmsg("Deleting $CDFPATH");
# system "rd /s /q $CDFPATH";
}
#
# Compresses files in the directory.
# Renames them by adding _ at the end of file name
# (e.g. unirv.dll will be renames unidrv.dl_ ).
# Removes the orginal file
#
sub CompressAndRemove {
#
# 1) First compress the files. Compressed files will have _ at end.
# Now the directory will have both compressed and non-compressed
# files.
# 2) Make the files with _ read only.
# 3) Delete all the files that are not read only.
# 4) remove the read only attribute from the _ files.
# (not sure if this is required, but lets just do it)
#
$DIRECTORY = $_[0];
logmsg("Compressing files in $DIRECTORY");
system "compress -r $DIRECTORY\\*.* > nul";
system "attrib +r $DIRECTORY\\*.*_";
system "del /q /a:-R $DIRECTORY\\*";
system "attrib -r $DIRECTORY\\*";
}
#
# (Read comment for CreateW2KFileList)
#
sub CreateNT4FileList {
&GetInfflist( "$NTPOSTBLD\\printers\\fixprnsv\\nt4", "badnt4.inf", $NT4FILES );
}
#
# Create list of Win2K/Whistler Files. For US builds, this will be the list
# of files in badw2k.inf. For FE builds, this list will, in addition,
# have files that are required only for FE builds. (Assuming that
# badw2k.inf will already have have language specific entries merged into it).
#
sub CreateW2KFileList {
&GetInfflist( "$NTPOSTBLD\\printers\\fixprnsv\\win2k", "badw2k.inf", $W2KFILES );
}
#
# Gets the list of files in an inf.
# 1st param = path of the inf file (i.e. the directory)
# 2nd param = the inf file name
# 3rd param = the destination of the list of driver file names
# as extracted from the inf.
#
sub GetInfflist {
my ( $infpath, $inffile, $flist) = @_;
logmsg ("Extracting file list from $infpath\\$inffile");
if ( ! -e "$infpath\\$inffile" ) {
&ExitError ( "Unable to find $infpath\\$inffile");
}
chdir($infpath);
system "infflist.exe $infpath\\$inffile > $flist";
}
#
# Convert contents to lower case.
#
sub uc_to_lc
{
logmsg("Converting to lowercase: $_[0]");
open(FILE, $_[0] ) or &ExitError( "Can not open $_[0]");
open(TEMP, ">$TEMP\\tmp.txt") or &ExitError( "Can not open temp file");
$CHG = <FILE>;
while($CHG)
{
$CHG =~ tr/A-Z/a-z/;
print TEMP "$CHG";
$CHG = <FILE>;
}
close FILE;
close TEMP;
system "del $_[0]";
do_cmd("copy /y", "$TEMP\\tmp.txt", "$_[0]");
}
#
# Ensures the various paths/files required are present.
# If they are not, then it either exits or creates (as the
# case may be)
#
sub EnsurePathCorrectness
{
if ( ! -e "$FIXPRNSRC" )
{
&ExitError("Fixprnsv source directory not found : $FIXPRNSRC");
}
if ( ! -e "$NTPOSTBLD" )
{
&ExitError("Post Build directory not available : $NTPOSTBLD");
}
if ( ! -e "$FIXPRNDST" ) {
&ExitError("Building of fixprnsv should have created $FIXPRNDST directory. Cant continue without it");
}
if ( ! -e "$FIXPRN_NT4_SCRATCH\\nt4w2kcm.lst" )
{
&ExitError("Building of fixprnsv should have binplaced nt4w2kcm.lst in $FIXPRN_NT4_SCRATCH directory. Cant continue without it");
}
system "if not exist $FIXPRNDST\\nt4\\i386 md $FIXPRNDST\\nt4\\i386";
system "if not exist $FIXPRNDST\\win2k\\i386 md $FIXPRNDST\\win2k\\i386";
}
#
# Changes environment variables to uppercase.
#
sub UCENV {
%UCENV=();
foreach (%ENV) {
$UCENV{uc($_)}=$ENV{$_};
}
}
sub GetEnv
{ $SCRIPT_NAME="fixprn.pl";
if ( exists $UCENV{'LANG'} ) {
$LANG = $UCENV{'LANG'};
} else {
$LANG="";
}
if ( exists $UCENV{'_NTPOSTBLD'} ) {
$NTPOSTBLD = $UCENV{'_NTPOSTBLD'};
} else {
die "_NTPOSTBLD environment variable not defined.";
}
if ( exists $UCENV{'TEMP'} ) {
$TEMP = $UCENV{'TEMP'};
if ( $LANG ) {
$TEMP = "$TEMP\\$LANG";
}
} else {
die "TEMP environment variable not defined.";
}
system "if not exist $TEMP md $TEMP";
}
#
# Create various environment variables
# that will be required by script.
#
sub CreateEnv {
#
# Define the LOGFILE if noy already defined.
#
if ( exists $UCENV{'LOGFILE'} ) {
$LOGFILE =$UCENV{'LOGFILE'};
} else {
$LOGFILE="$TEMP\\FIXPRVSV.LOG";
if ( -e $LOGFILE ) { unlink $LOGFILE; }
}
#
# Check the environment
# FIXPRNSRC : will point to the directory where
# we have infs, any text files for special processing
# etc...
# FIXPRNDST : will point to the destination (where the files
# need to be copied after all processing has been done)
#
#
if ( exists $UCENV{'_NTBINDIR'} ) {
$NTBINDIR = $UCENV{'_NTBINDIR'};
} else {
&ExitError("Undefined _NTBINDIR");
}
if ( exists $UCENV{'FIXPRNSRC'} ) {
$FIXPRNSRC = $UCENV{'FIXPRNSRC'};
} else {
$FIXPRNSRC = "$NTPOSTBLD\\printers\\fixprnsv";
}
if ( exists $UCENV{'PRNTOOLS'} ) {
$PRNTOOLS = $UCENV{'PRNTOOLS'};
} else {
$PRNTOOLS = "$NTPOSTBLD\\printers\\fixprnsv\\infs";
}
if ( exists $UCENV{'FIXPRNDST'} ) {
$FIXPRNDST = $UCENV{'FIXPRNDST'};
} else {
$FIXPRNDST = "$NTPOSTBLD\\printers\\fixprnsv";
}
if ( exists $UCENV{'FIXPRN_NT4_SCRATCH'} ) {
$FIXPRN_NT4_SCRATCH = $UCENV{'FIXPRN_NT4_SCRATCH'};
} else {
$FIXPRN_NT4_SCRATCH = "$NTPOSTBLD\\fixprnscratch";
}
}
sub ExitError {
my ($errmsg) = @_;
errmsg ("$errmsg\n");
exit(1);
}
sub do_cmd
{
$CMD = $_[0];
$SRC = $_[1];
$DEST = $_[2];
$ERR = system "$CMD $SRC $DEST > nul";
if($ERR)
{
errmsg("Could not $CMD $SRC to $DEST");
}
}
sub CopyFile {
my ($file, $dest) = @_;
logmsg( "Copying $file $dest");
if ( ! -e $file ) {
&ExitError( "File $file not found");
}
do_cmd("copy /y", "$file", "$dest");
}
sub ValidateParams {
#<Add your code for validating the parameters here>
}
sub Usage {
print <<USAGE;
Usage : perl fixprn.pl <Path to Windows 2000 binary directory
(where files are placed after being built (and localized)>
<Path to the compressed binaries share>
[<Path to NT4 files>]
Script populates %binaries%\\printers\\fixprnsv with the Windows 2000 drivers.
NT4 files updated if NT4 parameter is specified.
Parameter 1 (Mandatory) - Path to the Windows 2000 driver.cab
e.g. \\\\ntbuilds\\release\\usa\\2180\\x86\\fre.wks
Parameter 2 (Mandatory) - Path to the compressed binaries share
e.g. \binaries.comp
Parameter 3 (Optional) - Give NT4 as second parameter
if refresh of NT4 binaries is required.
Parameter 4 (Mandatory if Paraneter 2 is NT4)
Path to NT Service Pack till the place where unidrv5.4
driver files are present.
e.g. \\\\ntbuilds\\release\\usa\\svcpack\\sp6\\1.058\\support\\printersEOM
USAGE
}
sub GetParams {
# Step 1: Call pm getparams with specified arguments
&GetParams::getparams(@_);
# Step 2: Set the language into the enviroment
$ENV{lang}=$lang;
# Step 3: Call the usage if specified by /?
if ($HELP) {
&Usage();
exit 1;
}
}
if (eval("\$0 =~ /" . __PACKAGE__ . "\\.pl\$/i")) {
# Step 1: Parse the command line
# <run perl.exe GetParams.pm /? to get the complete usage for GetParams.pm>
&GetParams ('-o', 'l:', '-p', 'lang', @ARGV);
# Include local environment extensions
&LocalEnvEx::localenvex('initialize');
# Set lang from the environment
$lang=$ENV{lang};
# Validate the option given as parameter.
&ValidateParams;
# Exit if not a server product
%ValidFlavors = &cksku::GetSkus($ENV{lang}, $ENV{_BuildArch});
if ( exists $ValidFlavors{'bla'} || $ValidFlavors{'sbs'} || exists $ValidFlavors{'srv'} || exists $ValidFlavors{'ads'} || exists $ValidFlavors{'dtc'} ) {
# Step 4: Call the main function
&fixprn::Main();
} else {
logmsg("Fixprnsv not applicable to this pro-only language.");
}
# End local environment extensions.
&LocalEnvEx::localenvex('end');
}