441 lines
11 KiB
Perl
441 lines
11 KiB
Perl
|
#---------------------------------------------------------------------
|
||
|
package LocalEnvEx;
|
||
|
#
|
||
|
# (c) 2000 Microsoft Corporation. All rights reserved.
|
||
|
#
|
||
|
# Version: 0.01 (4/7/2000) : Inital concept
|
||
|
#---------------------------------------------------------------------
|
||
|
$class='LocalEnvEx';
|
||
|
$VERSION = '0.01';
|
||
|
|
||
|
require 5.003;
|
||
|
|
||
|
# Use section
|
||
|
use lib $ENV{RAZZLETOOLPATH};
|
||
|
use GetParams;
|
||
|
use Logmsg;
|
||
|
use cklang;
|
||
|
|
||
|
use strict;
|
||
|
no strict 'vars';
|
||
|
|
||
|
# Require section
|
||
|
require Exporter;
|
||
|
|
||
|
# IsA (Inheritance) define section
|
||
|
@ISA = qw(Exporter);
|
||
|
|
||
|
#
|
||
|
#Public Functions:
|
||
|
#
|
||
|
|
||
|
# Constructor function
|
||
|
sub new {
|
||
|
my ($class)=shift;
|
||
|
my $self = {@_};
|
||
|
$class = ref($class) || $class;
|
||
|
|
||
|
# The keys of 'self' are
|
||
|
#
|
||
|
# -i <Initialize environment> : See usage
|
||
|
# -e <End environment> : See usage
|
||
|
|
||
|
# Initial Binding section
|
||
|
|
||
|
$self->{-VariableSet}=sub {&PerlVarSet($self,@_)} if (!defined $self->{-VariableSet});
|
||
|
$self->{-Initialize}=sub {Initialize($self,@_)} if (!defined $self->{-Initialize});
|
||
|
$self->{-End}=sub {End($self,@_)} if (!defined $self->{-End});
|
||
|
$self->{-Error}=sub {Error($self, @_)} if (!defined $self->{-Error});
|
||
|
|
||
|
@EXPORT = qw();
|
||
|
|
||
|
#Import razzle variables
|
||
|
$self->{_NTPostBld} = $ENV{_NTPostBld};
|
||
|
$self->{temp} = $ENV{temp};
|
||
|
$self->{ntdebug} = $ENV{ntdebug};
|
||
|
$self->{_BuildArch} = $ENV{_BuildArch};
|
||
|
|
||
|
#Import script specific variables
|
||
|
$self->{Script_Name} = $ENV{script_name};
|
||
|
$self->{lang} = $ENV{lang};
|
||
|
|
||
|
#Import local environment extensions
|
||
|
$self->{logfile} = $ENV{logfile};
|
||
|
$self->{logfile_bak} = $ENV{logfile_bak};
|
||
|
$self->{errfile} = $ENV{errfile};
|
||
|
$self->{errfile_bak} = $ENV{errfile_bak};
|
||
|
$self->{tmpfile} = $ENV{tmpfile};
|
||
|
$self->{temp_bak} = $ENV{temp_bak};
|
||
|
$self->{_NTPostBld_Bak} = $ENV{_NTPostBld_Bak};
|
||
|
$self->{errors} = $ENV{errors};
|
||
|
|
||
|
return bless ($self, $class);
|
||
|
}
|
||
|
|
||
|
#Initalization object function
|
||
|
sub Initialize {
|
||
|
my $self=shift;
|
||
|
|
||
|
$self->{-VariableSet} = sub {PerlVarSet($self, @_)} if (!defined $self->{-VariableSet});
|
||
|
|
||
|
#Step 0: Set defaults for global variables
|
||
|
if (!defined $self->{errors}) {
|
||
|
$self->{errors} = 0;
|
||
|
push @varlist, "errors";
|
||
|
}
|
||
|
|
||
|
#Step 1: Verify the language and build environment
|
||
|
if (!defined $self->{lang}) {
|
||
|
$self->{lang} = "usa";
|
||
|
push @varlist, "lang";
|
||
|
}
|
||
|
|
||
|
if ( !&cklang::CkLang($self->{lang})) {
|
||
|
print "echo Language $self->{lang} is invalid.$!";
|
||
|
die "\n";
|
||
|
}
|
||
|
|
||
|
#Step 2: Redefine temp/tmp with a language subdir to abstract language
|
||
|
$path = "$self->{temp}";
|
||
|
$path_bak = "$self->{temp_bak}";
|
||
|
if (!defined $self->{temp_bak}) {
|
||
|
$self->{temp_bak} = $self->{temp};
|
||
|
$path_bak = "$self->{temp_bak}";
|
||
|
push @varlist, "temp_bak";
|
||
|
}
|
||
|
$self->{temp} = "$path_bak"."\\"."$self->{lang}";
|
||
|
$self->{tmp} = "$path_bak"."\\"."$self->{lang}";
|
||
|
push @varlist, "temp";
|
||
|
push @varlist, "tmp";
|
||
|
|
||
|
# Step 3: Define the logfile to be used by the logging scripts
|
||
|
# Use the calling scripts logfile if it is defined
|
||
|
if (!defined $self->{logfile}) {
|
||
|
$path = "$self->{temp}";
|
||
|
mkdir $path, -d;
|
||
|
my $script_name = $self->{Script_Name};
|
||
|
if ($self->{ntdebug} =~ /^ntsd$/i) {
|
||
|
$ntdebug = "chk";
|
||
|
} else {
|
||
|
$ntdebug = "fre";
|
||
|
}
|
||
|
$self->{logfile} = "$path\\$script_name.$self->{_BuildArch}.$ntdebug.$self->{lang}.log";
|
||
|
push @varlist, "logfile";
|
||
|
# Delete the old logfile if it exists and create a new one
|
||
|
if (-e $self->{logfile}) {
|
||
|
unlink $self->{logfile};
|
||
|
open(LOGFILE, "> $self->{logfile}") or die "Can not open $self->{logfile}: $!";
|
||
|
close (LOGFILE);
|
||
|
}
|
||
|
} else {
|
||
|
# Delete create a new logfile if it does not exist
|
||
|
unless (-e $self->{logfile}) {
|
||
|
open(LOGFILE, "> $self->{logfile}") or die "Can not open $self->{logfile}: $!";
|
||
|
close (LOGFILE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#Step 4: Define the errfile to be used by the logging scripts
|
||
|
if (!defined $self->{errfile}) {
|
||
|
$path = "$self->{temp}";
|
||
|
mkdir $path, -d;
|
||
|
system "md $path 2>Nul";
|
||
|
my $script_name = $self->{Script_Name};
|
||
|
if ($self->{ntdebug} =~ /^ntsd$/i) {
|
||
|
$ntdebug = "chk";
|
||
|
} else {
|
||
|
$ntdebug = "fre";
|
||
|
}
|
||
|
$self->{errfile} = "$path\\$script_name.$self->{_BuildArch}.$ntdebug.$self->{lang}.err";
|
||
|
push @varlist, "errfile";
|
||
|
# Delete the old errfile if it exists and create a new one
|
||
|
if (-e $self->{errfile}) {
|
||
|
unlink $self->{errfile};
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#Step 5: Define the tmpfile to be used by the logging scripts
|
||
|
# Always create a local tmpfile
|
||
|
$path = "$self->{temp}";
|
||
|
mkdir $path, -d;
|
||
|
system "md $path 2>Nul";
|
||
|
my $script_name = $self->{Script_Name};
|
||
|
if ($self->{ntdebug} =~ /^ntsd$/i) {
|
||
|
$ntdebug = "chk";
|
||
|
} else {
|
||
|
$ntdebug = "fre";
|
||
|
}
|
||
|
$self->{tmpfile} = "$path\\$script_name.$self->{_BuildArch}.$ntdebug.$self->{lang}.tmp";
|
||
|
push @varlist, "tmpfile";
|
||
|
# Delete the old tmpfile if it exists and create a new one
|
||
|
if (-e $self->{tmpfile}) {
|
||
|
unlink $self->{tmpfile};
|
||
|
open(TMPFILE, "> $self->{tmpfile}") or die "Can not open $self->{tmpfile}: $!";
|
||
|
close (TMPFILE);
|
||
|
}
|
||
|
|
||
|
#Step x: Define the errtmpfile to be used by the logging scripts
|
||
|
# Always create a local errtmpfile
|
||
|
$path = "$self->{temp}";
|
||
|
mkdir $path, -d;
|
||
|
system "md $path 2>Nul";
|
||
|
my $script_name = $self->{Script_Name};
|
||
|
if ($self->{ntdebug} =~ /^ntsd$/i) {
|
||
|
$ntdebug = "chk";
|
||
|
} else {
|
||
|
$ntdebug = "fre";
|
||
|
}
|
||
|
$self->{errtmpfile} = "$path\\$script_name.$self->{_BuildArch}.$ntdebug.$self->{lang}.err.tmp";
|
||
|
# Delete the old errtmpfile if it exists and create a new one
|
||
|
if (-e $self->{errtmpfile}) {
|
||
|
unlink $self->{errtmpfile};
|
||
|
}
|
||
|
|
||
|
#Step 6: Define _NTPostBld which points to the _ntpostbld tree
|
||
|
#to be worked on by the calling script.
|
||
|
|
||
|
$path = "$self->{_NTPostBld}";
|
||
|
$path_bak = "$self->{_NTPostBld_Bak}";
|
||
|
if (!defined $self->{_NTPostBld_Bak}) {
|
||
|
$self->{_NTPostBld_Bak} = $self->{_NTPostBld};
|
||
|
$path_bak = "$self->{_NTPostBld_Bak}";
|
||
|
push @varlist, "_NTPostBld_Bak";
|
||
|
}
|
||
|
if ($self->{lang} =~ /^usa$/i) {
|
||
|
$self->{_NTPostBld} = "$path_bak";
|
||
|
} else {
|
||
|
$self->{_NTPostBld} = "$path_bak"."\\"."$self->{lang}";
|
||
|
}
|
||
|
push @varlist, "_NTPostBld";
|
||
|
|
||
|
# #Step 7: Set build_data to point to postbuild's critical data files
|
||
|
# $path = "$self->{_NTPostBld}\\build_data";
|
||
|
# mkdir $path, -d;
|
||
|
# system "md $path 2>Nul";
|
||
|
# if ($self->{lang} =~ /^usa$/i) {
|
||
|
# $self->{build_data} = "$path";
|
||
|
# } else {
|
||
|
# $self->{build_data} = "$path";
|
||
|
# }
|
||
|
# push @varlist, "build_data";
|
||
|
|
||
|
|
||
|
#Step 8: Use tmpfile as log file during the scripts execution
|
||
|
$self->{logfile_bak} = $self->{logfile};
|
||
|
$self->{logfile} = $self->{tmpfile};
|
||
|
push @varlist, "logfile";
|
||
|
push @varlist, "logfile_bak";
|
||
|
|
||
|
#Step x: Use tmperrfile as errfile during the scripts execution
|
||
|
$self->{errfile_bak} = $self->{errfile};
|
||
|
$self->{errfile} = $self->{errtmpfile};
|
||
|
push @varlist, "errfile";
|
||
|
push @varlist, "errfile_bak";
|
||
|
|
||
|
#Step 9: Set the environment variables
|
||
|
foreach $envvar (@varlist) {
|
||
|
$name = $envvar;
|
||
|
$value = $self->{$envvar};
|
||
|
&{$self->{-VariableSet}}($name, $value);
|
||
|
}
|
||
|
|
||
|
#Step 10: Mark the beginning of the scripts execution
|
||
|
$ENV{logfile}=$self->{logfile};
|
||
|
open(LOGFILE, "> $self->{logfile}") or die "Can not open $self->{logfile}: $!";
|
||
|
close (LOGFILE);
|
||
|
timemsg ("****** START scripts execution. *****");
|
||
|
}
|
||
|
|
||
|
#End object function
|
||
|
sub End {
|
||
|
my $self=shift;
|
||
|
|
||
|
#Step 1: Mark the end of the scripts execution
|
||
|
timemsg ("END scripts execution with:($self->{errors} errors).");
|
||
|
|
||
|
#Step 2: Reset the logfile
|
||
|
$self->{logfile} = "$self->{logfile_bak}";
|
||
|
$self->{logfile_bak} = "";
|
||
|
push @varlist, "logfile";
|
||
|
logmsg ("Script logged in:\n$self->{logfile}");
|
||
|
|
||
|
#Step x: Append and reset the errfile
|
||
|
#Step a: Append the errfile_bak to the errfile
|
||
|
open(ERRFILE_BAK, ">>$self->{errfile_bak}");
|
||
|
open(ERRFILE, "<$self->{errfile}");
|
||
|
foreach $tmpline (<ERRFILE>) {
|
||
|
print (ERRFILE_BAK "$tmpline");
|
||
|
}
|
||
|
close(ERRFILE);
|
||
|
close(ERRFILE_BAK);
|
||
|
#Delete the temp errfile
|
||
|
unlink $self->{errfile};
|
||
|
|
||
|
#Step b: Reset the errfile
|
||
|
$self->{errfile} = "$self->{errfile_bak}";
|
||
|
$self->{errfile_bak} = "";
|
||
|
push @varlist, "errfile";
|
||
|
|
||
|
#Step c: Remove errorfile if it is zero length
|
||
|
if (-e $self->{errfile}) {
|
||
|
if (-z $self->{errfile}) {
|
||
|
unlink $self->{errfile};
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#Step 3: Append the tmpfile to the logfile
|
||
|
open(LOGFILE, ">>$self->{logfile}");
|
||
|
open(TMPFILE, "<$self->{tmpfile}");
|
||
|
foreach $tmpline (<TMPFILE>) {
|
||
|
print (LOGFILE "$tmpline");
|
||
|
}
|
||
|
close(LOGFILE);
|
||
|
close(TMPFILE);
|
||
|
|
||
|
# Step 4: Check for errors
|
||
|
if (-e $self->{errfile}) {
|
||
|
print "*** $self->{Script_Name} encountered errors, please see errfile: ***\n";
|
||
|
print "$self->{errfile}\n";
|
||
|
}
|
||
|
|
||
|
#Step 5: Clean up environment
|
||
|
$self->{logfile_bak} = "";
|
||
|
push @varlist, "logfile_bak";
|
||
|
|
||
|
$self->{errfile_bak} = "";
|
||
|
push @varlist, "errfile_bak";
|
||
|
|
||
|
if (-e $self->{tmpfile}) {
|
||
|
unlink $self->{tmpfile};
|
||
|
}
|
||
|
$self->{tmpfile} = "";
|
||
|
push @varlist, "tmpfile";
|
||
|
|
||
|
$path = "$self->{_NTPostBld}";
|
||
|
if ($self->{lang} =~ /^usa$/i) {
|
||
|
$self->{_NTPostBld} = "$path";
|
||
|
} else {
|
||
|
$path =~ s/^\\$self->{lang}$//i;
|
||
|
$self->{_NTPostBld} = "$path";
|
||
|
}
|
||
|
push @varlist, "_NTPostBld";
|
||
|
|
||
|
#Step 6: Set the environment variables
|
||
|
foreach $envvar (@varlist) {
|
||
|
$name = $envvar;
|
||
|
$value = $self->{$envvar};
|
||
|
&{$self->{-VariableSet}}($name, $value);
|
||
|
}
|
||
|
|
||
|
# Step 7: Exit with the correct error code
|
||
|
if ($self->{errors} > 0) {
|
||
|
exit 1;
|
||
|
} else {
|
||
|
exit 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#
|
||
|
#Private functions
|
||
|
#
|
||
|
|
||
|
sub localenvex {
|
||
|
my ($Option)=(@_);
|
||
|
if ($Option=~/^initialize$/i) {
|
||
|
my $LocalEnvEx=LocalEnvEx->new;
|
||
|
&{$LocalEnvEx->{-Initialize}};
|
||
|
}
|
||
|
if ($Option=~/^end$/i) {
|
||
|
my $LocalEnvEx=LocalEnvEx->new;
|
||
|
&{$LocalEnvEx->{-End}};
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
sub PerlVarSet {
|
||
|
my ($self, $name, $value)=@_;
|
||
|
$ENV{$name}=$value;
|
||
|
}
|
||
|
|
||
|
sub CmdVarSet {
|
||
|
my($self, $name, $value)=@_;
|
||
|
print "set $name=$value\n";
|
||
|
}
|
||
|
|
||
|
sub Error {
|
||
|
my $self=shift;
|
||
|
}
|
||
|
|
||
|
sub Usage {
|
||
|
print <<USAGE;
|
||
|
$0 - V Program purpose
|
||
|
==================================================
|
||
|
Syntax: $0 parameters
|
||
|
==================================================
|
||
|
Parameters:
|
||
|
|
||
|
==================================================
|
||
|
Example:
|
||
|
|
||
|
1. #<what you want to do>
|
||
|
=> #<real command>
|
||
|
|
||
|
USAGE
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
#
|
||
|
# CMD handler
|
||
|
#
|
||
|
if ($0=~/${class}.pm$/i) {
|
||
|
|
||
|
#Step 1: Parse the command line
|
||
|
($initflag, $endflag)=();
|
||
|
@syntax=(
|
||
|
-o => 'ie',
|
||
|
-p => 'initflag endflag'
|
||
|
);
|
||
|
my $getparams=GetParams->new;
|
||
|
# Parse the value
|
||
|
&{$getparams->{-Process}}(
|
||
|
@syntax,
|
||
|
@ARGV
|
||
|
);
|
||
|
|
||
|
#Step 2: Set local environment extentions for the specified stage.
|
||
|
# Create the object and call the correct method.
|
||
|
if (defined $initflag) {
|
||
|
my $LocalEnvEx=LocalEnvEx->new(-VariableSet => sub {&CmdVarSet($self,@_)});
|
||
|
&{$LocalEnvEx->{-Initialize}}(@ARGV);
|
||
|
}
|
||
|
if (defined $endflag) {
|
||
|
my $LocalEnvEx=LocalEnvEx->new(-VariableSet => sub {&CmdVarSet($self,@_)});
|
||
|
&{$LocalEnvEx->{-End}}(@ARGV);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
=head1 NAME
|
||
|
B<mypackage> - What this package for
|
||
|
|
||
|
=head1 SYNOPSIS
|
||
|
|
||
|
=head1 DESCRIPTION
|
||
|
|
||
|
|
||
|
=head1 INSTANCES
|
||
|
|
||
|
=head2
|
||
|
|
||
|
|
||
|
=head1 METHODS
|
||
|
|
||
|
=head2
|
||
|
|
||
|
|
||
|
=head1 SEE ALSO
|
||
|
|
||
|
|
||
|
=head1 AUTHOR
|
||
|
|
||
|
=cut
|
||
|
1;
|