# This script runs one abinis built-in test in background mode while # periodically displaying the status file till the end of the process. # Copyright (C) 1999-2006 ABINIT group (LSi,XG) # This file is distributed under the terms of the # GNU General Public License, see ~ABINIT/Infos/copyright # or http://www.gnu.org/copyleft/gpl.txt . # For the initials of contributors, see ~ABINIT/Infos/contributors . # # Usage : # This script is intended to be called from Makefile (unix) or make.bat # (DOS/Windows). Execute "make help" for details. It can also be called # directly: # unix shell: run-basic-tests machine_name [ 1 | 2 | 3 | 4 | 5 | 6] srcDir # Windows DOS box: perl run-basic-tests.pl machine_name [ 1 | 2 | 3 | 4 | 5 | 6] srcDir # MacOS (likely...) : perl -f run-basic-tests.pl machine_name [ 1 | 2 | 3 | 4 | 5 | 6] srcDir # $, = ' '; # set output field separator $\ = "\n"; # set output record separator # $DELAY = 3; # delay in seconds between 2 verifications of the STATUS file $MAXLOOP = '50'; # maximum count for STATUS file checking loop %PspFiles=('1','01h.pspgth', '2','14si.pspgth', '3','01h.pspgth:04be.pspgth', '4','70yb.pspnc', '5','13al.pspgth', '6','14si.xml'); # $debug = 0; # Debug level ??? if ($ARGV[1] eq '') { print 'Missing argument'; print "Usage is: run-basic-tests machine_name [ 1 | 2 | 3 | 4 | 5 | 6] srcDir"; exit 16; } $MACH = $ARGV[0]; $TestN = $ARGV[1]; $srcDir = $ARGV[2]; $TMPfile = 'Test_in.tmp'; # multi usage temporary file $UNIXSLASH = '/'; # unix subdirectory delimitor in file paths (octal 057) $DOSSLASH = '\\'; # subdirectory delimitor in DOS file paths (\ escaped) $MACSLASH = ':'; # subdirectory delimitor in MAC file paths $MULTI = '*'; # fetch some environment variables and try unix 'uname' command (Bourne shell) $OSname = $ENV{'OS'}; # OS name on Windows systems $OStype = $ENV{'OSTYPE'}; # defined on some systems as OPENVMS, mingw/msys # Use internal variable of Perl $^O if ($^O eq 'MacOS') { $OStype = 'MacOS'; $rc = 0; $MULTI = "\xc5"; } elsif ($OStype ne 'OPENVMS') { $unamerc = open(IP,"uname -a |"); $_ = ; chop $_; ($UNkernel,$wd2,$wd3,$wd4,$wd5,$wd6,$wd7,$wd8,$wd9) = split(' ',$_); close IP; } print "uname: =$OSname=$OStype=$UNkernel=$unamerc= " if ($debug >= 1); # Check for Windows 2000/XP (DOS box, cygwin, mingw, PGI Workstation, ...) # cygwin, mingw, PGI Workstation are unix bash shells. However, older versions # of the latter behave as a DOS one on some aspects if ($OSname eq 'Windows_NT') { # check Windows environmental variable # When 'uname' command is unknown, the return code is undetermined. # drop version code from kernel name $UNkernel =~ m/(.*)(-)([0-9]+\.[0-9]+)/; $UNkernel = $1 if ($& ne ''); if ($OStype eq '' && $UNkernel eq '') { $OStype = 'DOS'; # set OStype # since unlink fails on some versions of perl for DOS, let's use del $SLASH = $DOSSLASH; # subdirectory delimitor for file paths $COPY_COMMAND = 'copy'; # DOS copy file command $ERASE_COMMAND = 'del /q'; # DOS delete file command $TYPE_COMMAND = 'type'; # DOS type file command # Define the DOS conventions to call the dotest perl script by means of the # "system" function # NOTE: perl.exe is a DOS module that MUST be accessible through the DOS PATH $SUFXstyle = 'DOS'; # use DOS-style suffixes for binaries $PLSUFX = '.pl'; # DOS suffix for perl script $PRLPFX = 'start /min perl '; # DOS command for background $BGSUFX = ''; # no special DOS suffix for new task $ENDtest = $MAXLOOP; # loop limit in case dotest fails early print "File test$TestN.end will be checked to test end of abinis execution"; print "The wait loop of this script is limited to $ENDtest cycles"; } elsif ( $UNkernel eq 'CYGWIN_NT' || $UNkernel eq 'MINGW32_NT' ) { # unix-like environment under Windows $OStype = $UNkernel; # set OStype for cygwin/mingw # subdirectory delimitor for file paths is DOS \ under cygwin and standard / # under other unices $SLASH = $UNkernel eq 'CYGWIN_NT' ? $DOSSLASH : $UNIXSLASH; $COPY_COMMAND = 'cp -p'; # unix copy file command $ERASE_COMMAND = 'rm -f'; # unix delete file command $TYPE_COMMAND = 'cat'; # unix type file command $SUFXstyle = 'unix'; # use unix-style suffixes for binaries,. $PLSUFX = '.pl'; # no special suffix for perl script under unix $PRLPFX = 'perl '; # perl path ??? should use $(PERL) $BGSUFX = '&'; # special suffix for background task $ENDtest = 'ps'; # use unix ps command to check end of test } else { print "unrecognized Windows Subsystem =$OStype=$UNkernel="; exit (99); } } # if not Windows NT check other environment variables and uname output elsif ($OStype eq 'OPENVMS') { $SLASH = $UNIXSLASH; # subdirectory delimitor in file paths $COPY_COMMAND = 'copy'; # OpenVMS copy file command $ERASE_COMMAND = 'delete '; # OpenVMS delete file command $TYPE_COMMAND = 'type '; # OpenVMS type file command # for perl under normal unix systems: $SUFXstyle = 'vms'; # use unix-style suffixes for binaries, ... $PLSUFX = '.pl'; # no special suffix for perl script under unix $PRLPFX = 'perl '; # perl path defined in first line of script $BGSUFX = ''; # special suffix for background task $ENDtest = 'vms'; # use gnv ps command to check end of test } # MacOS section elsif ($OStype eq 'MacOS') { $SLASH = $MACSLASH; # subdirectory delimitor in file paths $COPY_COMMAND = 'Duplicate -c'; # copy file command $ERASE_COMMAND = 'Delete -y'; # delete file command $SUFXstyle = $OStype; # use unix commands but MAC-style suffixes $PLSUFX = '.pl'; # suffix for perl script } # normal unix/linux section elsif ($OSname eq '' && $UNkernel ne '') { $OStype = $UNkernel; # set OStype for *ux $SLASH = $UNIXSLASH; # subdirectory delimitor in file paths $COPY_COMMAND = '\cp '; # copy file command $ERASE_COMMAND = '\rm -f'; # unix delete file command $TYPE_COMMAND = 'cat'; # unix type file command # for perl under normal unix systems: $SUFXstyle = 'unix'; # use unix-style suffixes for binaries, ... $PLSUFX = '.pl'; # XG060708 : .pl is needed ... ?? no special suffix for perl script under unix $PRLPFX = 'perl ' ; # XG060708 : perl is needed ... ?? perl path defined in first line of script $BGSUFX = '&'; # special suffix for background task $ENDtest = 'ps'; # use unix ps command to check end of test } else { print "unrecognized Operating System -$OSname=$OStype=$UNkernel-"; exit (99); } # make sure "files" file exist $inputfile = &transpath("$srcDir/tests/built-in/Input/test$TestN.in"); print "$OStype $SLASH $SUFXstyle $inputfile" if ($debug >=2); if (! -e &transpath("$inputfile") ) { print "Invalid test number: $TestN"; print "Expected input file $inputfile not found"; print "Usage is: run-basic-tests machine_name [ 1 | 2 | 3 | 4 | 5 | 6 ] srcDir "; exit (8); } # print "Built-in test $TestN will be run through run-basic-dotest$PLSUFX script" if ($debug >= 1); # set a date flag to make a new directory today # ($sec,$min,$hour,$mday,$ymon,$yyear,$wday,$yday,$isdst)=localtime(time); $ymon++; # ymon was 0-11 $yyear +=1900; # yyear was relative to 1900 $YYYYMMDD = sprintf("%4.4d",$yyear).sprintf("%2.2d",$ymon).sprintf("%2.2d",$mday); $WORK_DIR = 'built-in'; if (! -e $WORK_DIR || ! -d $WORK_DIR) { mkdir ($WORK_DIR,0755); # Mode 0755 ignored under DOS-Windows } else { print "Do not create directory, $WORK_DIR already exists" if ($debug >= 1); } print ('cd built-in') if ($debug >= 1); chdir ('built-in'); $WORK_DIR = ',,'.$MACH.'_'.$OStype.'_'.$YYYYMMDD; if (! -e $WORK_DIR || ! -d $WORK_DIR) { mkdir ($WORK_DIR,0755); # Mode 0755 ignored under DOS-Windows } else { print "Do not create directory, $WORK_DIR already exists" if ($debug >= 1); } print "cd $WORK_DIR" if ($debug >= 1); chdir ("$WORK_DIR"); # suppress old files unlink("test$TestN.end") if (-e "test$TestN.end"); unlink("test$TestN.log") if (-e "test$TestN.log"); unlink("test$TestN.out") if (-e "test$TestN.out"); unlink("test$TestN".'.o_WFK') if (-e "test$TestN".'.o_WFK'); if ($OStype eq 'OPENVMS') { $statfile = "test$TestN".'_STATUS.dat'; # name of STATUS file } else { $statfile = "test$TestN".'_STATUS'; # name of STATUS file } unlink($statfile) if (-e $statfile); # Write abinit.files for test system("$COPY_COMMAND ".&transpath("$srcDir/tests/built-in/Input/test$TestN.in")." test$TestN.in"); $rc = open (FILES,">test$TestN.files"); print FILES "test$TestN.in"; print FILES "test$TestN.out"; print FILES "test$TestN".'i'; print FILES "test$TestN".'o'; print FILES "test$TestN"; @PsP = split(':', $PspFiles{"$TestN"} ); print "Psp files: @PsP" if ($debug >=1); print FILES &transpath("$srcDir/tests/Psps_for_tests/$PsP[0]"); print FILES &transpath("$srcDir/tests/Psps_for_tests/$PsP[1]") if ($PsP[1] ne ''); close (FILES); # abinis will be started through a dotest perl script # this is necessary under DOS/Windows because of file redirections $cmd = $PRLPFX.&transpath("$srcDir/tests/Scripts/run-basic-dotest$PLSUFX")." $TestN $ENDtest $SLASH $SUFXstyle $BGSUFX"; print $cmd if ($debug >= 2); $rc = system($cmd); die "Error $rc starting run-basic-dotest" if ($rc != 0); # loop waiting end of abinis execution while (1) { sleep($DELAY); # take a few seconds rest if ($ENDtest eq 'ps') { # check abinis process using unix ps $cmd = 'ps | grep abinis | grep -v grep > '.$TMPfile; print $cmd if ($debug >= 2); $rc = system($cmd); last if (-z $TMPfile); # no abinis process was found } elsif ($ENDtest eq 'vms') { # always end for VMS last; } else { # check presence of file "test$Test0N.end" (like test1.end) last if (-e "test$TestN.end"); # dotest has completed $ENDtest --; # decrement loop counter if ($ENDtest <= 0) { print 'Wait loop limit reached, run-basic-dotest not yet finished'; exit; # loop limit reached } } $cmd = "$TYPE_COMMAND $statfile"; system($cmd) if (-e $statfile); # type status file if it exists } # $cmd = "$TYPE_COMMAND $statfile"; system($cmd) if (-e $statfile); # type status file if it exists unlink ("$TMPfile") if (-e $TMPfile); exit (0); # **************************************** sub transpath { local($path) = @_; # # purpose: translate unix-like path of file to DOS-like according to $SLASH # argument: # $path = path to be translated # output: this subroutine acts as a function and returns the path # according to host conventions $path =~ tr/\057/\\/ if ($SLASH eq '\\'); if ($OStype eq 'MacOS') { $path =~ tr/\057/:/; $path =~ s/\.\.//g; $path =~ s/:/::/ ; } return $path; }