|
|
################################################################################# # # Script: muimsi.pm # # (c) 2000 Microsoft Corporation. All rights reserved. # # Purpose: This script creates the msi package # # Version: 1.00 (06/27/2001) : (lguindon) Created # ##################################################################################
# Set Package package muimsi;
# Set the script name $ENV{script_name} = 'muimsi.pm'; $cmdPrompt = 0;
# Set version $VERSION = '1.00';
# Set required perl version require 5.003;
# Use section use lib $ENV{ "RazzleToolPath" }; use lib $ENV{ "RazzleToolPath" } . "\\PostBuildScripts"; use GetParams; use LocalEnvEx; use Logmsg; use strict; no strict 'vars'; use HashText; use ParseTable; use File::Copy; use File::Find; use Cwd; use DirHandle;
# Require Section require Exporter; # Global variable section
################################################################################## # # Main entry point. # ################################################################################## sub Main { # Check environment variables if (!&VerifyEnvironment()) { # wrnmsg ("The environment is not correct for MSI Package build."); # return 1; errmsg ("The environment is not correct for MSI Package build."); return 0;
} elsif (!($ENV{_BuildArch} =~/x86/i)) { logmsg ("Skip non-x86 build environment"); return 1; }
# Get language's LCID and ISO code if (!&GetCodes()) { errmsg ("The language's LCID and ISO code could not be extracted from the CODEFILE."); return 0; }
# Define some constants if (!&DefineConstants()) { errmsg ("Constants could not be defined."); return 0; }
# Make sure directories exist if (!&CheckDirs()) { errmsg ("The required directorys do not exist."); return 0; }
# Search for current build number if (!&LookForBuildNumber()) { errmsg ("No build number information found."); }
# Generate file contents files if (!&FileContents()) { errmsg ("File contents couldn't be created."); }
# Generate custom action files if (!&CustomAction()) { errmsg ("Error with Custom Action script."); }
# Apply XMLVAR to the template if (!&XMLVAR()) { errmsg ("Error with XMLVAR script."); }
# Make MSI package if (!&MakeMSI()) { errmsg ("Error making the MSI Package."); } } # Main
################################################################################## # # VerifyEnvironment() # # Validates necessary environment variables. # ################################################################################## sub VerifyEnvironment { logmsg ("Validating the environment.");
$RAZZLETOOLPATH=$ENV{RazzleToolPath}; $_NTPOSTBLD=$ENV{_NTPOSTBLD};
logmsg("------- RAZZLETOOLPATH is $RAZZLETOOLPATH"); logmsg("------- _NTPOSBLD is $_NTPOSTBLD");
if ($LANG=~/psu_(.*)/i) { $Special_Lang=$1; } elsif ($LANG=~/psu/i || $LANG=~/mir/i ) { if (defined( $ENV{"LANG_MUI"} ) ) { $Special_Lang=$ENV{"LANG_MUI"}; } elsif ($LANG=~/psu/i) { $Special_Lang="ro"; } else { $Special_Lang="ara"; } } else { $Special_Lang=$LANG; }
logmsg ("------- special lang is $Special_Lang");
$PROCESSOR=$ENV{PROCESSOR}; if ($ENV{_BuildArch} =~/x86/i) { $_BuildArch="i386"; } else { $_BuildArch=$ENV{_BuildArch}; }
$LOGS=$ENV{temp}; logmsg("------- Build architecture is $_BuildArch"); logmsg("------- LOGS is $LOGS"); if ($ENV{_BuildType} =~ /^chk$/i) { wrnmsg ("This does not run on chk machines"); return 0; }
if(defined($SAFEMODE=$ENV{SAFEMODE})) { logmsg ("SAFEMODE is ON"); }
logmsg ("Success: Validating the environment."); return 1; } # VerifyEnvironment
################################################################################## # # DefineConstants() # # Defines global constants. # ################################################################################## sub DefineConstants { logmsg ("Definition of global constants.");
# Directories # $LOCBINDIR = "d:\\"; // removed hardcoded path # $MUIDIR = "d:\\mui"; // removed hardcoded path $LOCBINDIR = "$_NTPOSTBLD"; $MUIDIR = "$LOCBINDIR\\mui"; $MSIDIR = "$MUIDIR\\MSI"; $CONTROLDIR = "$MUIDIR\\control"; $SOURCEDIR = "$MUIDIR\\$Special_Lang\\$_BuildArch.uncomp"; $DESTDIR = "$MUIDIR\\release\\$_BuildArch\\MSI"; $TMPBUILD = "$MUIDIR\\$Special_Lang\\tmp";
logmsg("------- LOCBINDIR is $LOCBINDIR"); logmsg("------- MUIDIR is $MUIDIR"); logmsg("------- MSIDIR is $MSIDIR"); logmsg("------- CONTROLDIR is $CONTROLDIR"); logmsg("------- SOURCEDIR is $SOURCEDIR"); logmsg("------- DESTDIR is $DESTDIR"); logmsg("------- TMPBUILD is $TMPBUILD");
# Filenames # $TEMPLATE = "$CONTROLDIR\\muimsi_template.wim"; // removed hardcoded path # $WISCHEMA = "$CONTROLDIR\\WiSchema.xml"; $TEMPLATE = "$MSIDIR\\muimsi_template.wim"; $MUIMSIXML = "$TMPBUILD\\$LCID_SHORT.wim"; $MUIMSIWIX = "$TMPBUILD\\$LCID_SHORT.msi"; $MUIMSI = "$DESTDIR\\$LCID_SHORT.msi";; $FILECNT_CORE = "$TMPBUILD\\FileContent_CORE.wxm"; $FILECNT_PRO = "$TMPBUILD\\FileContent_PRO.wxm"; $FILECNT_SRV = "$TMPBUILD\\FileContent_SRV.wxm"; $FILELST_CORE = "$TMPBUILD\\FileContent_CORE.msm"; $FILELST_PRO = "$TMPBUILD\\FileContent_PRO.msm"; $FILELST_SRV = "$TMPBUILD\\FileContent_SRV.msm"; $CUSTACTION = "$CONTROLDIR\\Custom_action.wxm"; $CUSTACTIONCOMP = "$CONTROLDIR\\Custom_action.msm"; $MSIPACKAGE = "$DESTDIR\\$Special_Lang.msi"; $WISCHEMA = "$MSIDIR\\WiSchema.xml";
# Applications # $INFPARSER = "c:\\document\\work\\infparser\\debug\\infparser.exe"; // removed hardcoded paths # $CANDLE = "e:\\wix\\src\\candle\\candle.wsf"; // removed hardcoded paths # $LIGHT = "e:\\wix\\src\\light\\light.wsf"; // removed hardcoded paths # $XMLVAR = "$RAZZLETOOLPATH\\x86\\perl\\bin\\perl.exe d:\\mui\\control\\xmlvar.bat"; // removed hardcoded paths $INFPARSER = "infparser.exe"; $CANDLE = "CScript.exe $MSIDIR\\candle.wsf"; $LIGHT = "CScript.exe $MSIDIR\\light.wsf"; $XMLVAR = "perl.exe $MSIDIR\\xmlvar.bat";
# Flavor if($_BuildArch =~ /i386/i) { $FLAVOR = "32"; } elsif ($_BuildArch =~ /ia64/i) { $FLAVOR = "64"; }
logmsg("------- FLAVOR is $FLAVOR");
# GUID - read the language guid off the language-guid file, if it's not there # generate one and put it in the file. $GUIDFILE = "$MSIDIR\\guidlang.txt"; logmsg ("Get the language's MSI package ID from $GUIDFILE.");
my(@langguids, @newcontent);
# Search GUIDFILE for $Special_Lang and the associated MSI package guid if(!open(GUIDFILE, "$GUIDFILE")) { errmsg ("Can't open language guid file $GUIDFILE for reading."); return 0; } GUID_LOOP: while (<GUIDFILE>) { # add the file content to an array, in case we need to append additional data # push(@newcontent, $_); if (/^$Special_Lang\s+/i) { @langguids = split(/\s+/,$_); $MSIGUID = $langguids[1]; # 2nd field should be the language guid last GUID_LOOP; # exit out of the loop if found } } close(GUIDFILE);
# if the language is not found, add a new guid entry into GUIDFILE if(!@langguids) { logmsg ("$Special_Lang is not found in $GUIDFILE, adding an entry for it."); ($MSIGUID) = `uuidgen`; chomp $MSIGUID; $MSIGUID =~ tr/a-z/A-Z/; # $GUIDENTRY = "\n".$Special_Lang." ".$MSIGUID; # push(@newcontent, $GUIDENTRY);
# if(!open(GUIDFILE, ">$GUIDFILE")) { # errmsg ("Cannot open $GUIDFILE for writing."); # return 0; # } # print GUIDFILE @newcontent; # close(GUIDFILE); } logmsg("------- MSIGUID is $MSIGUID"); # Other GUIDs $UPGRADEGUID = "177146D4-5102-4BD9-98A0-114A3ED39076"; $CONTENTGUID = "1AFE112F-290F-4A94-2000-AB4D3FD8B102"; # MSI version number my ($src, $isdst); ($src, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime; eval $hour; eval $min; eval $yday; eval $wday; $VERSIONNUMBER = 100*(12*($year-101)+$mon+1)+$mday;
logmsg("------- VERSIONNUMBER is $VERSIONNUMBER");
# Package name $PACKAGENAME = "muiMSITemplate ($VERSIONNUMBER)";
logmsg("------- PACKAGENAME is $PACKAGENAME");
logmsg ("Success: Definition of global constants."); $BuildChecksum=1; return 1; } # DefineConstants
################################################################################## # # GetCodes # # Gets the language's LCID and ISO language code from CODEFILE. # ################################################################################## sub GetCodes { #set the code file name to read $CODEFILE = "$RAZZLETOOLPATH\\codes.txt"; logmsg ("Get the language's LCID and ISO language code from $CODEFILE."); my(@data);
# Don't allow nec_98 or CHT to be processed! if($Special_Lang =~ /^(NEC_98|CHT)$/i) { logmsg ("No MUI available for $Special_Lang"); exit 0; }
# Search CODEFILE for $Special_Lang, $LCID, $LANG_ISO, etc. if(!open(CODEFILE, "$CODEFILE")) { errmsg ("Can't open lcid file $CODEFILE for reading."); return 0; } CODES_LOOP: while (<CODEFILE>) { if (/^$Special_Lang\s+/i) { @data = split(/\s+/,$_); last CODES_LOOP; } } close(CODEFILE);
if(!@data) { logmsg ("$Special_Lang is an unknown language"); &Usage; return 0; }
$LCID = $data[2]; $LCID_SHORT = $LCID; $LCID_SHORT =~ s/^0x//; $LANG_ISO = $data[8]; $GUID = $data[11];
#extract the language description - this is the concatenated strings of element 13 to the last element in the array $LANG_NAME = $data[13]; for ($i = 14; $i <= $#data; $i++) { $LANG_NAME = "$LANG_NAME $data[$i]"; } logmsg ("Success: Get the language's LCID and ISO language code frrm $CODEFILE."); logmsg("------- LCID is $LCID"); logmsg("------- LCID_SHORT is $LCID_SHORT"); logmsg("------- LANG_ISO is $LANG_ISO"); logmsg("------- GUID is $GUID"); logmsg("------- LANG_NAME is $LANG_NAME"); return 1; } # GetCodes
################################################################################## # # CheckDirs # # Makes sure that the necessary directories exist. # ################################################################################## sub CheckDirs { logmsg ("Make sure the necessary directories exist."); my($status);
# Make sure the source directories exist foreach ($LOCBINDIR,$MUIDIR,$CONTROLDIR,$SOURCEDIR,$MSIDIR) { if(! -e $_) { logmsg ("$0: ERROR: $_ does not exist"); return 0; } }
# Make sure destination directories exist foreach ($DESTDIR,$TMPBUILD) { if(! -e $_) { $status = system("md $_"); if($status) { logmsg ("$0: ERROR: cannot create $_"); return 0; } } }
logmsg ("del /q /f $TMPBUILD\\*.*");
`del /q /f $TMPBUILD\\*.*`;
logmsg ("Success: Make sure the necessary directories exist."); return 1; } # CheckDirs
################################################################################## # # LookForBuildNumber # # Scan build log for the build number. # ################################################################################## sub LookForBuildNumber { logmsg ("Update mui.inf with the current build number.");
# Get current build number $LOGS="$_NTPOSTBLD\\build_logs"; my $filename="$LOGS\\buildname.txt"; open (BUILDNAME, "< $filename") or die "Can't open $filename for reading: $!\n"; while (<BUILDNAME>) { $BLDNO = $_; $BLDNO =~ s/\.[\w\W]*//i; } close BUILDNAME;
if ($BLDNO =~ /(^\d+)-*\d*$/) { $BLDNO = $1; } else { errmsg ("Errorin LookForBuildNumber: BLDNO is $BLDNO"); return 0; } chomp($BLDNO); logmsg("------- BLDNO is $BLDNO");
logmsg ("Success: Update mui.inf with the current build number."); return 1; } # LookForBuildNumber
################################################################################## # # FileContents() # # Generate different flavor of filecontents.wxm. # ################################################################################## sub FileContents { logmsg ("Generate MSI file contents.");
# Generate core file content logmsg ("Generate MSI Core content."); logmsg ("$INFPARSER /b:$FLAVOR /l:$Special_Lang /f:c /s:$MUIDIR /o:$FILECNT_CORE"); `$INFPARSER /b:$FLAVOR /l:$Special_Lang /f:c /s:$MUIDIR /o:$FILECNT_CORE`;
# Compile core file content logmsg ("Compile MSI Core content."); logmsg ("$CANDLE -c $FILELST_CORE $FILECNT_CORE"); `$CANDLE -c $FILELST_CORE $FILECNT_CORE`;
# Link core file content logmsg ("Link MSI Core contents."); logmsg ("$LIGHT $FILELST_CORE"); `$LIGHT $FILELST_CORE`;
# Generate file content for Professional logmsg ("Generate MSI contents for Professional."); logmsg("$INFPARSER /b:$FLAVOR /l:$Special_Lang /f:p /s:$MUIDIR /o:$FILECNT_PRO"); `$INFPARSER /b:$FLAVOR /l:$Special_Lang /f:p /s:$MUIDIR /o:$FILECNT_PRO`;
# Compile file content for Professional logmsg ("Compile MSI contents for Professional."); logmsg("$CANDLE -c $FILELST_PRO $FILECNT_PRO"); `$CANDLE -c $FILELST_PRO $FILECNT_PRO`;
# Link file content for Professional logmsg ("Link MSI content for Professional."); logmsg("$LIGHT $FILELST_PRO"); `$LIGHT $FILELST_PRO`;
# Generate file content for Server logmsg ("Generate MSI contents for Server."); logmsg("$INFPARSER /b:$FLAVOR /l:$Special_Lang /f:s /s:$MUIDIR /o:$FILECNT_SRV"); `$INFPARSER /b:$FLAVOR /l:$Special_Lang /f:s /s:$MUIDIR /o:$FILECNT_SRV`;
# Compile file content for Server logmsg ("Compile MSI contents for Server."); logmsg("$CANDLE -c $FILELST_SRV $FILECNT_SRV;"); `$CANDLE -c $FILELST_SRV $FILECNT_SRV`;
# Link file content for Server logmsg ("Link MSI contents for Server."); logmsg ("$LIGHT $FILELST_SRV"); `$LIGHT $FILELST_SRV`;
logmsg ("Success: Generate MSI file contents."); return 1; } #FileContents
################################################################################## # # CustomAction() # # Generate file associated with custom action if needed. # ################################################################################## sub CustomAction { logmsg ("Generate MSI file contents.");
# Do something
logmsg ("Success: Generate MSI file contents."); return 1; } #CustomAction
################################################################################## # # XMLVAR() # # Generate a language specific msi template. # ################################################################################## sub XMLVAR { logmsg ("Generate language specific msi template.");
# Generate [LCID].WIM based on the template logmsg ("Run XMLVAR on the generic template."); # `$XMLVAR guid="$MSIGUID" namePackage="$PACKAGENAME" ver="1.0.$VERSIONNUMBER.0" guidUpgradeCode="$UPGRADEGUID" debugdir="$TMPBUILD" Language="$Special_Lang" BLD="$BLDNO" LCID="$LCID_SHORT" srcSchema="$WISCHEMA" < $TEMPLATE > $MUIMSIXML`; logmsg("$XMLVAR msiguid=\"$MSIGUID\" namePackage=\"$PACKAGENAME\" ver=\"1.0.$VERSIONNUMBER.0\" guidUpgradeCode=\"$UPGRADEGUID\" debugdir=\"$TMPBUILD\" Language=\"$LANG_NAME\" BLD=\"$BLDNO\" CORESRC=\"$FILELST_CORE\" PROSRC=\"$FILELST_PRO\" LCID=\"$LCID_SHORT\" srcSchema=\"$WISCHEMA\" < $TEMPLATE > $MUIMSIXML;"); `$XMLVAR msiguid="$MSIGUID" namePackage="$PACKAGENAME" ver="1.0.$VERSIONNUMBER.0" guidUpgradeCode="$UPGRADEGUID" debugdir="$TMPBUILD" Language="$LANG_NAME" BLD="$BLDNO" CORESRC="$FILELST_CORE" PROSRC="$FILELST_PRO" LCID="$LCID_SHORT" srcSchema="$WISCHEMA" < $TEMPLATE > $MUIMSIXML`;
logmsg ("Success: Generate language specific msi template."); return 1; } #XMLVAR
################################################################################## # # MakeMSI() # # Build the MSI package. # ################################################################################## sub MakeMSI { $MEGEMODDLL = "$RAZZLETOOLPATH\\x86\\mergemod.dll"; logmsg ("Create MSI package.");
logmsg ("Registering mergemod.dll"); logmsg ("regsvr32 /s $MEGEMODDLL"); `regsvr32 /s $MEGEMODDLL`; # Compile language specific template logmsg ("Compile the language specific template."); logmsg("$CANDLE -e -v -c $MUIMSIWIX $MUIMSIXML"); `$CANDLE -e -v -c $MUIMSIWIX $MUIMSIXML`;
# Link language specific template logmsg ("Link the language specific template."); logmsg ("$LIGHT -v -o $MUIMSI $MUIMSIWIX"); `$LIGHT -v -o $MUIMSI $MUIMSIWIX `;
logmsg ("Success: Create MSI package."); return 1; } #MakeMSI
################################################################################## # # ValidateParams() # # VAlidate parameters. # ################################################################################## sub ValidateParams { #<Add your code for validating the parameters here> }
################################################################################## # # Usage() # # Print usage. # ################################################################################## sub Usage { print <<USAGE; Create the MUI MSI package for the specified language Usage: $0 [-l lang] -l Language -? Displays usage Example: $0 -l jpn USAGE }
################################################################################## # # GetParams() # # Get language parameter. # ################################################################################## sub GetParams { # Step 1: Call pm getparams with specified arguments &GetParams::getparams(@_);
# Step 2: Set the language into the enviroment $ENV{lang}=$lang;
logmsg("-------- lang parameter passed in is $lang");
# Step 3: Call the usage if specified by /? if ($HELP) { &Usage(); exit 1; } }
################################################################################## # # Cmd entry point for script. # ################################################################################## if (eval("\$0 =~ /" . __PACKAGE__ . "\\.pm\$/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}; # $Special_Lang = "JPN"; // commented out, these are set in GetCodes # $LCID_SHORT = "0411"; // commented out, these are set in GetCodes
# Validate the option given as parameter. &ValidateParams;
# Set flag indicating that we run from command prompt. $cmdPrompt = 1;
# Step 4: Call the main function &muimsi::Main();
# End local environment extensions. &LocalEnvEx::localenvex('end'); }
|