# # Expect script for Chill Regression Tests # Copyright (C) 1993, 1996, 1997 Free Software Foundation # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # Written by Jeffrey Wheat (cassidy@cygnus.com) # # # chill support library procedures and testsuite specific instructions # # # default_chill_version # extract and print the version number of the chill compiler # exits if compiler does not exist # proc default_chill_version { } { global GCC_UNDER_TEST # ignore any arguments after the command set compiler [lindex $GCC_UNDER_TEST 0] # verify that the compiler exists if {[which $compiler] != 0} then { set tmp [ exec $compiler -v ] regexp "version.*$" $tmp version if [info exists version] then { clone_output "[which $compiler] $version\n" } } else { warning "$compiler does not exist" exit -1 } } # # chill_compile # compile the specified file # # returns values: # return 0 on success # return 1 on failure with $result containing compiler output # exit with -1 if compiler doesn't exist # # verbosity output: # 1 - indicate compile in progress # 2 - indicate compile, target name # 3 - indicate compile, target name, exec command, and result # proc chill_compile { src obj } { global GCC_UNDER_TEST global CFLAGS global errno global result global verbose global subdir global tmpdir set errno 0 set cflags $CFLAGS set dumpfile [file rootname $obj].cmp ;# name of file to dump stderr in # verify that the compiler exists if { [which $GCC_UNDER_TEST] == 0 } then { warning "$GCC_UNDER_TEST does not exist" exit -1 } if { $verbose == 1 } then { send_user "Compiling... " } else { verbose " - CMPL: Compiling [file tail $src]" 2 } # if object type is a grt file, then only build a grant file if [string match "*.grt" $obj] then { set cflags [concat $cflags -fgrant-only] } # build command line set commandline "$GCC_UNDER_TEST $cflags -I$subdir -c $src" # write command line to logfile send_log "\n### EXEC: $commandline\n" # tell us whats going on if verbose verbose "### EXEC: $commandline" 3 # exec the compiler with the appropriate flags set errno [catch "exec $commandline" result] # dump compiler's stderr output into $dumpfile - this is a gross hack set dumpfile [open $dumpfile w+]; puts $dumpfile $result; close $dumpfile # log any compiler output unless its null if ![string match "" $result] then { send_log "\n$result\n" } unset cflags return } # # chill_link # link the specified files # # returns values: # return 0 on success # return 1 on failure with $result containing compiler output # exit with -1 if compiler doesn't exist # # verbosity output: # 1 - indicate linking in progress # 2 - indicate linking, target name # 3 - indicate linking, target name, exec command, and result # proc chill_link { target } { global GCC_UNDER_TEST global CFLAGS global errno global result global verbose global tmptarget global crt0 global libs global objs set errno 0 # verify that the compiler exists if { [which $GCC_UNDER_TEST] == 0 } then { warning "$GCC_UNDER_TEST does not exist" exit -1 } if { $verbose == 1 } then { send_user "Linking... " } else { verbose " - LINK: Linking [file tail $target]" 2 } # verify that the object exists if ![file exists $target.o] then { set errno 1 set result "file $target.o doesn't exist" return } # build command line set commandline "$GCC_UNDER_TEST $CFLAGS -o $target $target.o $objs $crt0 $libs" # write command line to logfile send_log "\n### EXEC: $commandline\n" # tell us whats going on if we are verbose verbose "### EXEC: $commandline" 3 # link the objects, sending any linker output to $result set errno [catch "exec $commandline > $tmptarget.lnk" result] # log any linker output unless its null if ![string match "" $result] then { send_log "\n$result\n" } return } # # default_chill_start # proc default_chill_start { } { global srcdir global subdir global tmpdir global verbose if { $verbose > 1 } then { send_user "Configuring testsuite... " } # tmpdir is obtained from $objdir/site.exp. if not, set it to /tmp if ![info exists tmpdir] then { set tmpdir /tmp } # save and convert $srcdir to an absolute pathname, stomp on the old value # stomp on $subdir and set to the absolute path to the subdirectory global osrcdir; set osrcdir $srcdir; set srcdir [cd $srcdir; pwd] global osubdir; set osubdir $subdir; set subdir $srcdir/$subdir # cd the temporary directory, $tmpdir cd $tmpdir; verbose "### PWD: [pwd]" 5 # copy init files to the tmpdir foreach initfile [glob -nocomplain $subdir/*.init] { set targfile $tmpdir/[file tail [file rootname $initfile]] verbose "### EXEC: cp $initfile $targfile" 5 if [catch "exec cp $initfile $targfile"] then { send_user "\nConfigure failed.\n" exit -1 } } if { $verbose > 1 } then { send_user "Configuring finished.\n" } } # # default_chill_exit # # proc default_chill_exit { } { global srcdir global objdir global tmpdir global osrcdir global osubdir # reset directory variables set srcdir $osrcdir; set subdir $osubdir # remove all generated targets and objects verbose "### EXEC: rm -f $tmpdir/*" 3 catch "exec rm -f $tmpdir/*" result # change back to the main object directory cd $objdir verbose "### SANITY: [pwd]" 5 } # # chill_diff # compare two files line-by-line # # returns values: # return 0 on success # return 1 if different # return -1 if output file doesn't exist # # verbosity output: # 1 - indicate diffing in progress # 2 - indicate diffing, target names # 3 - indicate diffing, target names, and result # proc chill_diff { file_1 file_2 } { global errno global result global target global tmptarget global verbose set eof -1 set errno 0 set differences 0 if { $verbose == 1 } then { send_user "Diffing... " } else { verbose " - DIFF: Diffing [file tail $file_1] [file tail $file_2]" 2 } # write command line to logfile send_log "### EXEC: diff $file_1 $file_2\n" # tell us whats going on if we are verbose verbose "### EXEC: diff $file_1 $file_2" 3 # verify file exists and open it if [file exists $file_1] then { set file_a [open $file_1 r] } else { set errno -1; set result "$file_1 doesn't exist" return } # verify file exists and is not zero length, and then open it if [file exists $file_2] then { if [file size $file_2]!=0 then { set file_b [open $file_2 r] } else { set errno -1; set result "$file_2 is zero bytes"; return } } else { set errno -1; set result "$file_2 doesn't exist"; return } # spoof the diff routine lappend list_a $target while { [gets $file_a line] != $eof } { if [regexp "^#.*$" $line] then { continue } else { lappend list_a $line } } close $file_a # spoof the diff routine lappend list_b $target while { [gets $file_b line] != $eof } { if [regexp "^#.*$" $line] then { continue } else { # use [file tail $line] to strip off pathname lappend list_b [file tail $line] } } close $file_b for { set i 0 } { $i < [llength $list_a] } { incr i } { set line_a [lindex $list_a $i] set line_b [lindex $list_b $i] if [string compare $line_a $line_b] then { set errno 1 set count [expr $i+1] set linenum [format %dc%d $count $count] verbose "$linenum" 3 verbose "< $line_a" 3 verbose "---" 3 verbose "> $line_b" 3 send_log "$file_1: < $count: $line_a\n" send_log "$file_2: > $count: $line_b\n" set result "differences found" } } return } # # chill_fail # a wrapper around the framework fail proc # proc chill_fail { target result } { global verbose if { $verbose == 1 } then { send_user "\n" } fail $target verbose "--------------------------------------------------" 3 verbose "### RESULT: $result" 3 } # # chill_pass # a wrapper around the framework fail proc # proc chill_pass { target } { global verbose if { $verbose == 1 } then { send_user "\n" } pass $target }