--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bldsystemtools/commonbldutils/PreBldChecks.pl Tue Feb 02 01:39:43 2010 +0200
@@ -0,0 +1,322 @@
+# Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# This script was originally just a test harness for PreBldChecks.pm
+# Subsequently it has been included in the MCL build
+#
+#
+
+use strict;
+use Getopt::Long;
+use File::Copy;
+use Net::SMTP;
+use Sys::Hostname;
+use FindBin;
+use lib "$FindBin::Bin";
+use PreBldChecks;
+
+my $gSMTPServer = 'smtp.nokia.com';
+my $gNotificationSender = Sys::Hostname::hostname();
+if (defined $ENV{'USERNAME'}) { $gNotificationSender .= ".$ENV{'USERNAME'}"; }
+my $gXML2EnvVar = 'PreBldChecksXML2';
+
+# Notes on License Files used by CodeWarrior (CW) and/or ARM
+# The official IS-supported "RVCT2.0.1 to RVCT2.1" upgrade mechanism installs C:\APPS\ARM\LICENSE.DAT.
+# but leaves ARMLMD_LICENSE_FILE pointing to License Server(s)
+# The immediate fix was to delete the ARMLMD_LICENSE_FILE environment variable and edit
+# LM_LICENSE_FILE to read C:\apps\Metrowerks\OEM2.8\license.dat;C:\apps\arm\license.dat.
+
+# Note on CodeWarrior (CW) Version 3.0 (January 2005)
+# NOKIA now own CodeWarrior. Thus we have a further Environment Variable, named NOKIA_LICENSE_FILE
+
+# Note on CodeWarrior (CW) Version 3.1 (November 2006)
+# A licence is no longer required for the command line utilities, only for the IDE
+
+# Capture the name of this script for Help display etc.
+$0 =~ m/([^\\]+?)$/;
+my $gThisFile = $1;
+
+# Process the commandline
+my ($gXMLfile1,$gLogFile,$gNotificationAddress) = ProcessCommandLine();
+# If XML file specified, get environment variables from that file into %$gXMLEnvRef1.
+# Otherwise assume that all the required variables are already in the predefined hash %ENV
+if (defined $gXMLfile1)
+{
+ my $gXMLEnvRef1; # Reference to hash containing environment data read from the XML file
+ $gXMLEnvRef1 = PreBldChecks::XMLEnvironment($gXMLfile1);
+ PreBldChecks::MergeEnvironment($gXMLEnvRef1);
+}
+
+# Now refer to the build-specific XML file for further environment variables
+# In an MCL build, this file has probably not been sync'ed yet. So get it from Perforce into a temporary directory
+my $gP4Location = $ENV{CurrentCodeline};
+$gP4Location =~ s#/$##; # Remove trailing slash, if any
+if ((uc $ENV{'Platform'}) eq 'SF')
+{
+ $gP4Location = "$gP4Location/os/deviceplatformrelease/symbianosbld/cedarutils/$ENV{BuildBaseName}.xml"; #For Symbian MCL SF and TB91SF
+}
+else
+{
+ $gP4Location = "$gP4Location/$ENV{Platform}/generic/utils/$ENV{BuildBaseName}.xml"; #For Symbian OS v9.5 and earlier
+}
+
+# The following use of an environment variable to override $gP4Location is provided to make it
+# possible to test a product-specific XML file from a development branch. This functionality
+# can be used in a manual test build or in stand-alone tests.
+# NB: Remember that you are specifying a location in Perforce, not a Windows directory!
+if (defined $ENV{$gXML2EnvVar})
+{
+ $gP4Location = $ENV{$gXML2EnvVar};
+}
+
+my $gXMLfile2 = "$ENV{'TEMP'}\\$ENV{BuildBaseName}.xml";
+
+my $gCmd = "P4 print -q -o $gXMLfile2 $gP4Location 2>&1";
+my $gResponse = `$gCmd`; # It seems that response is empty when P4 succeeds. On error, it will contain details.
+
+if (-e $gXMLfile2)
+{
+ my $gXMLEnvRef2;
+ $gXMLEnvRef2 = PreBldChecks::XMLEnvironment($gXMLfile2);
+ chmod (0666, $gXMLfile2); # Make file R/W
+ unlink ($gXMLfile2);
+ PreBldChecks::MergeEnvironment($gXMLEnvRef2);
+}
+else
+{
+ $gP4Location = undef; # See reporting text below
+}
+
+# Having acquired all available environment variables, set up text for eventual message.
+my $gBuildNumTxt = (defined $ENV{'BuildNumber'})? " - Build: $ENV{'BuildNumber'}": '';
+
+# Run checks.
+my($ErrorsRef,$WarningsRef) = PreBldChecks::AllChecks(\%ENV);
+# Log checks and/or print to screen
+my $errorCount = scalar @$ErrorsRef;
+my $warningCount = scalar @$WarningsRef;
+
+open BUILDENVOUTPUT, ">$gLogFile";
+
+print "\n\n";
+PrintLine('Results from pre-build checks:');
+PrintLine('Computer: ' . Sys::Hostname::hostname() . $gBuildNumTxt);
+PrintLine('XML Files used:');
+if (defined $gXMLfile1) { PrintLine(" $gXMLfile1"); }
+if (defined $gP4Location) { PrintLine(" $gP4Location"); } # Report Perforce location ($gXMLfile2 points to temporary file only
+
+my @gEMailMsg = ();
+my $gErrMsg = '';
+
+if ($errorCount)
+{
+ $gErrMsg = 'Errors must be fixed before restarting build!';
+ PrintLine("$errorCount Error(s):");
+ push @gEMailMsg, "$errorCount Error(s):\n";
+ for my $text (@$ErrorsRef)
+ {
+ PrintLine(" $text");
+ push @gEMailMsg, "\t$text\n";
+ }
+}
+else
+{
+ PrintLine('No error.');
+}
+
+if ($warningCount)
+{
+ PrintLine("$warningCount Warning(s):");
+ push @gEMailMsg, "$warningCount Warning(s):\n";
+ for my $text (@$WarningsRef)
+ {
+ PrintLine(" $text");
+ push @gEMailMsg, "\t$text\n";
+ }
+}
+else
+{
+ PrintLine('No warning.');
+}
+
+if($gNotificationAddress and scalar @gEMailMsg)
+{
+ my $iHostName = Sys::Hostname::hostname; # Depends on "use Sys::Hostname;"
+ my $iEmailSubject = "ERROR: PreBldCheck Errors/Warnings!$gBuildNumTxt";
+ my $iMsgIntro = "PreBldCheck Reports:$gBuildNumTxt"; # Message introduction (becomes first line of email body)
+ $iMsgIntro .= "\nComputer $iHostName - Log file: $gLogFile";
+ unshift @gEMailMsg, "$iMsgIntro:\n\n";
+ push @gEMailMsg, "\n$gErrMsg\n---------------------------------------------\n";
+ unless (SendEmail($iEmailSubject,@gEMailMsg)) { ++$errorCount; }
+}
+
+if ($errorCount)
+{
+ print "\n";
+ # IMPORTANT: In the following text, "ERROR:" is a keyword for ScanLog to identify
+ PrintLine("ERROR: $gErrMsg\n");
+}
+
+close BUILDENVOUTPUT;
+print "\n";
+
+exit($errorCount); # End of main script
+
+# PrintLine
+#
+# Inputs
+# Text to be written. (No CRLF required)
+#
+# Outputs
+# Text to screen and to log file.
+#
+# Description
+# This subroutine takes a line of text, adds CRLF and writes it to both screen and to the logfile.
+
+sub PrintLine
+{
+ my $iLine = shift;
+ print "$iLine\n";
+ print BUILDENVOUTPUT "$iLine\n";
+}
+
+# SendEmail
+#
+# Input: Subject, Message (array of lines)
+#
+# Returns: TRUE on success
+#
+sub SendEmail
+{
+ my ($iSubject, @iBody) = @_;
+
+ my (@iMessage);
+ my $iRetVal = 0;
+
+ push @iMessage,"From: $gNotificationSender\n";
+ push @iMessage,"To: $gNotificationAddress\n";
+ push @iMessage,"Subject: $iSubject\n";
+ push @iMessage,"\n";
+ push @iMessage,@iBody;
+
+ # Create an SMTP Client object that connects to the Symbian SMTP server
+ # Client tells the server what the mail domain is.
+ # Debug - just enables debugging information.
+ my $iSMTP = Net::SMTP->new($gSMTPServer, Hello => $ENV{'COMPUTERNAME'}, Debug => 0);
+
+ if($iSMTP)
+ {
+ $iSMTP->mail();
+ $iSMTP->to($gNotificationAddress);
+ $iRetVal = $iSMTP->data(@iMessage);
+ $iSMTP->quit;
+ }
+ unless ($iRetVal)
+ { # Report email failure to log and to screen (NB: "WARNING:" is a keyword for ScanLog to identify)
+ PrintLine ("WARNING: Failed to send email notification!\nSubject: $iSubject\nMessage:\n");
+ print join ('',@iBody), "\n"; # Send email body to screen only. (Will be logged by BuildServer/Client)
+ }
+ return $iRetVal;
+}
+
+# ProcessCommandLine
+#
+# Inputs
+#
+# Returns
+# $iXMLfile filename of XML file from, which environment data are to be read.
+# $iLogFile filename to write log to.
+#
+# Description
+# This function processes the commandline
+
+sub ProcessCommandLine {
+ my ($iHelp, $iXMLfile,$iLogfile,$iEMailAddress);
+ GetOptions('h' => \$iHelp, 'x=s' => \$iXMLfile, 'l=s' => \$iLogfile, 'e=s' => \$iEMailAddress);
+
+ if ($iHelp) { Usage(); }
+
+ if (!defined $iLogfile) { Usage("Logfile not specified!"); }
+
+ &backupFile($iLogfile) if (-e $iLogfile);
+
+ return($iXMLfile, $iLogfile, $iEMailAddress);
+}
+
+# backupFile
+#
+# Inputs
+# $iFile - filename to backup
+#
+# Outputs
+#
+# Description
+# This function renames an existing file with the .bak extension
+sub backupFile
+{
+ my ($iFile) = shift;
+ my ($iBak) = $iFile;
+ $iBak =~ s/(\.\w*?$)/\.bak$1/; # Convert, e.g., "PreBldChecks.log" to "PreBldChecks.bak.log"
+ if ((-e $iFile) and ($iFile ne 'NUL'))
+ { # (NB: "WARNING:" is a keyword for ScanLog to identify)
+ print "WARNING: $iFile already exists!\n\t Creating backup of original with new name of $iBak\n";
+ move($iFile,$iBak) or die "WARNING: Could not backup $iFile to $iBak because of: $!\n";
+ }
+}
+
+# Usage
+#
+# Output Usage Information and exit whole script.
+#
+
+sub Usage {
+ my $iMsg = shift;
+
+ if (defined $iMsg) { print "\nERROR: $iMsg\n"; }
+
+ print <<USAGE_EOF;
+
+ $gThisFile:
+ Carries out various checks on the build environment
+ including disk free space, the state of licensing
+ for CodeWarrion and for ARM RVCT.
+ Writes errors and warnings to the specified log file.
+ Emails notification of errors (but not warnings) to
+ the specified email address.
+ On exit, ERRORLEVEL is set to the Error Count.
+
+ Usage: $gThisFile parameters [options]
+
+ Parameters:
+ -l logfile (output)
+
+ Options:
+ -x XML file (input)
+ -e EMail address for warnings (internet format)
+ -h Help
+
+ If no XML file is specified, script will assume that all
+ necessary variables are already in the environment (\%ENV).
+ In any case, script will attempt to locate the relevant
+ build-specific XML file in Perforce and will read any
+ environment variables found in it.
+
+ Strictly for test purposes, the calculated location of the
+ secondary (product-specific) XML file may over-ridden by
+ setting the Environment Variable $gXML2EnvVar
+
+USAGE_EOF
+
+ exit 1;
+}
+