559 lines
18 KiB
Perl
559 lines
18 KiB
Perl
# ---------------------------------------------------------------------------
|
|
# Script: symindex.pm
|
|
#
|
|
# (c) 2000 Microsoft Corporation. All rights reserved.
|
|
#
|
|
# Purpose: symbols server package
|
|
#
|
|
# Version: 1.00 (06/14/2000) - dmiura Make international complient
|
|
#---------------------------------------------------------------------
|
|
|
|
# Set Package
|
|
package symindex;
|
|
|
|
# Set the script name
|
|
$ENV{script_name} = 'symindex.pm';
|
|
|
|
# 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 Logmsg;
|
|
use GetIniSetting;
|
|
use strict;
|
|
no strict 'vars';
|
|
|
|
# Require section
|
|
require Exporter;
|
|
|
|
# Global variable section
|
|
( $MainSymSrvShare, $OfficialIDXBranch1, $OfficialIDXBranch2 );
|
|
|
|
$MainSymSrvShare = undef;
|
|
|
|
# if running on idx branch then some paths below will change
|
|
$OfficialIDXBranch1 = "idx01";
|
|
$OfficialIDXBranch2 = "idx02";
|
|
|
|
|
|
sub Main {
|
|
# /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
|
|
# Begin Main code section
|
|
# /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
|
|
# Return when you want to exit on error
|
|
# <Implement your code here>
|
|
|
|
|
|
# /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
|
|
# End Main code section
|
|
# /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
|
|
}
|
|
|
|
# <Implement your subs here>
|
|
sub IndexSymbols
|
|
{
|
|
# get passed arg
|
|
my( $Language, $BuildName, $LogFileName ) = @_;
|
|
my( $SymLocation, $LocalSymSrvDir, $ArchType, $RazPath, $Return);
|
|
|
|
if ( ! ( defined ( $ENV{ "OFFICIAL_BUILD_MACHINE" } ) ) ) {
|
|
# we don't index symbols on non-official machines
|
|
logmsg( "Non-official build machine, not indexing symbols ...");
|
|
return;
|
|
}
|
|
|
|
# # comment out this code to enable VBLs to index
|
|
# if ( ! ( defined ( $ENV{ "MAIN_BUILD_LAB_MACHINE" } ) ) ) {
|
|
# # we don't index symbols yet outside the main build lab
|
|
# logmsg( "Not a main build lab machine, not indexing symbols yet...");
|
|
# return;
|
|
# }
|
|
|
|
$SymLocation = &GetSymbolsLocation( $Language, $BuildName, $LogFileName );
|
|
|
|
if ( ! ( defined( $SymLocation ) ) ) {
|
|
errmsg( "Location of symbols to index can't be determined");
|
|
return;
|
|
}
|
|
|
|
# comment out for now, timing problems may cause indexing to occur before sym copy
|
|
# if ( ! ( -e $SymLocation ) ) {
|
|
# errmsg( "Location of symbols $SymLocation doesn't exist");
|
|
# return;
|
|
# }
|
|
|
|
if ( ! ( defined ( $ENV{_NTPostBld} ) ) ) {
|
|
# if the binaries tree is not there we are toast!
|
|
errmsg( "unexpected error - binaries tree not present ...");
|
|
return;
|
|
}
|
|
|
|
my( @IniRequest ) = ( "SymIndexServer" );
|
|
my( $IniReturn ) = &GetIniSetting::GetSettingEx( $ENV{_BuildBranch},
|
|
$Language,
|
|
@IniRequest );
|
|
if ( $IniReturn ) {
|
|
$MainSymSrvShare = $IniReturn;
|
|
} else {
|
|
logmsg( "No symindex server. Exit.");
|
|
return;
|
|
}
|
|
|
|
$LocalSymSrvDir = "$ENV{_NTPostBld}\\symsrv\\$Language";
|
|
if ( ! ( defined( $LocalSymSrvDir ) ) ) {
|
|
errmsg( "Location of local symsrv directory can't be determined");
|
|
return;
|
|
}
|
|
logmsg( "Location of symsrv subdirectory is $LocalSymSrvDir");
|
|
|
|
|
|
if ( ! ( -e $LocalSymSrvDir ) ) {
|
|
errmsg( "Location of symsrv $LocalSymSrvDir doesn't exist");
|
|
return;
|
|
}
|
|
&AddSymbols( $SymLocation, $LocalSymSrvDir, $BuildName, $LogFileName );
|
|
}
|
|
|
|
|
|
sub AddSymbols
|
|
{
|
|
#create loc files
|
|
#push newreq (loc, bin, pri, pub) to MainSymServer-AddReq queue
|
|
#move newreq (bin, pri, pub)to AddWorking
|
|
#if oldreq in AddFinish move oldreq to MainSymServer-DeleteReq
|
|
#remove oldreq from AddFinish
|
|
#Wait for newreq to move to MainSymServer-AddFinish
|
|
#move newreq to AddFinsh
|
|
|
|
# get passed args
|
|
my( $SymbolsLoc, $LocalSymSrvDir, $BuildName, $LogFileName ) = @_;
|
|
|
|
my( $FileType, %FileName, $StillWorkingList );
|
|
my( $Counter, $FinalLocation, $ThisFile, $Return );
|
|
|
|
|
|
logmsg( "Indexing symbols ..." );
|
|
|
|
# create the loc files
|
|
|
|
foreach $FileType ( 'bin', 'pri', 'pub' ) {
|
|
$Return = system( "dir /b $LocalSymSrvDir\\add_requests\\$BuildName.*.$FileType >nul 2>nul" );
|
|
if ( $Return != 0 ) {
|
|
logmsg( "$BuildName\.\*\.$FileType file not found at $LocalSymSrvDir\\add_requests");
|
|
} else {
|
|
$FileName{ $FileType } = `dir /b $LocalSymSrvDir\\add_requests\\$BuildName.*.$FileType`;
|
|
if ( defined( $FileName{ $FileType } ) ) {
|
|
chomp( $FileName{ $FileType } );
|
|
$FinalLocation = $SymbolsLoc;
|
|
if ( $FileType =~ /pri/i ) { $FinalLocation .= "\\symbols.pri"; }
|
|
if ( $FileType =~ /pub/i ) { $FinalLocation .= "\\symbols"; }
|
|
$Return = system( "echo $FinalLocation > $LocalSymSrvDir\\add_requests\\" . $FileName{ $FileType } . "\.loc" );
|
|
# add error checking to make sure the write of the loc file worked!!!?
|
|
} else {
|
|
errmsg( "Undefined dir return! '$FileType' has no value in FileName hash!");
|
|
}
|
|
}
|
|
}
|
|
|
|
# copy the files over to the main symbols server add request
|
|
|
|
if ( -e $MainSymSrvShare ) {
|
|
|
|
# make these into loops over $FileName{ $FileType }
|
|
foreach $FileType ( 'bin', 'pri', 'pub' ) {
|
|
|
|
# now, copy the loc file over to the symbols server (this must be done before the non-loc file per BarbKess)
|
|
|
|
if ( defined ( $FileName{ $FileType } )) {
|
|
$Return = system( "copy $LocalSymSrvDir\\add_requests\\" . $FileName{ $FileType } . "\.loc $MainSymSrvShare\\add_requests >nul 2>nul" );
|
|
if ( $Return != 0 ) { errmsg( "Failed to copy $FileName{ $FileType }\.loc file to $MainSymSrvShare\\add_requests ..."); }
|
|
}
|
|
# next copy the non-loc file to the sym server (must be done second per BarbKess)
|
|
if ( defined ( $FileName{ $FileType } )) {
|
|
$Return = system( "copy $LocalSymSrvDir\\add_requests\\" . $FileName{ $FileType } . " $MainSymSrvShare\\add_requests" );
|
|
if ( $Return != 0 ) { errmsg( "Failed to copy $FileName{ $FileType } to $MainSymSrvShare\\add_requests ..."); }
|
|
}
|
|
}
|
|
|
|
#if any files in add finished then move to main symbol server delete request (but only if add requests is not empty)
|
|
|
|
$Return = system( "dir /b $LocalSymSrvDir\\add_requests\\$BuildName.* >nul 2>nul" );
|
|
|
|
if ( $Return == 0 ) {
|
|
|
|
|
|
# get branch name
|
|
$BranchName = &GetBuildBranch( $BuildName );
|
|
if ( ! ( defined( $BranchName ) ) ) {
|
|
errmsg( "Failed to find branch name...");
|
|
return;
|
|
}
|
|
|
|
#only move to main symbol server delete request if we are not in a fork branch
|
|
# if ( !($BranchName =~ /$OfficialIDXBranch1/i || $BranchName =~ /$OfficialIDXBranch2/i) ) {
|
|
# $Return = system( "copy $LocalSymSrvDir\\add_finished\\\*\.\* $MainSymSrvShare\\del_requests >nul 2>nul" );
|
|
# if ( $Return != 0 ) { errmsg( "Failed to copy $LocalSymSrvDir\\add_finished\\\*\.\*to $MainSymSrvShare\\del_requests\\..."); }
|
|
# $Return = system( "del \/q $LocalSymSrvDir\\add_finished\\\*\.\*" );
|
|
# if ( $Return != 0 ) { logmsg( "Failed to delete $LocalSymSrvDir\\add_finished\\\*\.\*..."); }
|
|
# }
|
|
# move files from add requests to add finished
|
|
|
|
foreach $FileType ( 'bin', 'pri', 'pub' ) {
|
|
if ( defined ( $FileName{ $FileType } )) {
|
|
if ( !($BranchName =~ /$OfficialIDXBranch1/i || $BranchName =~ /$OfficialIDXBranch2/i) ) {
|
|
$Return = system( "copy $LocalSymSrvDir\\add_finished\\\*\.$FileType $MainSymSrvShare\\del_requests >nul 2>nul" );
|
|
$Return = system( "del \/q $LocalSymSrvDir\\add_finished\\\*\.$FileType" );
|
|
}
|
|
|
|
$Return = system( "move $LocalSymSrvDir\\add_requests\\" . $FileName{ $FileType } . " $LocalSymSrvDir\\add_finished\\" );
|
|
if ( $Return != 0 ) { errmsg( "Failed to move $FileName{ $FileType } to $LocalSymSrvDir\\add_finished\\..."); }
|
|
$Return = system( "move $LocalSymSrvDir\\add_requests\\" . $FileName{ $FileType } . "\.loc $LocalSymSrvDir\\add_finished" );
|
|
if ( $Return != 0 ) { errmsg( "Failed to move $FileName{ $FileType }\.loc to $LocalSymSrvDir\\add_finished\\..."); }
|
|
}
|
|
}
|
|
}
|
|
|
|
} else { # matches if ( -e $MainSymSrvShare ) {
|
|
errmsg( "Couldn't see the symbols server $MainSymSrvShare ...");
|
|
}
|
|
}
|
|
|
|
|
|
sub GetRelSvrFromRelRules
|
|
{
|
|
# get passed args
|
|
my( $Language, $BranchName, $ArchType, $LogFileName ) = @_;
|
|
|
|
my( $RazPath, $RelRulesFile, @RelRulesLines, $FoundTag, $Line, $Junk, $ThisLang, $FirstMachine );
|
|
|
|
$RazPath = $ENV{ "RazzleToolPath" };
|
|
$RelRulesFile = "$RazPath\\PostBuildScripts\\RelRules.$BranchName";
|
|
|
|
if ( ! ( -e $RelRulesFile ) ) {
|
|
logmsg( "No relrules file found, assuming not archiving on release server ...");
|
|
return( undef );
|
|
}
|
|
# parse the relrules file
|
|
unless ( open( INFILE, $RelRulesFile ) ) {
|
|
errmsg( "Failed to open $RelRulesFile for reading.");
|
|
return( undef );
|
|
}
|
|
|
|
@RelRulesLines = <INFILE>;
|
|
close( INFILE );
|
|
|
|
$FoundTag = "FALSE";
|
|
foreach $Line ( @RelRulesLines ) {
|
|
chomp( $Line );
|
|
if ( $Line =~ /^\#/ ) { next; } # skip comments
|
|
if ( length( $Line ) == 0 ) { next; } # skip blank lines
|
|
if ( $Line =~ /^(.+?)\:$/ ) { # parse tag lines
|
|
$FoundTag = "FALSE";
|
|
if ( $1 =~ /$ArchType/ ) { $FoundTag = "TRUE"; } # look for "$ArchType": tag, where $ArchType is x86fre...
|
|
} elsif ( $FoundTag eq "TRUE" ) { # parse non-tag lines
|
|
( $Junk, $Junk, $ThisLang, $FirstMachine ) = split( /\, /, $Line );
|
|
if ( $ThisLang !~ /$Language/i ) { next; } # skip other language specs
|
|
return( $FirstMachine ); # return the first release server listed
|
|
}
|
|
}
|
|
|
|
# if we're here, we didn't find ourselves in RelRules.
|
|
logmsg( "No $ArchType release server found, assuming not archiving on release server ...");
|
|
return( undef );
|
|
}
|
|
|
|
|
|
sub GetSymbolsLocation
|
|
{
|
|
# get passed args
|
|
my( $Language, $BuildName, $LogFileName ) = @_;
|
|
|
|
my( $BranchName, $BuildReleaseShare, $SymFarmShare, $Location, $ArchType, $RelSrv, $Return );
|
|
|
|
# get branch name
|
|
$BranchName = &GetBuildBranch( $BuildName );
|
|
if ( ! ( defined( $BranchName ) ) ) {
|
|
errmsg( "Failed to find branch name.");
|
|
return;
|
|
}
|
|
|
|
undef( $Location );
|
|
|
|
# find the symbols farm name for this branch if it exists
|
|
|
|
my( @IniRequest ) = ( "SymFarm" );
|
|
my( $IniReturn ) = &GetIniSetting::GetSettingEx( $ENV{_BuildBranch},
|
|
$Language,
|
|
@IniRequest );
|
|
if ( $IniReturn ) {
|
|
$SymFarmShare = $IniReturn;
|
|
}
|
|
|
|
if ( defined( $SymFarmShare ) ) {
|
|
$Location = "$SymFarmShare\\$Language\\$BuildName";
|
|
logmsg( "Symbols Location for build machine with sym farm is $Location");
|
|
return( $Location );
|
|
# symbols are on the symbols farm
|
|
}
|
|
|
|
|
|
# parse args from the build name
|
|
$ArchType = &GetArchType( $BuildName, $LogFileName );
|
|
if ( ! ( defined( $ArchType ) ) ) {
|
|
errmsg( "Failed to get valid ArchType from Build Name $BuildName.");
|
|
return;
|
|
}
|
|
|
|
# find the release server name for this branch if it exists
|
|
$RelSrv = GetRelSvrFromRelRules($Language, $BranchName, $ArchType, $LogFileName );
|
|
|
|
if ( defined( $RelSrv ) ) {
|
|
$Location = "\\\\$RelSrv\\release\\$Language\\$BuildName";
|
|
logmsg( "Symbols Location for build machine with release server is $Location");
|
|
return( $Location );
|
|
# symbols are on a release server
|
|
}
|
|
|
|
|
|
# symbols location being determined for build machine with no sym farm or release servers");
|
|
|
|
# set up build release share name
|
|
( @IniRequest ) = ( "AlternateReleaseDir" );
|
|
( $IniReturn ) = &GetIniSetting::GetSettingEx( $BranchName,
|
|
$Language,
|
|
@IniRequest );
|
|
if ( $IniReturn ) {
|
|
$BuildReleaseShare = $IniReturn;
|
|
} else {
|
|
$BuildReleaseShare = "release";
|
|
}
|
|
|
|
if ($Language =~ /usa/i ) {
|
|
$Location = "\\\\" . $ENV{ 'COMPUTERNAME' } . "\\$BuildReleaseShare\\$BuildName";
|
|
} else {
|
|
$Location = "\\\\" . $ENV{ 'COMPUTERNAME' } . "\\$BuildReleaseShare\\$Language\\$BuildName";
|
|
}
|
|
|
|
logmsg( "Symbols Location for build machine only is $Location");
|
|
return( $Location );
|
|
# symbols are on a build machine
|
|
|
|
}
|
|
|
|
|
|
sub GetArchType
|
|
{
|
|
# GetArchType
|
|
#
|
|
# GetArchType will return the archtype found in the given BuildName,
|
|
# or undef if an invalid archtype is given.
|
|
|
|
# get passed args
|
|
my( $BuildName, $LogFileName ) = @_;
|
|
my( $Junk, $ArchType );
|
|
|
|
( $Junk, $ArchType, $Junk ) = split( /\./, $BuildName );
|
|
# validate we have a real arch type
|
|
if ( ( $ArchType =~ /ia64fre/i ) ||
|
|
( $ArchType =~ /ia64chk/i ) ||
|
|
( $ArchType =~ /amd64fre/i ) ||
|
|
( $ArchType =~ /amd64chk/i ) ||
|
|
( $ArchType =~ /x86fre/i ) ||
|
|
( $ArchType =~ /x86chk/i ) ) {
|
|
return( $ArchType );
|
|
} else {
|
|
errmsg( "Failed to parse a valid arch type '$ArchType' from" .
|
|
"the given build name '$BuildName' ...");
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
sub GetBuildBranch
|
|
{
|
|
# GetBuildBranch
|
|
#
|
|
# GetBuildBranch will return the branch name contained in the passed BuildName
|
|
|
|
# get passed args
|
|
my( $BuildName ) = @_;
|
|
my( $Junk, $BranchName );
|
|
|
|
( $Junk, $Junk, $BranchName, $Junk ) = split( /\./, $BuildName );
|
|
return( $BranchName );
|
|
}
|
|
|
|
|
|
#
|
|
# GetShareDir
|
|
#
|
|
#
|
|
sub GetShareDir
|
|
{
|
|
my( $ShareName, $LogFile ) = @_;
|
|
my( @NetShareReturn, $Return, $NetShareLine );
|
|
my( $FieldName, $FieldValue );
|
|
|
|
$Return = system( "net share $ShareName >nul 2>nul" );
|
|
if ( $Return != 0 ) {
|
|
errmsg( "No $ShareName share found.");
|
|
return;
|
|
}
|
|
|
|
@NetShareReturn = `net share $ShareName`;
|
|
# note that i'm using the second line of the net share return
|
|
# to get this data. if this changes, it'll break.
|
|
$NetShareLine = $NetShareReturn[1];
|
|
# logmsg( "NetShareLine is $NetShareLine");
|
|
chomp( $NetShareLine );
|
|
( $FieldName, $FieldValue ) = split( /\s+/, $NetShareLine );
|
|
if ( $FieldName ne "Path" ) {
|
|
errmsg( "Second line of net share does not start with " .
|
|
"\'Path\' -- possibly another language?");
|
|
}
|
|
# logmsg( "FieldValue for $ShareName share path is $FieldValue");
|
|
return( $FieldValue );
|
|
}
|
|
|
|
|
|
sub ValidateParams {
|
|
#<Add your code for validating the parameters here>
|
|
}
|
|
|
|
|
|
# <Add your usage here>
|
|
sub Usage {
|
|
print <<USAGE;
|
|
Purpose of program
|
|
Usage: $0 [-l lang]
|
|
-l Language
|
|
-? Displays usage
|
|
Example:
|
|
$0 -l jpn
|
|
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;
|
|
}
|
|
}
|
|
|
|
# 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};
|
|
|
|
# Validate the option given as parameter.
|
|
&ValidateParams;
|
|
|
|
# Step 4: Call the main function
|
|
&symindex::Main();
|
|
|
|
# End local environment extensions.
|
|
&LocalEnvEx::localenvex('end');
|
|
}
|
|
|
|
# -------------------------------------------------------------------------------------------
|
|
# Script: template_script.pm
|
|
# Purpose: Template perl perl script for the NT postbuild environment
|
|
# SD Location: %sdxroot%\tools\postbuildscripts
|
|
#
|
|
# (1) Code section description:
|
|
# CmdMain - Developer code section. This is where your work gets done.
|
|
# <Implement your subs here> - Developer subs code section. This is where you write subs.
|
|
#
|
|
# (2) Reserved Variables -
|
|
# $ENV{HELP} - Flag that specifies usage.
|
|
# $ENV{lang} - The specified language. Defaults to USA.
|
|
# $ENV{logfile} - The path and filename of the logs file.
|
|
# $ENV{logfile_bak} - The path and filename of the logfile.
|
|
# $ENV{errfile} - The path and filename of the error file.
|
|
# $ENV{tmpfile} - The path and filename of the temp file.
|
|
# $ENV{errors} - The scripts errorlevel.
|
|
# $ENV{script_name} - The script name.
|
|
# $ENV{_NTPostBld} - Abstracts the language from the files path that
|
|
# postbuild operates on.
|
|
#
|
|
# (3) Reserved Subs -
|
|
# Usage - Use this sub to discribe the scripts usage.
|
|
# ValidateParams - Use this sub to verify the parameters passed to the script.
|
|
#
|
|
# (4) Call other executables or command scripts by using:
|
|
# system "foo.exe";
|
|
# Note that the executable/script you're calling with system must return a
|
|
# non-zero value on errors to make the error checking mechanism work.
|
|
#
|
|
# Example
|
|
# if (system("perl.exe foo.pl -l $lang")){
|
|
# errmsg("perl.exe foo.pl -l $lang failed.");
|
|
# # If you need to terminate function's execution on this error
|
|
# goto End;
|
|
# }
|
|
#
|
|
# (5) Log non-error information by using:
|
|
# logmsg "<log message>";
|
|
# and log error information by using:
|
|
# errmsg "<error message>";
|
|
#
|
|
# (6) Have your changes reviewed by a member of the US build team (ntbusa) and
|
|
# by a member of the international build team (ntbintl).
|
|
#
|
|
# -------------------------------------------------------------------------------------------
|
|
|
|
=head1 NAME
|
|
B<mypackage> - What this package for
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
<An code example how to use>
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
<Use above example to describe this package>
|
|
|
|
=head1 INSTANCES
|
|
|
|
=head2 <myinstances>
|
|
|
|
<Description of myinstances>
|
|
|
|
=head1 METHODS
|
|
|
|
=head2 <mymathods>
|
|
|
|
<Description of mymathods>
|
|
|
|
=head1 SEE ALSO
|
|
|
|
<Some related package or None>
|
|
|
|
=head1 AUTHOR
|
|
<Your Name <your e-mail address>>
|
|
|
|
=cut
|
|
1;
|