diff -r a9d4531388d0 -r d90029decf65 bldsystemtools/commonbldutils/PreBldChecks.pl --- a/bldsystemtools/commonbldutils/PreBldChecks.pl Wed Mar 31 23:20:42 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,322 +0,0 @@ -# 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 <