X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;ds=sidebyside;f=utils%2FNewNightlyTest.pl;h=a8cf8de86814e4edf3d2b1cb049e74fd869e3dcb;hb=3ebd44d20ffd1a885a8ffd75541cfc2b4bc53e43;hp=aa24bc8ed914634cd51fe05c47305008622eac2e;hpb=d7210f9dba249f1cf21ee65f317e02f502e81f54;p=oota-llvm.git
diff --git a/utils/NewNightlyTest.pl b/utils/NewNightlyTest.pl
index aa24bc8ed91..a8cf8de8681 100755
--- a/utils/NewNightlyTest.pl
+++ b/utils/NewNightlyTest.pl
@@ -1,6 +1,7 @@
#!/usr/bin/perl
use POSIX qw(strftime);
use File::Copy;
+use File::Find;
use Socket;
#
@@ -8,41 +9,82 @@ use Socket;
#
# Synopsis: Perform a series of tests which are designed to be run nightly.
# This is used to keep track of the status of the LLVM tree, tracking
-# regressions and performance changes. Submits this information
-# to llvm.org where it is placed into the nightlytestresults database.
-#
-# Modified heavily by Patrick Jenkins, July 2006
+# regressions and performance changes. Submits this information
+# to llvm.org where it is placed into the nightlytestresults database.
#
# Syntax: NightlyTest.pl [OPTIONS] [CVSROOT BUILDDIR WEBDIR]
# where
# OPTIONS may include one or more of the following:
+#
+# MAIN OPTIONS:
+# -config LLVMPATH If specified, use an existing LLVM build and only run and
+# report the test information. The LLVMCONFIG argument should
+# be the path to the llvm-config executable in the LLVM build.
+# This should be the first argument if given. NOT YET
+# IMPLEMENTED.
+# -nickname NAME The NAME argument specifieds the nickname this script
+# will submit to the nightlytest results repository.
+# -submit-server Specifies a server to submit the test results too. If this
+# option is not specified it defaults to
+# llvm.org. This is basically just the address of the
+# webserver
+# -submit-script Specifies which script to call on the submit server. If
+# this option is not specified it defaults to
+# /nightlytest/NightlyTestAccept.php. This is basically
+# everything after the www.yourserver.org.
+# -submit-aux If specified, an auxiliary script to run in addition to the
+# normal submit script. The script will be passed the path to
+# the "sentdata.txt" file as its sole argument.
+# -nosubmit Do not report the test results back to a submit server.
+#
+#
+# BUILD OPTIONS (not used with -config):
# -nocheckout Do not create, checkout, update, or configure
# the source tree.
# -noremove Do not remove the BUILDDIR after it has been built.
# -noremoveresults Do not remove the WEBDIR after it has been built.
+# -noclean Do not run 'make clean' before building.
# -nobuild Do not build llvm. If tests are enabled perform them
# on the llvm build specified in the build directory
-# -notest Do not even attempt to run the test programs. Implies
-# -norunningtests.
-# -norunningtests Do not run the Olden benchmark suite with
-# LARGE_PROBLEM_SIZE enabled.
-# -nodejagnu Do not run feature or regression tests
-# -parallel Run two parallel jobs with GNU Make.
# -release Build an LLVM Release version
+# -release-asserts Build an LLVM ReleaseAsserts version
+# -disable-bindings Disable building LLVM bindings.
+# -with-clang Checkout Clang source into tools/clang.
+# -compileflags Next argument specifies extra options passed to make when
+# building LLVM.
+# -use-gmake Use gmake instead of the default make command to build
+# llvm and run tests.
+# -llvmgccdir Next argument specifies the llvm-gcc install prefix.
+#
+# TESTING OPTIONS:
+# -notest Do not even attempt to run the test programs.
+# -nodejagnu Do not run feature or regression tests
# -enable-llcbeta Enable testing of beta features in llc.
+# -enable-lli Enable testing of lli (interpreter) features, default is off
+# -disable-pic Disable building with Position Independent Code.
# -disable-llc Disable LLC tests in the nightly tester.
# -disable-jit Disable JIT tests in the nightly tester.
# -disable-cbe Disable C backend tests in the nightly tester.
+# -disable-lto Disable link time optimization.
+# -test-cflags Next argument specifies that C compilation options that
+# override the default when running the testsuite.
+# -test-cxxflags Next argument specifies that C++ compilation options that
+# override the default when running the testsuite.
+# -extraflags Next argument specifies extra options that are passed to
+# compile the tests.
+# -noexternals Do not run the external tests (for cases where povray
+# or SPEC are not installed)
+# -with-externals Specify a directory where the external tests are located.
+#
+# OTHER OPTIONS:
+# -parallel Run parallel jobs with GNU Make (see -parallel-jobs).
+# -parallel-jobs The number of parallel Make jobs to use (default is two).
+# -parallel-test Allow parallel execution of llvm-test
# -verbose Turn on some debug output
-# -debug Print information useful only to maintainers of this script.
# -nice Checkout/Configure/Build with "nice" to reduce impact
# on busy servers.
# -f2c Next argument specifies path to F2C utility
-# -nickname The next argument specifieds the nickname this script
-# will submit to the nightlytest results repository.
# -gccpath Path to gcc/g++ used to build LLVM
-# -cvstag Check out a specific CVS tag to build LLVM (useful for
-# testing release branches)
# -target Specify the target triplet
# -cflags Next argument specifies that C compilation options that
# override the default.
@@ -50,24 +92,11 @@ use Socket;
# override the default.
# -ldflags Next argument specifies that linker options that override
# the default.
-# -compileflags Next argument specifies extra options passed to make when
-# building LLVM.
-# -use-gmake Use gmake instead of the default make command to build
-# llvm and run tests.
#
-# ---------------- Options to configure llvm-test ----------------------------
-# -extraflags Next argument specifies extra options that are passed to
-# compile the tests.
-# -noexternals Do not run the external tests (for cases where povray
-# or SPEC are not installed)
-# -with-externals Specify a directory where the external tests are located.
-#
-# CVSROOT is the CVS repository from which the tree will be checked out,
-# specified either in the full :method:user@host:/dir syntax, or
-# just /dir if using a local repo.
+# CVSROOT is ignored, it is passed for backwards compatibility.
# BUILDDIR is the directory where sources for this test run will be checked out
# AND objects for this test run will be built. This directory MUST NOT
-# exist before the script is run; it will be created by the cvs checkout
+# exist before the script is run; it will be created by the svn checkout
# process and erased (unless -noremove is specified; see above.)
# WEBDIR is the directory into which the test results web page will be written,
# AND in which the "index.html" is assumed to be a symlink to the most recent
@@ -80,372 +109,314 @@ use Socket;
# Getting environment variables
#
##############################################################
-my $HOME = $ENV{'HOME'};
-my $CVSRootDir = $ENV{'CVSROOT'};
- $CVSRootDir = "/home/vadve/shared/PublicCVS"
- unless $CVSRootDir;
+my $HOME = $ENV{'HOME'};
+my $SVNURL = $ENV{"SVNURL"};
+$SVNURL = 'http://llvm.org/svn/llvm-project' unless $SVNURL;
+my $TestSVNURL = $ENV{"TestSVNURL"};
+$TestSVNURL = 'http://llvm.org/svn/llvm-project' unless $TestSVNURL;
my $BuildDir = $ENV{'BUILDDIR'};
- $BuildDir = "$HOME/buildtest"
- unless $BuildDir;
my $WebDir = $ENV{'WEBDIR'};
- $WebDir = "$HOME/cvs/testresults-X86"
- unless $WebDir;
##############################################################
#
# Calculate the date prefix...
#
##############################################################
+use POSIX;
@TIME = localtime;
-my $DATE = sprintf "%4d-%02d-%02d", $TIME[5]+1900, $TIME[4]+1, $TIME[3];
-my $DateString = strftime "%B %d, %Y", localtime;
-my $TestStartTime = gmtime() . "GMT
" . localtime() . " (local)";
+my $DATE = strftime("%Y-%m-%d_%H-%M-%S", localtime());
##############################################################
#
# Parse arguments...
#
##############################################################
+$CONFIG_PATH="";
$CONFIGUREARGS="";
$nickname="";
$NOTEST=0;
-$NORUNNINGTESTS=0;
$MAKECMD="make";
+$SUBMITSERVER = "llvm.org";
+$SUBMITSCRIPT = "/nightlytest/NightlyTestAccept.php";
+$SUBMITAUX="";
+$SUBMIT = 1;
+$PARALLELJOBS = "2";
+my $TESTFLAGS="";
+
+if ($ENV{'LLVMGCCDIR'}) {
+ $CONFIGUREARGS .= " --with-llvmgccdir=" . $ENV{'LLVMGCCDIR'};
+ $LLVMGCCPATH = $ENV{'LLVMGCCDIR'} . '/bin';
+}
+else {
+ $LLVMGCCPATH = "";
+}
while (scalar(@ARGV) and ($_ = $ARGV[0], /^[-+]/)) {
- shift;
- last if /^--$/; # Stop processing arguments on --
+ shift;
+ last if /^--$/; # Stop processing arguments on --
# List command line options here...
- if (/^-nocheckout$/) { $NOCHECKOUT = 1; next; }
- if (/^-nocvsstats$/) { $NOCVSSTATS = 1; next; }
- if (/^-noremove$/) { $NOREMOVE = 1; next; }
- if (/^-noremoveresults$/) { $NOREMOVERESULTS = 1; next; }
- if (/^-notest$/) { $NOTEST = 1; $NORUNNINGTESTS = 1; next; }
- if (/^-norunningtests$/) { $NORUNNINGTESTS = 1; next; }
- if (/^-parallel$/) { $MAKEOPTS = "$MAKEOPTS -j2 -l3.0"; next; }
- if (/^-release$/) { $MAKEOPTS = "$MAKEOPTS ENABLE_OPTIMIZED=1 ".
- "OPTIMIZE_OPTION=-O2";
- $BUILDTYPE="release"; next; }
- if (/^-enable-llcbeta$/) { $PROGTESTOPTS .= " ENABLE_LLCBETA=1"; next; }
- if (/^-disable-llc$/) { $PROGTESTOPTS .= " DISABLE_LLC=1";
- $CONFIGUREARGS .= " --disable-llc_diffs"; next; }
- if (/^-disable-jit$/) { $PROGTESTOPTS .= " DISABLE_JIT=1";
- $CONFIGUREARGS .= " --disable-jit"; next; }
- if (/^-verbose$/) { $VERBOSE = 1; next; }
- if (/^-debug$/) { $DEBUG = 1; next; }
- if (/^-nice$/) { $NICE = "nice "; next; }
- if (/^-f2c$/) {
- $CONFIGUREARGS .= " --with-f2c=$ARGV[0]"; shift; next;
- }
- if (/^-with-externals$/) {
- $CONFIGUREARGS .= " --with-externals=$ARGV[0]"; shift; next;
- }
- if (/^-nickname$/) { $nickname = "$ARGV[0]"; shift; next; }
- if (/^-gccpath/) { $CONFIGUREARGS .=
- " CC=$ARGV[0]/gcc CXX=$ARGV[0]/g++";
- $GCCPATH=$ARGV[0];
- shift;
- next;}
- else{ $GCCPATH=""; }
- if (/^-cvstag/) { $CVSCOOPT .= " -r $ARGV[0]"; shift; next; }
- else{ $CVSCOOPT="";}
- if (/^-target/) {
- $CONFIGUREARGS .= " --target=$ARGV[0]"; shift; next;
- }
- if (/^-cflags/) {
- $MAKEOPTS = "$MAKEOPTS C.Flags=\'$ARGV[0]\'"; shift; next;
- }
- if (/^-cxxflags/) {
- $MAKEOPTS = "$MAKEOPTS CXX.Flags=\'$ARGV[0]\'"; shift; next;
- }
- if (/^-ldflags/) {
- $MAKEOPTS = "$MAKEOPTS LD.Flags=\'$ARGV[0]\'"; shift; next;
- }
- if (/^-compileflags/) {
- $MAKEOPTS = "$MAKEOPTS $ARGV[0]"; shift; next;
- }
- if (/^-use-gmake/) {
- $MAKECMD = "gmake"; shift; next;
- }
- if (/^-extraflags/) {
- $PROGTESTOPTS .= " EXTRA_FLAGS=\'$ARGV[0]\'"; shift; next;
- }
- if (/^-noexternals$/) { $NOEXTERNALS = 1; next; }
- if (/^-nodejagnu$/) { $NODEJAGNU = 1; next; }
- if (/^-nobuild$/) { $NOBUILD = 1; next; }
- print "Unknown option: $_ : ignoring!\n";
+ if (/^-config$/) { $CONFIG_PATH = "$ARGV[0]"; shift; next; }
+ if (/^-nocheckout$/) { $NOCHECKOUT = 1; next; }
+ if (/^-noclean$/) { $NOCLEAN = 1; next; }
+ if (/^-noremove$/) { $NOREMOVE = 1; next; }
+ if (/^-noremoveatend$/) { $NOREMOVEATEND = 1; next; }
+ if (/^-noremoveresults$/){ $NOREMOVERESULTS = 1; next; }
+ if (/^-notest$/) { $NOTEST = 1; next; }
+ if (/^-norunningtests$/) { next; } # Backward compatibility, ignored.
+ if (/^-parallel-jobs$/) { $PARALLELJOBS = "$ARGV[0]"; shift; next;}
+ if (/^-parallel$/) { $MAKEOPTS = "$MAKEOPTS -j$PARALLELJOBS"; next; }
+ if (/^-parallel-test$/) { $PROGTESTOPTS .= " ENABLE_PARALLEL_REPORT=1"; next; }
+ if (/^-with-clang$/) { $WITHCLANG = 1; next; }
+ if (/^-release$/) { $MAKEOPTS = "$MAKEOPTS ENABLE_OPTIMIZED=1 ".
+ "OPTIMIZE_OPTION=-O2"; next;}
+ if (/^-release-asserts$/){ $MAKEOPTS = "$MAKEOPTS ENABLE_OPTIMIZED=1 ".
+ "DISABLE_ASSERTIONS=1 ".
+ "OPTIMIZE_OPTION=-O2"; next;}
+ if (/^-enable-llcbeta$/) { $PROGTESTOPTS .= " ENABLE_LLCBETA=1"; next; }
+ if (/^-disable-pic$/) { $CONFIGUREARGS .= " --enable-pic=no"; next; }
+ if (/^-enable-lli$/) { $PROGTESTOPTS .= " ENABLE_LLI=1";
+ $CONFIGUREARGS .= " --enable-lli"; next; }
+ if (/^-disable-llc$/) { $PROGTESTOPTS .= " DISABLE_LLC=1";
+ $CONFIGUREARGS .= " --disable-llc_diffs"; next; }
+ if (/^-disable-jit$/) { $PROGTESTOPTS .= " DISABLE_JIT=1";
+ $CONFIGUREARGS .= " --disable-jit"; next; }
+ if (/^-disable-bindings$/) { $CONFIGUREARGS .= " --disable-bindings"; next; }
+ if (/^-disable-cbe$/) { $PROGTESTOPTS .= " DISABLE_CBE=1"; next; }
+ if (/^-disable-lto$/) { $PROGTESTOPTS .= " DISABLE_LTO=1"; next; }
+ if (/^-test-opts$/) { $PROGTESTOPTS .= " $ARGV[0]"; shift; next; }
+ if (/^-verbose$/) { $VERBOSE = 1; next; }
+ if (/^-teelogs$/) { $TEELOGS = 1; next; }
+ if (/^-nice$/) { $NICE = "nice "; next; }
+ if (/^-f2c$/) { $CONFIGUREARGS .= " --with-f2c=$ARGV[0]";
+ shift; next; }
+ if (/^-with-externals$/) { $CONFIGUREARGS .= " --with-externals=$ARGV[0]";
+ shift; next; }
+ if (/^-configure-args$/) { $CONFIGUREARGS .= " $ARGV[0]";
+ shift; next; }
+ if (/^-submit-server/) { $SUBMITSERVER = "$ARGV[0]"; shift; next; }
+ if (/^-submit-script/) { $SUBMITSCRIPT = "$ARGV[0]"; shift; next; }
+ if (/^-submit-aux/) { $SUBMITAUX = "$ARGV[0]"; shift; next; }
+ if (/^-nosubmit$/) { $SUBMIT = 0; next; }
+ if (/^-nickname$/) { $nickname = "$ARGV[0]"; shift; next; }
+ if (/^-gccpath/) { $CONFIGUREARGS .=
+ " CC=$ARGV[0]/gcc CXX=$ARGV[0]/g++";
+ $GCCPATH=$ARGV[0]; shift; next; }
+ else { $GCCPATH=""; }
+ if (/^-target/) { $CONFIGUREARGS .= " --target=$ARGV[0]";
+ shift; next; }
+ if (/^-cflags/) { $MAKEOPTS = "$MAKEOPTS C.Flags=\'$ARGV[0]\'";
+ shift; next; }
+ if (/^-cxxflags/) { $MAKEOPTS = "$MAKEOPTS CXX.Flags=\'$ARGV[0]\'";
+ shift; next; }
+ if (/^-ldflags/) { $MAKEOPTS = "$MAKEOPTS LD.Flags=\'$ARGV[0]\'";
+ shift; next; }
+ if (/^-test-cflags/) { $TESTFLAGS = "$TESTFLAGS CFLAGS=\'$ARGV[0]\'";
+ shift; next; }
+ if (/^-test-cxxflags/) { $TESTFLAGS = "$TESTFLAGS CXXFLAGS=\'$ARGV[0]\'";
+ shift; next; }
+ if (/^-compileflags/) { $MAKEOPTS = "$MAKEOPTS $ARGV[0]"; shift; next; }
+ if (/^-llvmgccdir/) { $CONFIGUREARGS .= " --with-llvmgccdir=\'$ARGV[0]\'";
+ $LLVMGCCPATH = $ARGV[0] . '/bin';
+ shift; next;}
+ if (/^-noexternals$/) { $NOEXTERNALS = 1; next; }
+ if (/^-use-gmake/) { $MAKECMD = "gmake"; shift; next; }
+ if (/^-extraflags/) { $CONFIGUREARGS .=
+ " --with-extra-options=\'$ARGV[0]\'"; shift; next;}
+ if (/^-noexternals$/) { $NOEXTERNALS = 1; next; }
+ if (/^-nodejagnu$/) { next; }
+ if (/^-nobuild$/) { $NOBUILD = 1; next; }
+ print "Unknown option: $_ : ignoring!\n";
}
-if ($ENV{'LLVMGCCDIR'}) {
- $CONFIGUREARGS .= " --with-llvmgccdir=" . $ENV{'LLVMGCCDIR'};
-}
if ($CONFIGUREARGS !~ /--disable-jit/) {
- $CONFIGUREARGS .= " --enable-jit";
+ $CONFIGUREARGS .= " --enable-jit";
}
-
-if (@ARGV != 0 and @ARGV != 3){
- foreach $x (@ARGV){
- print "$x\n";
- }
- print "Must specify 0 or 3 options!";
+if (@ARGV != 0 and @ARGV != 3) {
+ die "error: must specify 0 or 3 options!";
}
if (@ARGV == 3) {
- $CVSRootDir = $ARGV[0];
- $BuildDir = $ARGV[1];
- $WebDir = $ARGV[2];
+ if ($CONFIG_PATH ne "") {
+ die "error: arguments are unsupported in -config mode,";
+ }
+
+ # ARGV[0] used to be the CVS root, ignored for backward compatibility.
+ $BuildDir = $ARGV[1];
+ $WebDir = $ARGV[2];
}
-if($CVSRootDir eq "" or
- $BuildDir eq "" or
- $WebDir eq ""){
- die("please specify a cvs root directory, a build directory, and a ".
- "web directory");
- }
-
-if($nickname eq ""){
- die ("Please invoke NewNightlyTest.pl with command line option \"-nickname \"");
+if ($CONFIG_PATH ne "") {
+ $BuildDir = "";
+ $SVNURL = $TestSVNURL = "";
+ if ($WebDir eq "") {
+ die("please specify a web directory");
+ }
+} else {
+ if ($BuildDir eq "" or
+ $WebDir eq "") {
+ die("please specify a build directory, and a web directory");
+ }
}
-if($BUILDTYPE ne "release"){
- $BUILDTYPE = "debug";
+if ($nickname eq "") {
+ die ("Please invoke NewNightlyTest.pl with command line option " .
+ "\"-nickname \"");
}
+my $LLVMSrcDir = $ENV{'LLVMSRCDIR'};
+$LLVMSrcDir = "$BuildDir/llvm" unless $LLVMSrcDir;
+my $LLVMObjDir = $ENV{'LLVMOBJDIR'};
+$LLVMObjDir = "$BuildDir/llvm" unless $LLVMObjDir;
+my $LLVMTestDir = $ENV{'LLVMTESTDIR'};
+$LLVMTestDir = "$BuildDir/llvm/projects/llvm-test" unless $LLVMTestDir;
+
##############################################################
#
-#define the file names we'll use
+# Define the file names we'll use
#
##############################################################
+
my $Prefix = "$WebDir/$DATE";
-my $BuildLog = "$Prefix-Build-Log.txt";
-my $CVSLog = "$Prefix-CVS-Log.txt";
-my $OldenTestsLog = "$Prefix-Olden-tests.txt";
my $SingleSourceLog = "$Prefix-SingleSource-ProgramTest.txt.gz";
my $MultiSourceLog = "$Prefix-MultiSource-ProgramTest.txt.gz";
my $ExternalLog = "$Prefix-External-ProgramTest.txt.gz";
-my $DejagnuLog = "$Prefix-Dejagnu-testrun.log";
-my $DejagnuSum = "$Prefix-Dejagnu-testrun.sum";
-my $DejagnuTestsLog = "$Prefix-DejagnuTests-Log.txt";
-if (! -d $WebDir) {
- mkdir $WebDir, 0777;
- warn "$WebDir did not exist; creating it.\n";
-}
-if ($VERBOSE) {
- print "INITIALIZED\n";
- print "CVS Root = $CVSRootDir\n";
- print "BuildDir = $BuildDir\n";
- print "WebDir = $WebDir\n";
- print "Prefix = $Prefix\n";
- print "CVSLog = $CVSLog\n";
- print "BuildLog = $BuildLog\n";
-}
+# These are only valid in non-config mode.
+my $ConfigureLog = "", $BuildLog = "", $COLog = "";
+my $DejagnuLog = "", $DejagnuSum = "", $DejagnuLog = "";
+
+# Are we in config mode?
+my $ConfigMode = 0;
##############################################################
#
# Helper functions
#
##############################################################
+
sub GetDir {
- my $Suffix = shift;
- opendir DH, $WebDir;
- my @Result = reverse sort grep !/$DATE/, grep /[-0-9]+$Suffix/, readdir DH;
- closedir DH;
- return @Result;
+ my $Suffix = shift;
+ opendir DH, $WebDir;
+ my @Result = reverse sort grep !/$DATE/, grep /[-0-9]+$Suffix/, readdir DH;
+ closedir DH;
+ return @Result;
+}
+
+sub RunLoggedCommand {
+ my $Command = shift;
+ my $Log = shift;
+ my $Title = shift;
+ if ($TEELOGS) {
+ if ($VERBOSE) {
+ print "$Title\n";
+ print "$Command 2>&1 | tee $Log\n";
+ }
+ system "$Command 2>&1 | tee $Log";
+ } else {
+ if ($VERBOSE) {
+ print "$Title\n";
+ print "$Command 2>&1 > $Log\n";
+ }
+ system "$Command 2>&1 > $Log";
+ }
}
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-#
-# DiffFiles - Diff the current version of the file against the last version of
-# the file, reporting things added and removed. This is used to report, for
-# example, added and removed warnings. This returns a pair (added, removed)
-#
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-sub DiffFiles {
- my $Suffix = shift;
- my @Others = GetDir $Suffix;
- if (@Others == 0) { # No other files? We added all entries...
- return (`cat $WebDir/$DATE$Suffix`, "");
- }
- # Diff the files now...
- my @Diffs = split "\n", `diff $WebDir/$DATE$Suffix $WebDir/$Others[0]`;
- my $Added = join "\n", grep /^, @Diffs;
- my $Removed = join "\n", grep /^>/, @Diffs;
- $Added =~ s/^< //gm;
- $Removed =~ s/^> //gm;
- return ($Added, $Removed);
+sub RunAppendingLoggedCommand {
+ my $Command = shift;
+ my $Log = shift;
+ my $Title = shift;
+ if ($TEELOGS) {
+ if ($VERBOSE) {
+ print "$Title\n";
+ print "$Command 2>&1 | tee -a $Log\n";
+ }
+ system "$Command 2>&1 | tee -a $Log";
+ } else {
+ if ($VERBOSE) {
+ print "$Title\n";
+ print "$Command 2>&1 > $Log\n";
+ }
+ system "$Command 2>&1 >> $Log";
+ }
}
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub GetRegex { # (Regex with ()'s, value)
- $_[1] =~ /$_[0]/m;
- if (defined($1)) {
- return $1;
- }
- return "0";
-}
-
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-sub GetRegexNum {
- my ($Regex, $Num, $Regex2, $File) = @_;
- my @Items = split "\n", `grep '$Regex' $File`;
- return GetRegex $Regex2, $Items[$Num];
+ if ($_[1] =~ /$_[0]/m) {
+ return $1;
+ }
+ return "0";
}
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub ChangeDir { # directory, logical name
- my ($dir,$name) = @_;
- chomp($dir);
- if ( $VERBOSE ) { print "Changing To: $name ($dir)\n"; }
- $result = chdir($dir);
- if(!$result){
- print "ERROR!!! Cannot change directory to: $name ($dir) because $!";
- return false;
- }
- return true;
+ my ($dir,$name) = @_;
+ chomp($dir);
+ if ( $VERBOSE ) { print "Changing To: $name ($dir)\n"; }
+ $result = chdir($dir);
+ if (!$result) {
+ print "ERROR!!! Cannot change directory to: $name ($dir) because $!\n";
+ return false;
+ }
+ return true;
}
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub ReadFile {
- if (open (FILE, $_[0])) {
- undef $/;
- my $Ret = ;
- close FILE;
- $/ = '\n';
- return $Ret;
- } else {
- print "Could not open file '$_[0]' for reading!\n";
- return "";
- }
+ if (open (FILE, $_[0])) {
+ undef $/;
+ my $Ret = ;
+ close FILE;
+ $/ = '\n';
+ return $Ret;
+ } else {
+ print "Could not open file '$_[0]' for reading!\n";
+ return "";
+ }
}
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub WriteFile { # (filename, contents)
- open (FILE, ">$_[0]") or die "Could not open file '$_[0]' for writing!\n";
- print FILE $_[1];
- close FILE;
+ open (FILE, ">$_[0]") or die "Could not open file '$_[0]' for writing!\n";
+ print FILE $_[1];
+ close FILE;
}
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub CopyFile { #filename, newfile
- my ($file, $newfile) = @_;
- chomp($file);
- if ($VERBOSE) { print "Copying $file to $newfile\n"; }
- copy($file, $newfile);
-}
-
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-sub AddRecord {
- my ($Val, $Filename,$WebDir) = @_;
- my @Records;
- if (open FILE, "$WebDir/$Filename") {
- @Records = grep !/$DATE/, split "\n", ;
- close FILE;
- }
- push @Records, "$DATE: $Val";
- WriteFile "$WebDir/$Filename", (join "\n", @Records) . "\n";
+ my ($file, $newfile) = @_;
+ chomp($file);
+ if ($VERBOSE) { print "Copying $file to $newfile\n"; }
+ copy($file, $newfile);
}
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-#
-# FormatTime - Convert a time from 1m23.45 into 83.45
-#
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-sub FormatTime {
- my $Time = shift;
- if ($Time =~ m/([0-9]+)m([0-9.]+)/) {
- $Time = sprintf("%7.4f", $1*60.0+$2);
- }
- return $Time;
-}
-
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-sub GetDejagnuTestResults { # (filename, log)
- my ($filename, $DejagnuLog) = @_;
- my @lines;
- my $firstline;
- $/ = "\n"; #Make sure we're going line at a time.
-
- print "DEJAGNU TEST RESULTS:\n";
-
- if (open SRCHFILE, $filename) {
- # Process test results
- my $first_list = 1;
- my $should_break = 1;
- my $nocopy = 0;
- my $readingsum = 0;
- while ( ) {
- if ( length($_) > 1 ) {
- chomp($_);
- if ( m/^XPASS:/ || m/^FAIL:/ ) {
- $nocopy = 0;
- if ( $first_list ) {
- push(@lines, "UNEXPECTED TEST RESULTS\n");
- $first_list = 0;
- $should_break = 1;
- push(@lines, "$_\n");
- print " $_\n";
- } else {
- push(@lines, "$_\n");
- print " $_\n";
- }
- } #elsif ( m/Summary/ ) {
- # if ( $first_list ) {
- # push(@lines, "PERFECT!");
- # print " PERFECT!\n";
- # } else {
- # push(@lines, "\n");
- # }
- # push(@lines, "STATISTICS\n");
- # print "\nDEJAGNU STATISTICS:\n";
- # $should_break = 0;
- # $nocopy = 0;
- # $readingsum = 1;
- #}
- elsif ( $readingsum ) {
- push(@lines,"$_\n");
- print " $_\n";
- }
-
- }
- }
- }
- close SRCHFILE;
-
- my $content = join("", @lines);
- return $content;
-}
-
-
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
# This function acts as a mini web browswer submitting data
# to our central server via the post method
#
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-sub SendData{
+sub SendData {
$host = $_[0];
$file = $_[1];
- $variables=$_[2];
+ $variables = $_[2];
- $port=80;
- $socketaddr= sockaddr_in $port, inet_aton $host or die "Bad hostname\n";
- socket SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp') or
- die "Bad socket\n";
- connect SOCK, $socketaddr or die "Bad connection\n";
- select((select(SOCK), $| = 1)[0]);
+ # Write out the "...-sentdata.txt" file.
+
+ my $sentdata="";
+ foreach $x (keys (%$variables)){
+ $value = $variables->{$x};
+ $sentdata.= "$x => $value\n";
+ }
+ WriteFile "$Prefix-sentdata.txt", $sentdata;
+
+ if (!($SUBMITAUX eq "")) {
+ system "$SUBMITAUX \"$Prefix-sentdata.txt\"";
+ }
+
+ if (!$SUBMIT) {
+ return "Skipped standard submit.\n";
+ }
+
+ # Create the content to send to the server.
- #creating content here
my $content;
foreach $key (keys (%$variables)){
$value = $variables->{$key};
@@ -453,9 +424,21 @@ sub SendData{
$content .= "$key=$value&";
}
+ # Send the data to the server.
+ #
+ # FIXME: This code should be more robust?
+
+ $port=80;
+ $socketaddr= sockaddr_in $port, inet_aton $host or die "Bad hostname\n";
+ socket SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp') or
+ die "Bad socket\n";
+ connect SOCK, $socketaddr or die "Bad connection\n";
+ select((select(SOCK), $| = 1)[0]);
+
$length = length($content);
my $send= "POST $file HTTP/1.0\n";
+ $send.= "Host: $host\n";
$send.= "Content-Type: application/x-www-form-urlencoded\n";
$send.= "Content-length: $length\n\n";
$send.= "$content";
@@ -467,574 +450,369 @@ sub SendData{
}
close(SOCK);
- my $sentdata="";
- foreach $x (keys (%$variables)){
- $value = $variables->{$x};
- $sentdata.= "$x => $value\n";
- }
- WriteFile "$Prefix-sentdata.txt", $sentdata;
-
-
return $result;
}
##############################################################
#
-# Getting Start timestamp
+# Individual Build & Test Functions
#
##############################################################
-$starttime = `date "+20%y-%m-%d %H:%M:%S"`;
-##############################################################
-#
-# Create the CVS repository directory
-#
-##############################################################
-if (!$NOCHECKOUT) {
- if (-d $BuildDir) {
- if (!$NOREMOVE) {
- if ( $VERBOSE ){
- print "Build directory exists! Removing it\n";
- }
- system "rm -rf $BuildDir";
- } else {
- die "CVS checkout directory $BuildDir already exists!";
- }
+# Create the source repository directory.
+sub CheckoutSource {
+ die "Invalid call!" unless $ConfigMode == 0;
+ if (-d $BuildDir) {
+ if (!$NOREMOVE) {
+ if ( $VERBOSE ) {
+ print "Build directory exists! Removing it\n";
+ }
+ system "rm -rf $BuildDir";
+ mkdir $BuildDir or die "Could not create checkout directory $BuildDir!";
+ } else {
+ if ( $VERBOSE ) {
+ print "Build directory exists!\n";
+ }
}
- mkdir $BuildDir or die "Could not create CVS checkout directory $BuildDir!";
-}
-ChangeDir( $BuildDir, "CVS checkout directory" );
-
+ } else {
+ mkdir $BuildDir or die "Could not create checkout directory $BuildDir!";
+ }
-##############################################################
-#
-# Check out the llvm tree, saving CVS messages to the cvs log...
-#
-##############################################################
-my $CVSOPT = "";
-# Use compression if going over ssh.
-$CVSOPT = "-z3" if $CVSRootDir =~ /^:ext:/;
-my $CVSCMD = "$NICE cvs $CVSOPT -d $CVSRootDir co $CVSCOOPT";
-if (!$NOCHECKOUT) {
- if ( $VERBOSE )
- {
- print "CHECKOUT STAGE:\n";
- print "( time -p $CVSCMD llvm; cd llvm/projects ; $CVSCMD llvm-test ) > $CVSLog 2>&1\n";
- }
- system "( time -p $CVSCMD llvm; cd llvm/projects ; " .
- "$CVSCMD llvm-test ) > $CVSLog 2>&1";
- ChangeDir( $BuildDir , "CVS Checkout directory") ;
-}
-ChangeDir( "llvm" , "llvm source directory") ;
-if (!$NOCHECKOUT) {
- if ( $VERBOSE ) { print "UPDATE STAGE\n"; }
- system "$NICE cvs update -PdRA >> $CVSLog 2>&1" ;
+ ChangeDir( $BuildDir, "checkout directory" );
+ my $SVNCMD = "$NICE svn co --non-interactive";
+ RunLoggedCommand("( time -p $SVNCMD $SVNURL/llvm/trunk llvm; cd llvm/projects ; " .
+ " $SVNCMD $TestSVNURL/test-suite/trunk llvm-test )", $COLog,
+ "CHECKOUT LLVM");
+ if ($WITHCLANG) {
+ RunLoggedCommand("( cd llvm/tools ; " .
+ " $SVNCMD $SVNURL/cfe/trunk clang )", $COLog,
+ "CHECKOUT CLANG");
+ }
}
-##############################################################
-#
-# Get some static statistics about the current state of CVS
-#
-# This can probably be put on the server side
-#
-##############################################################
-my $CVSCheckoutTime_Wall = GetRegex "([0-9.]+)", `grep '^real' $CVSLog`;
-my $CVSCheckoutTime_User = GetRegex "([0-9.]+)", `grep '^user' $CVSLog`;
-my $CVSCheckoutTime_Sys = GetRegex "([0-9.]+)", `grep '^sys' $CVSLog`;
-my $CVSCheckoutTime_CPU = $CVSCheckoutTime_User + $CVSCheckoutTime_Sys;
-
-my $NumFilesInCVS = `egrep '^U' $CVSLog | wc -l` + 0;
-my $NumDirsInCVS = `egrep '^cvs (checkout|server|update):' $CVSLog | wc -l` + 0;
-my $LOC = `utils/countloc.sh`;
+# Build the entire tree, saving build messages to the build log. Returns false
+# on build failure.
+sub BuildLLVM {
+ die "Invalid call!" unless $ConfigMode == 0;
+ my $EXTRAFLAGS = "--enable-spec --with-objroot=.";
+ RunLoggedCommand("(time -p $NICE ./configure $CONFIGUREARGS $EXTRAFLAGS) ",
+ $ConfigureLog, "CONFIGURE");
+ # Build the entire tree, capturing the output into $BuildLog
+ if (!$NOCLEAN) {
+ RunAppendingLoggedCommand("($NICE $MAKECMD $MAKEOPTS clean)", $BuildLog, "BUILD CLEAN");
+ }
+ RunAppendingLoggedCommand("(time -p $NICE $MAKECMD $MAKEOPTS)", $BuildLog, "BUILD");
-##############################################################
-#
-# Extract some information from the CVS history... use a hash so no duplicate
-# stuff is stored. This gets the history from the previous days worth
-# of cvs activit and parses it.
-#
-##############################################################
+ if (`grep '^$MAKECMD\[^:]*: .*Error' $BuildLog | wc -l` + 0 ||
+ `grep '^$MAKECMD: \*\*\*.*Stop.' $BuildLog | wc -l` + 0) {
+ return 0;
+ }
-my (%AddedFiles, %ModifiedFiles, %RemovedFiles, %UsersCommitted, %UsersUpdated);
+ return 1;
+}
-if(!$NOCVSSTATS){
+# Run the named tests (i.e. "SingleSource" "MultiSource" "External")
+sub TestDirectory {
+ my $SubDir = shift;
+ ChangeDir( "$LLVMTestDir/$SubDir",
+ "Programs Test Subdirectory" ) || return ("", "");
-if ($VERBOSE) { print "CVS HISTORY ANALYSIS STAGE\n"; }
-@CVSHistory = split "\n", `cvs history -D '1 day ago' -a -xAMROCGUW`;
-#print join "\n", @CVSHistory; print "\n";
+ my $ProgramTestLog = "$Prefix-$SubDir-ProgramTest.txt";
-my $DateRE = '[-/:0-9 ]+\+[0-9]+';
+ # Make sure to clean the test results.
+ RunLoggedCommand("$MAKECMD -k $MAKEOPTS $PROGTESTOPTS clean $TESTFLAGS",
+ $ProgramTestLog, "TEST DIRECTORY $SubDir");
-# Loop over every record from the CVS history, filling in the hashes.
-foreach $File (@CVSHistory) {
- my ($Type, $Date, $UID, $Rev, $Filename);
- if ($File =~ /([AMRUGC]) ($DateRE) ([^ ]+) +([^ ]+) +([^ ]+) +([^ ]+)/) {
- ($Type, $Date, $UID, $Rev, $Filename) = ($1, $2, $3, $4, "$6/$5");
- } elsif ($File =~ /([W]) ($DateRE) ([^ ]+)/) {
- ($Type, $Date, $UID, $Rev, $Filename) = ($1, $2, $3, "", "");
- } elsif ($File =~ /([O]) ($DateRE) ([^ ]+) +([^ ]+)/) {
- ($Type, $Date, $UID, $Rev, $Filename) = ($1, $2, $3, "", "$4/");
- } else {
- print "UNMATCHABLE: $File\n";
- next;
- }
- # print "$File\nTy = $Type Date = '$Date' UID=$UID Rev=$Rev File = '$Filename'\n";
-
- if ($Filename =~ /^llvm/) {
- if ($Type eq 'M') { # Modified
- $ModifiedFiles{$Filename} = 1;
- $UsersCommitted{$UID} = 1;
- } elsif ($Type eq 'A') { # Added
- $AddedFiles{$Filename} = 1;
- $UsersCommitted{$UID} = 1;
- } elsif ($Type eq 'R') { # Removed
- $RemovedFiles{$Filename} = 1;
- $UsersCommitted{$UID} = 1;
- } else {
- $UsersUpdated{$UID} = 1;
- }
- }
-}
+ # Run the programs tests... creating a report.nightly.csv file.
+ my $LLCBetaOpts = "";
+ RunLoggedCommand("$MAKECMD -k $MAKEOPTS $PROGTESTOPTS report.nightly.csv ".
+ "$TESTFLAGS TEST=nightly",
+ $ProgramTestLog, "TEST DIRECTORY $SubDir");
+ $LLCBetaOpts = `$MAKECMD print-llcbeta-option`;
-my $TestError = 1;
+ my $ProgramsTable;
+ if (`grep '^$MAKECMD\[^:]: .*Error' $ProgramTestLog | wc -l` + 0) {
+ $ProgramsTable="Error running test $SubDir\n";
+ print "ERROR TESTING\n";
+ } elsif (`grep '^$MAKECMD\[^:]: .*No rule to make target' $ProgramTestLog | wc -l` + 0) {
+ $ProgramsTable="Makefile error running tests $SubDir!\n";
+ print "ERROR TESTING\n";
+ } else {
+ # Create a list of the tests which were run...
+ system "egrep 'TEST-(PASS|FAIL)' < $ProgramTestLog ".
+ "| sort > $Prefix-$SubDir-Tests.txt";
+ }
+ $ProgramsTable = ReadFile "report.nightly.csv";
-}#!NOCVSSTATS
+ ChangeDir( "../../..", "Programs Test Parent Directory" );
+ return ($ProgramsTable, $LLCBetaOpts);
+}
+
+# Run all the nightly tests and return the program tables and the list of tests,
+# passes, fails, and xfails.
+sub RunNightlyTest() {
+ ($SSProgs, $llcbeta_options) = TestDirectory("SingleSource");
+ WriteFile "$Prefix-SingleSource-Performance.txt", $SSProgs;
+ ($MSProgs, $llcbeta_options) = TestDirectory("MultiSource");
+ WriteFile "$Prefix-MultiSource-Performance.txt", $MSProgs;
+ if ( ! $NOEXTERNALS ) {
+ ($ExtProgs, $llcbeta_options) = TestDirectory("External");
+ WriteFile "$Prefix-External-Performance.txt", $ExtProgs;
+ system "cat $Prefix-SingleSource-Tests.txt " .
+ "$Prefix-MultiSource-Tests.txt ".
+ "$Prefix-External-Tests.txt | sort > $Prefix-Tests.txt";
+ system "cat $Prefix-SingleSource-Performance.txt " .
+ "$Prefix-MultiSource-Performance.txt ".
+ "$Prefix-External-Performance.txt | sort > $Prefix-Performance.txt";
+ } else {
+ $ExtProgs = "External TEST STAGE SKIPPED\n";
+ if ( $VERBOSE ) {
+ print "External TEST STAGE SKIPPED\n";
+ }
+ system "cat $Prefix-SingleSource-Tests.txt " .
+ "$Prefix-MultiSource-Tests.txt ".
+ " | sort > $Prefix-Tests.txt";
+ system "cat $Prefix-SingleSource-Performance.txt " .
+ "$Prefix-MultiSource-Performance.txt ".
+ " | sort > $Prefix-Performance.txt";
+ }
-my $CVSAddedFiles = join "\n", sort keys %AddedFiles;
-my $CVSModifiedFiles = join "\n", sort keys %ModifiedFiles;
-my $CVSRemovedFiles = join "\n", sort keys %RemovedFiles;
-my $UserCommitList = join "\n", sort keys %UsersCommitted;
-my $UserUpdateList = join "\n", sort keys %UsersUpdated;
+ # Compile passes, fails, xfails.
+ my $All = (ReadFile "$Prefix-Tests.txt");
+ my @TestSuiteResultLines = split "\n", $All;
+ my ($Passes, $Fails, $XFails) = "";
-##############################################################
-#
-# Build the entire tree, saving build messages to the build log
-#
-##############################################################
-if (!$NOCHECKOUT && !$NOBUILD) {
- my $EXTRAFLAGS = "--enable-spec --with-objroot=.";
- if ( $VERBOSE ){
- print "CONFIGURE STAGE:\n";
- print "(time -p $NICE ./configure $CONFIGUREARGS $EXTRAFLAGS) > $BuildLog 2>&1\n";
+ for ($x=0; $x < @TestSuiteResultLines; $x++) {
+ if (@TestSuiteResultLines[$x] =~ m/^PASS:/) {
+ $Passes .= "$TestSuiteResultLines[$x]\n";
}
- system "(time -p $NICE ./configure $CONFIGUREARGS $EXTRAFLAGS) > $BuildLog 2>&1";
- if ( $VERBOSE )
- {
- print "BUILD STAGE:\n";
- print "(time -p $NICE $MAKECMD $MAKEOPTS) >> $BuildLog 2>&1\n";
+ elsif (@TestSuiteResultLines[$x] =~ m/^FAIL:/) {
+ $Fails .= "$TestSuiteResultLines[$x]\n";
}
- # Build the entire tree, capturing the output into $BuildLog
- system "(time -p $NICE $MAKECMD $MAKEOPTS) >> $BuildLog 2>&1";
-}
+ elsif (@TestSuiteResultLines[$x] =~ m/^XFAIL:/) {
+ $XFails .= "$TestSuiteResultLines[$x]\n";
+ }
+ }
+ return ($SSProgs, $MSProgs, $ExtProgs, $All, $Passes, $Fails, $XFails);
+}
##############################################################
#
-# Get some statistics about the build...
+# Initialize filenames
#
##############################################################
-#this can de done on server
-#my @Linked = split '\n', `grep Linking $BuildLog`;
-#my $NumExecutables = scalar(grep(/executable/, @Linked));
-#my $NumLibraries = scalar(grep(!/executable/, @Linked));
-#my $NumObjects = `grep ']\: Compiling ' $BuildLog | wc -l` + 0;
-
-
-my $ConfigTimeU = GetRegexNum "^user", 0, "([0-9.]+)", "$BuildLog";
-my $ConfigTimeS = GetRegexNum "^sys", 0, "([0-9.]+)", "$BuildLog";
-my $ConfigTime = $ConfigTimeU+$ConfigTimeS; # ConfigTime = User+System
-my $ConfigWallTime = GetRegexNum "^real", 0,"([0-9.]+)","$BuildLog";
-
-$ConfigTime=-1 unless $ConfigTime;
-$ConfigWallTime=-1 unless $ConfigWallTime;
-
-my $BuildTimeU = GetRegexNum "^user", 1, "([0-9.]+)", "$BuildLog";
-my $BuildTimeS = GetRegexNum "^sys", 1, "([0-9.]+)", "$BuildLog";
-my $BuildTime = $BuildTimeU+$BuildTimeS; # BuildTime = User+System
-my $BuildWallTime = GetRegexNum "^real", 1, "([0-9.]+)","$BuildLog";
-
-$BuildTime=-1 unless $BuildTime;
-$BuildWallTime=-1 unless $BuildWallTime;
-my $BuildError = 0, $BuildStatus = "OK";
-if($NOBUILD){
- $BuildStatus = "Skipped by user";
- $BuildError = 1;
-}
-elsif (`grep '^$MAKECMD\[^:]*: .*Error' $BuildLog | wc -l` + 0 ||
- `grep '^$MAKECMD: \*\*\*.*Stop.' $BuildLog | wc -l`+0) {
- $BuildStatus = "Error: compilation aborted";
- $BuildError = 1;
- print "\n***ERROR BUILDING TREE\n\n";
+if (! -d $WebDir) {
+ mkdir $WebDir, 0777 or die "Unable to create web directory: '$WebDir'.";
+ if($VERBOSE){
+ warn "$WebDir did not exist; creating it.\n";
+ }
}
-if ($BuildError) { $NODEJAGNU=1; }
-my $a_file_sizes="";
-my $o_file_sizes="";
-if(!$BuildError){
- if ( $VERBOSE ){
- print "Organizing size of .o and .a files\n";
- }
- ChangeDir( "$BuildDir/llvm", "Build Directory" );
- $afiles = `find . -iname '*.a' -ls`;
- $ofiles = `find . -iname '*.o' -ls`;
- @AFILES = split "\n", $afiles;
- $a_file_sizes="";
- foreach $x (@AFILES){
- $x =~ m/.+\s+.+\s+.+\s+.+\s+.+\s+.+\s+(.+)\s+.+\s+.+\s+.+\s+(.+)/;
- $a_file_sizes.="$1 $2 $BUILDTYPE\n";
- }
- @OFILES = split "\n", $ofiles;
- $o_file_sizes="";
- foreach $x (@OFILES){
- $x =~ m/.+\s+.+\s+.+\s+.+\s+.+\s+.+\s+(.+)\s+.+\s+.+\s+.+\s+(.+)/;
- $o_file_sizes.="$1 $2 $BUILDTYPE\n";
- }
+if ($CONFIG_PATH ne "") {
+ $ConfigMode = 1;
+ $LLVMSrcDir = GetRegex "^(.*)\\s+", `$CONFIG_PATH --src-root`;
+ $LLVMObjDir = GetRegex "^(.*)\\s+", `$CONFIG_PATH --obj-root`;
+ # FIXME: Add llvm-config hook for this?
+ $LLVMTestDir = $LLVMObjDir . "/projects/test-suite";
+} else {
+ $ConfigureLog = "$Prefix-Configure-Log.txt";
+ $BuildLog = "$Prefix-Build-Log.txt";
+ $COLog = "$Prefix-CVS-Log.txt";
}
-else{
- $a_file_sizes="No data due to a bad build.";
- $o_file_sizes="No data due to a bad build.";
-}
-
-##############################################################
-#
-# Running dejagnu tests
-#
-##############################################################
-my $DejangnuTestResults; # String containing the results of the dejagnu
-my $dejagnu_output = "$DejagnuTestsLog";
-if(!$NODEJAGNU) {
- if($VERBOSE)
- {
- print "DEJAGNU FEATURE/REGRESSION TEST STAGE:\n";
- print "(time -p $MAKECMD $MAKEOPTS check) > $dejagnu_output 2>&1\n";
- }
-
- #Run the feature and regression tests, results are put into testrun.sum
- #Full log in testrun.log
- system "(time -p $MAKECMD $MAKEOPTS check) > $dejagnu_output 2>&1";
-
- #Copy the testrun.log and testrun.sum to our webdir
- CopyFile("test/testrun.log", $DejagnuLog);
- CopyFile("test/testrun.sum", $DejagnuSum);
- #can be done on server
- $DejagnuTestResults = GetDejagnuTestResults($DejagnuSum, $DejagnuLog);
- $unexpfail_tests = $DejagnuTestResults;
+if ($VERBOSE) {
+ if ($CONFIG_PATH ne "") {
+ print "INITIALIZED (config mode)\n";
+ print "WebDir = $WebDir\n";
+ print "Prefix = $Prefix\n";
+ print "LLVM Src = $LLVMSrcDir\n";
+ print "LLVM Obj = $LLVMObjDir\n";
+ print "LLVM Test = $LLVMTestDir\n";
+ } else {
+ print "INITIALIZED\n";
+ print "SVN URL = $SVNURL\n";
+ print "COLog = $COLog\n";
+ print "BuildDir = $BuildDir\n";
+ print "WebDir = $WebDir\n";
+ print "Prefix = $Prefix\n";
+ print "BuildLog = $BuildLog\n";
+ }
}
-#Extract time of dejagnu tests
-my $DejagnuTimeU = GetRegexNum "^user", 0, "([0-9.]+)", "$dejagnu_output";
-my $DejagnuTimeS = GetRegexNum "^sys", 0, "([0-9.]+)", "$dejagnu_output";
-$DejagnuTime = $DejagnuTimeU+$DejagnuTimeS; # DejagnuTime = User+System
-$DejagnuWallTime = GetRegexNum "^real", 0,"([0-9.]+)","$dejagnu_output";
-$DejagnuTestResults = "Dejagnu skipped by user choice." unless $DejagnuTestResults;
-$DejagnuTime = "0.0" unless $DejagnuTime;
-$DejagnuWallTime = "0.0" unless $DejagnuWallTime;
-
-if ($DEBUG) {
- print $DejagnuTestResults;
-}
##############################################################
#
-# Get warnings from the build
+# The actual NewNightlyTest logic.
#
##############################################################
-if(!$NODEJAGNU){
-
-if ( $VERBOSE ) { print "BUILD INFORMATION COLLECTION STAGE\n"; }
-my @Warn = split "\n", `egrep 'warning:|Entering dir' $BuildLog`;
-my @Warnings;
-my $CurDir = "";
-
-foreach $Warning (@Warn) {
- if ($Warning =~ m/Entering directory \`([^\`]+)\'/) {
- $CurDir = $1; # Keep track of directory warning is in...
- if ($CurDir =~ m#$BuildDir/llvm/(.*)#) { # Remove buildir prefix if included
- $CurDir = $1;
- }
- } else {
- push @Warnings, "$CurDir/$Warning"; # Add directory to warning...
- }
-}
-my $WarningsFile = join "\n", @Warnings;
-$WarningsFile =~ s/:[0-9]+:/::/g;
-
-# Emit the warnings file, so we can diff...
-WriteFile "$WebDir/$DATE-Warnings.txt", $WarningsFile . "\n";
-my ($WarningsAdded, $WarningsRemoved) = DiffFiles "-Warnings.txt";
-
-# Output something to stdout if something has changed
-#print "ADDED WARNINGS:\n$WarningsAdded\n\n" if (length $WarningsAdded);
-#print "REMOVED WARNINGS:\n$WarningsRemoved\n\n" if (length $WarningsRemoved);
-#my @TmpWarningsAdded = split "\n", $WarningsAdded; ~PJ on upgrade
-#my @TmpWarningsRemoved = split "\n", $WarningsRemoved; ~PJ on upgrade
+$starttime = `date "+20%y-%m-%d %H:%M:%S"`;
-} #endif !NODEGAGNU
+my $BuildError = 0, $BuildStatus = "OK";
+if ($ConfigMode == 0) {
+ if (!$NOCHECKOUT) {
+ CheckoutSource();
+ }
-##############################################################
-#
-# If we built the tree successfully, run the nightly programs tests...
-#
-# A set of tests to run is passed in (i.e. "SingleSource" "MultiSource" "External")
-#
-##############################################################
-sub TestDirectory {
- my $SubDir = shift;
-
- ChangeDir( "$BuildDir/llvm/projects/llvm-test/$SubDir", "Programs Test Subdirectory" ) || return ("", "");
-
- my $ProgramTestLog = "$Prefix-$SubDir-ProgramTest.txt";
-
- # Run the programs tests... creating a report.nightly.csv file
- if (!$NOTEST) {
- print "$MAKECMD -k $MAKEOPTS $PROGTESTOPTS report.nightly.csv ".
- "TEST=nightly > $ProgramTestLog 2>&1\n";
- system "$MAKECMD -k $MAKEOPTS $PROGTESTOPTS report.nightly.csv ".
- "TEST=nightly > $ProgramTestLog 2>&1";
- $llcbeta_options=`$MAKECMD print-llcbeta-option`;
- }
-
- my $ProgramsTable;
- if (`grep '^$MAKECMD\[^:]: .*Error' $ProgramTestLog | wc -l` + 0){
- $TestError = 1;
- $ProgramsTable="Error running test $SubDir\n";
- print "ERROR TESTING\n";
- } elsif (`grep '^$MAKECMD\[^:]: .*No rule to make target' $ProgramTestLog | wc -l` + 0) {
- $TestError = 1;
- $ProgramsTable="Makefile error running tests $SubDir!\n";
- print "ERROR TESTING\n";
+ # Build LLVM.
+ ChangeDir( $LLVMSrcDir , "llvm source directory") ;
+ if ($NOCHECKOUT || $NOBUILD) {
+ $BuildStatus = "Skipped by user";
} else {
- $TestError = 0;
- #
- # Create a list of the tests which were run...
- #
- system "egrep 'TEST-(PASS|FAIL)' < $ProgramTestLog ".
- "| sort > $Prefix-multisourceprogramstable.txt";
+ if (!BuildLLVM()) {
+ if( $VERBOSE) { print "\n***ERROR BUILDING TREE\n\n"; }
+ $BuildError = 1;
+ $BuildStatus = "Error: compilation aborted";
+ }
}
- $ProgramsTable = ReadFile "report.nightly.csv";
-
- ChangeDir( "../../..", "Programs Test Parent Directory" );
- return ($ProgramsTable, $llcbeta_options);
}
-if (!$BuildError) {
- if ( $VERBOSE ) {
- print "SingleSource TEST STAGE\n";
- }
- ($SingleSourceProgramsTable, $llcbeta_options) = TestDirectory("SingleSource");
- WriteFile "$Prefix-singlesourceprogramstable.txt", $SingleSourceProgramsTable;
- ($MultiSourceProgramsTable, $llcbeta_options) = TestDirectory("MultiSource");
- WriteFile "$Prefix-multisourceprogramstable.txt", $MultiSourceProgramsTable;
- if ( $VERBOSE ) {
- print "MultiSource returned $MultiSourceProgramsTable\n";
- }
- if ( ! $NOEXTERNALS ) {
- if ( $VERBOSE ) {
- print "External TEST STAGE\n";
- }
- ($ExternalProgramsTable, $llcbeta_options) = TestDirectory("External");
- WriteFile "$Prefix-externalprogramstable.txt", $ExternalProgramsTable;
- system "cat $Prefix-singlesourceprogramstable.txt $Prefix-multisourceprogramstable.txt ".
- " $Prefix-externalprogramstable.txt | sort > $Prefix-Tests.txt";
- } else {
- $ExternalProgramsTable = "External TEST STAGE SKIPPED\n";
- if ( $VERBOSE ) {
- print "External TEST STAGE SKIPPED\n";
- }
- system "cat $Prefix-singlesourceprogramstable.txt $Prefix-multisourceprogramstable.txt ".
- " | sort > $Prefix-Tests.txt";
- }
- WriteFile "$Prefix-externalprogramstable.txt", $ExternalProgramsTable;
+# Run the llvm-test tests.
+my ($SingleSourceProgramsTable, $MultiSourceProgramsTable, $ExternalProgramsTable,
+ $all_tests, $passes, $fails, $xfails) = "";
+if (!$NOTEST && !$BuildError) {
+ ($SingleSourceProgramsTable, $MultiSourceProgramsTable, $ExternalProgramsTable,
+ $all_tests, $passes, $fails, $xfails) = RunNightlyTest();
}
-##############################################################
-#
-#
-# gathering tests added removed broken information here
-#
-#
-##############################################################
-my $dejagnu = ReadFile $DejagnuSum;
-my @DEJAGNU = split "\n", $dejagnu;
-
-my $passes="",
-my $fails="";
-my $xfails="";
-
-if(!$NODEJAGNU) {
- for($x=0; $x<@DEJAGNU; $x++){
- if($DEJAGNU[$x] =~ m/^PASS:/){
- $passes.="$DEJAGNU[$x]\n";
- }
- elsif($DEJAGNU[$x] =~ m/^FAIL:/){
- $fails.="$DEJAGNU[$x]\n";
- }
- elsif($DEJAGNU[$x] =~ m/^XFAIL:/){
- $xfails.="$DEJAGNU[$x]\n";
- }
- }
-}
-
-##############################################################
-#
-# If we built the tree successfully, runs of the Olden suite with
-# LARGE_PROBLEM_SIZE on so that we can get some "running" statistics.
-#
-##############################################################
-if (!$BuildError) {
- if ( $VERBOSE ) { print "OLDEN TEST SUITE STAGE\n"; }
- my ($NATTime, $CBETime, $LLCTime, $JITTime, $OptTime, $BytecodeSize,
- $MachCodeSize) = ("","","","","","","");
- if (!$NORUNNINGTESTS) {
- ChangeDir( "$BuildDir/llvm/projects/llvm-test/MultiSource/Benchmarks/Olden",
- "Olden Test Directory");
-
- # Clean out previous results...
- system "$NICE $MAKECMD $MAKEOPTS clean > /dev/null 2>&1";
-
- # Run the nightly test in this directory, with LARGE_PROBLEM_SIZE and
- # GET_STABLE_NUMBERS enabled!
- if( $VERBOSE ) { print "$MAKECMD -k $MAKEOPTS $PROGTESTOPTS report.nightly.csv.out TEST=nightly " .
- " LARGE_PROBLEM_SIZE=1 GET_STABLE_NUMBERS=1 > /dev/null 2>&1\n"; }
- system "$MAKECMD -k $MAKEOPTS $PROGTESTOPTS report.nightly.csv.out TEST=nightly " .
- " LARGE_PROBLEM_SIZE=1 GET_STABLE_NUMBERS=1 > /dev/null 2>&1";
- system "cp report.nightly.csv $OldenTestsLog";
- }
-}
-
-##############################################################
-#
-# Getting end timestamp
-#
-##############################################################
$endtime = `date "+20%y-%m-%d %H:%M:%S"`;
+# The last bit of logic is to remove the build and web dirs, after sending data
+# to the server.
##############################################################
#
-# Place all the logs neatly into one humungous file
+# Accumulate the information to send to the server.
#
##############################################################
if ( $VERBOSE ) { print "PREPARING LOGS TO BE SENT TO SERVER\n"; }
-$machine_data = "uname: ".`uname -a`.
+$machine_data = "uname: ".`uname -a`.
"hardware: ".`uname -m`.
"os: ".`uname -sr`.
"name: ".`uname -n`.
"date: ".`date \"+20%y-%m-%d\"`.
- "time: ".`date +\"%H:%M:%S\"`;
-
-my @CVS_DATA;
-my $cvs_data;
-@CVS_DATA = ReadFile "$CVSLog";
-$cvs_data = join("\n", @CVS_DATA);
-
-my @BUILD_DATA;
-my $build_data;
-@BUILD_DATA = ReadFile "$BuildLog";
-$build_data = join("\n", @BUILD_DATA);
-
-my @DEJAGNU_LOG;
-my @DEJAGNU_SUM;
-my $dejagnutests_log;
-my $dejagnutests_sum;
-@DEJAGNU_LOG = ReadFile "$DejagnuLog";
-@DEJAGNU_SUM = ReadFile "$DejagnuSum";
-$dejagnutests_log = join("\n", @DEJAGNU_LOG);
-$dejagnutests_sum = join("\n", @DEJAGNU_SUM);
-
-my @DEJAGNULOG_FULL;
-my $dejagnulog_full;
-@DEJAGNULOG_FULL = ReadFile "$DejagnuTestsLog";
-$dejagnulog_full = join("\n", @DEJAGNULOG_FULL);
-
-my $gcc_version_long="";
-if($GCCPATH ne ""){
+ "time: ".`date +\"%H:%M:%S\"`;
+
+# Get gcc version.
+my $gcc_version_long = "";
+if ($GCCPATH ne "") {
$gcc_version_long = `$GCCPATH/gcc --version`;
- print "$GCCPATH/gcc --version\n";
-}
-else{
+} elsif ($ENV{"CC"}) {
+ $gcc_version_long = `$ENV{"CC"} --version`;
+} else {
$gcc_version_long = `gcc --version`;
}
-@GCC_VERSION = split '\n', $gcc_version_long;
-my $gcc_version = $GCC_VERSION[0];
+my $gcc_version = (split '\n', $gcc_version_long)[0];
-my $all_tests = ReadFile, "$Prefix-Tests.txt";
-
-##############################################################
+# Get llvm-gcc target triple.
#
-# Send data via a post request
-#
-##############################################################
+# FIXME: This shouldn't be hardwired to llvm-gcc.
+my $llvmgcc_version_long = "";
+if ($LLVMGCCPATH ne "") {
+ $llvmgcc_version_long = `$LLVMGCCPATH/llvm-gcc -v 2>&1`;
+} else {
+ $llvmgcc_version_long = `llvm-gcc -v 2>&1`;
+}
+(split '\n', $llvmgcc_version_long)[1] =~ /Target: (.+)/;
+my $targetTriple = $1;
-if ( $VERBOSE ) { print "SEND THE DATA VIA THE POST REQUEST\n"; }
+# Logs.
+my ($ConfigureLogData, $BuildLogData, $CheckoutLogData) = "";
+if ($ConfigMode == 0) {
+ $ConfigureLogData = ReadFile $ConfigureLog;
+ $BuildLogData = ReadFile $BuildLog;
+ $CheckoutLogData = ReadFile $COLog;
+}
+# Checkout info.
+my $CheckoutTime_Wall = GetRegex "^real ([0-9.]+)", $CheckoutLogData;
+my $CheckoutTime_User = GetRegex "^user ([0-9.]+)", $CheckoutLogData;
+my $CheckoutTime_Sys = GetRegex "^sys ([0-9.]+)", $CheckoutLogData;
+my $CheckoutTime_CPU = $CVSCheckoutTime_User + $CVSCheckoutTime_Sys;
-my $host = "llvm.org";
-my $file = "/nightlytest/NightlyTestAccept.cgi";
-my %hash_of_data = ('machine_data' => $machine_data,
- 'build_data' => $build_data,
- 'gcc_version' => $gcc_version,
- 'nickname' => $nickname,
- 'dejagnutime_wall' => $DejagnuWallTime,
- 'dejagnutime_cpu' => $DejagnuTime,
- 'cvscheckouttime_wall' => $CVSCheckoutTime_Wall,
- 'cvscheckouttime_cpu' => $CVSCheckoutTime_CPU,
- 'configtime_wall' => $ConfigWallTime,
- 'configtime_cpu'=> $ConfigTime,
- 'buildtime_wall' => $BuildWallTime,
- 'buildtime_cpu' => $BuildTime,
- 'warnings' => $WarningsFile,
- 'cvsusercommitlist' => $UserCommitList,
- 'cvsuserupdatelist' => $UserUpdateList,
- 'cvsaddedfiles' => $CVSAddedFiles,
- 'cvsmodifiedfiles' => $CVSModifiedFiles,
- 'cvsremovedfiles' => $CVSRemovedFiles,
- 'lines_of_code' => $LOC,
- 'cvs_file_count' => $NumFilesInCVS,
- 'cvs_dir_count' => $NumDirsInCVS,
- 'buildstatus' => $BuildStatus,
- 'singlesource_programstable' => $SingleSourceProgramsTable,
- 'multisource_programstable' => $MultiSourceProgramsTable,
- 'externalsource_programstable' => $ExternalProgramsTable,
- 'llcbeta_options' => $multisource_llcbeta_options,
- 'warnings_removed' => $WarningsRemoved,
- 'warnings_added' => $WarningsAdded,
- 'passing_tests' => $passes,
- 'expfail_tests' => $xfails,
- 'unexpfail_tests' => $fails,
- 'all_tests' => $all_tests,
- 'new_tests' => "",
- 'removed_tests' => "",
- 'dejagnutests_log' => $dejagnutests_log,
- 'dejagnutests_sum' => $dejagnutests_sum,
- 'starttime' => $starttime,
- 'endtime' => $endtime,
- 'o_file_sizes' => $o_file_sizes,
- 'a_file_sizes' => $a_file_sizes);
-
-$TESTING = 0;
-
-if($TESTING){
- print "============================\n";
- foreach $x(keys %hash_of_data){
- print "$x => $hash_of_data{$x}\n";
- }
-}
-else{
- my $response = SendData $host,$file,\%hash_of_data;
- print "============================\n$response";
+# Configure info.
+my $ConfigTimeU = GetRegex "^user ([0-9.]+)", $ConfigureLogData;
+my $ConfigTimeS = GetRegex "^sys ([0-9.]+)", $ConfigureLogData;
+my $ConfigTime = $ConfigTimeU+$ConfigTimeS; # ConfigTime = User+System
+my $ConfigWallTime = GetRegex "^real ([0-9.]+)",$ConfigureLogData;
+$ConfigTime=-1 unless $ConfigTime;
+$ConfigWallTime=-1 unless $ConfigWallTime;
+
+# Build info.
+my $BuildTimeU = GetRegex "^user ([0-9.]+)", $BuildLogData;
+my $BuildTimeS = GetRegex "^sys ([0-9.]+)", $BuildLogData;
+my $BuildTime = $BuildTimeU+$BuildTimeS; # BuildTime = User+System
+my $BuildWallTime = GetRegex "^real ([0-9.]+)", $BuildLogData;
+$BuildTime=-1 unless $BuildTime;
+$BuildWallTime=-1 unless $BuildWallTime;
+
+if ( $VERBOSE ) { print "SEND THE DATA VIA THE POST REQUEST\n"; }
+
+my %hash_of_data = (
+ 'machine_data' => $machine_data,
+ 'build_data' => $ConfigureLogData . $BuildLogData,
+ 'gcc_version' => $gcc_version,
+ 'nickname' => $nickname,
+ 'dejagnutime_wall' => "0.0",
+ 'dejagnutime_cpu' => "0.0",
+ 'cvscheckouttime_wall' => $CheckoutTime_Wall,
+ 'cvscheckouttime_cpu' => $CheckoutTime_CPU,
+ 'configtime_wall' => $ConfigWallTime,
+ 'configtime_cpu'=> $ConfigTime,
+ 'buildtime_wall' => $BuildWallTime,
+ 'buildtime_cpu' => $BuildTime,
+ 'buildstatus' => $BuildStatus,
+ 'singlesource_programstable' => $SingleSourceProgramsTable,
+ 'multisource_programstable' => $MultiSourceProgramsTable,
+ 'externalsource_programstable' => $ExternalProgramsTable,
+ 'llcbeta_options' => $llcbeta_options,
+ 'passing_tests' => $passes,
+ 'expfail_tests' => $xfails,
+ 'unexpfail_tests' => $fails,
+ 'all_tests' => $all_tests,
+ 'dejagnutests_results' => "Dejagnu skipped by user choice.",
+ 'dejagnutests_log' => "",
+ 'starttime' => $starttime,
+ 'endtime' => $endtime,
+ 'target_triple' => $targetTriple,
+
+ # Unused, but left around for backwards compatability.
+ 'warnings' => "",
+ 'cvsusercommitlist' => "",
+ 'cvsuserupdatelist' => "",
+ 'cvsaddedfiles' => "",
+ 'cvsmodifiedfiles' => "",
+ 'cvsremovedfiles' => "",
+ 'lines_of_code' => "",
+ 'cvs_file_count' => 0,
+ 'cvs_dir_count' => 0,
+ 'warnings_removed' => "",
+ 'warnings_added' => "",
+ 'new_tests' => "",
+ 'removed_tests' => "",
+ 'o_file_sizes' => "",
+ 'a_file_sizes' => ""
+);
+
+if ($SUBMIT || !($SUBMITAUX eq "")) {
+ my $response = SendData $SUBMITSERVER,$SUBMITSCRIPT,\%hash_of_data;
+ if( $VERBOSE) { print "============================\n$response"; }
+} else {
+ print "============================\n";
+ foreach $x(keys %hash_of_data){
+ print "$x => $hash_of_data{$x}\n";
+ }
}
##############################################################
#
-# Remove the cvs tree...
+# Remove the source tree...
#
##############################################################
-system ( "$NICE rm -rf $BuildDir") if (!$NOCHECKOUT and !$NOREMOVE);
-system ( "$NICE rm -rf $WebDir") if (!$NOCHECKOUT and !$NOREMOVE and !$NOREMOVERESULTS);
-
-
+system ( "$NICE rm -rf $BuildDir")
+ if (!$NOCHECKOUT and !$NOREMOVE and !$NOREMOVEATEND);
+system ( "$NICE rm -rf $WebDir")
+ if (!$NOCHECKOUT and !$NOREMOVE and !$NOREMOVERESULTS);