# # $Id$ # # This script checkouts ACE from CVS, updates the "clone" directory, # compiles $ACE_ROOT/ace and $ACE_ROOT/tests and finally runs # $ACE_ROOT/tests/run_tests.sh. # # If it detects any problem it send email. # # DO NOT invoke this script from your crontab, use # auto_compile_wrapper for that. # # This script requires Perl5. # # TODO: Modify the script or split it in such a way that the main copy # can be obtained either using cvs or downloading the lastest beta # from the WWW. # eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' & eval 'exec perl -S $0 $argv:q' if 0; # The first three lines above let this script run without specifying the # full path to perl, as long as it is in the user's PATH. # Taken from perlrun man page. use File::Basename; use FileHandle; require POSIX; # This is the module we will checkout, someday someone could define a # smaller module. $MODULE='ACE_wrappers'; # This are the sub-directories (in the module) we really compile. @BUILD_LIST=('ace', 'tests'); # This are the pairs "sub-directory,script" we run. %RUN_LIST=('tests' => 'run_tests.sh'); # We obtain our revision to report errors in a "nice" manner. $REVISION='$Revision$'; # Find out the command name. $CMD = basename($0); # Extract configuration information from command line. # TODO: Some validation and checking should be done here. $CHECKOUT = $ARGV[0]; $BUILD = $ARGV[1]; $LOGDIR = $ARGV[2]; $ADMIN = $ARGV[3]; # When an error is found we try to die gracefully and send some email # to ADMIN. sub mydie { local $msg = shift; open(MAIL, "|mail $ADMIN") || die "cannot open email pipe on error: $msg\n"; print MAIL 'The following error is brought to you by: ', "\n"; print MAIL $CMD, ' [', $REVISION, "] for $BUILD on $CHECKOUT\n"; print MAIL "\n", $msg, "\n"; print MAIL "\nPlease check log files for more info\n"; close(MAIL) || die "cannot close email pipe on error: $msg\n"; print HIST 'FAILED', "\n"; exit 0; } ### MAIN FUNCTION $histfile = $LOGDIR . '/history'; open(HIST, '>>' . $histfile) # Do not use 'mydie' to report the problem, it tries to use HIST.... || die "cannot open history file \"$histfile\"\n"; $date = localtime; print HIST $CMD, ': running at ', $date, ' '; if (-f $LOGDIR . '/.disable') { print HIST 'DISABLED\n'; exit 0; } $LOGFILE = $LOGDIR . '/' . POSIX::strftime("%b%d_%Y.log", localtime); open(LOG, '>' . $LOGFILE) || mydie "cannot open log file"; LOG->autoflush (); # The following lines are useful when debugging the script or wrapper. # print LOG $CHECKOUT, " ", $BUILD, " ", $LOGDIR, " ", $ADMIN, "\n"; #while (($key,$value) = each %ENV) { # print LOG $key, " = ", $value, "\n"; #} chdir($CHECKOUT) || mydie "Cannot chdir to $CHECKOUT"; $date = localtime; print LOG "$CMD: starting checkout at ", $date, "\n"; open(CVS, "cvs checkout -P $MODULE 2>&1 |") || mydie "cannot start checkout of $MODULE"; $conflicts = 0; while () { if (m/^C /) { $conflicts = 1; } print LOG $_; } close(CVS) || mydie "error while checking out $MODULE"; $date = localtime; print LOG "$CMD: checkout finished at ", $date, "\n"; if ($conflicts != 0) { mydie "conflicts on checkout"; } chdir($MODULE) || mydie "cannot chdir to $MODULE"; $date = localtime; print LOG "$CMD: starting clone at ", $date, "\n"; open(MAKE, "bin/create_ace_build -a -v $BUILD 2>&1 |") || mydie "cannot clone directory"; while() { print LOG $_; } close(MAKE) || mydie "error while cloning ACE_ROOT"; $date = localtime; print LOG "$CMD: clone finished at ", $date, "\n"; chdir('build/' . $BUILD) || mydie "cannot chdir to $BUILD"; # This is needed for real make run.... $ENV{'ACE_ROOT'} = $CHECKOUT . '/' . $MODULE . '/build/' . $BUILD; foreach $i (@BUILD_LIST) { $date = localtime; print LOG "$CMD: make for $i started at ", $date, "\n"; open(MAKE, "make -k shared_libs_only=1 -C $i 2>&1 |") || mydie "cannot start make for $i"; $make_errors = 0; while () { if (m/^make: \*\*\*/) { $make_errors = 1; } print LOG $_; } close(MAKE) || mydie "errors while running make in $i"; $date = localtime; print LOG "$CMD: make for $i finished at ", $date, "\n"; if ($make_errors == 1) { mydie "errors detected in $i compilation"; } } while (($directory,$program) = each %RUN_LIST) { $date = localtime; print LOG "$CMD: running $program in $directory at ", $date, "\n"; chdir($directory) || mydie "cannot chdir to $directory"; open(RUN, "$program 2>&1 |") || mydie "cannot run $program"; $run_error = 0; while () { print LOG $_; if (m/^Error/ || m/FAILED/) { $run_error = 1; } } close(RUN) || mydie "cannot finish $program"; $date = localtime; print LOG "$CMD: $program finished ", $date, "\n"; if ($run_error != 0) { mydie "errors detected while running $program in $directory"; } } close(LOG) || mydie "cannot close LOGFILE"; print HIST "OK\n"; close(HIST) || mydie "cannot close history file";