There was a '???' comment in utils.exp:which, so I rewrote it to properly mimic the behaviour of the which(1) shell utility. A nice side effect of the new version is that, because the new proc normalises the filename when it's found, the GCC testsuite reports:
/home/bje/build/gcc/gcc/xg++ version 6.0.0 20160310 (experimental) (GCC) instead of: /home/bje/build/gcc/gcc/testsuite/g++/../../xg++ version 6.0.0 20160310 (experimental) (GCC) Here's the patch. Tested with `make check' and a GCC testsuite run. Any comments? Cheers, Ben 2016-03-22 Ben Elliston <b...@gnu.org> * lib/utils.exp (which): Reimplement to more closely mimic the behaviour of the UNIX which utility. * testsuite/runtest.all/utils.test: Test proc which. diff --git a/lib/utils.exp b/lib/utils.exp index e2a5040..c61785c 100644 --- a/lib/utils.exp +++ b/lib/utils.exp @@ -130,24 +130,34 @@ proc which { file } { # strip off any extraneous arguments (like flags to the compiler) set file [lindex $file 0] - # if it exists then the path must be OK - # ??? What if $file has no path and "." isn't in $PATH? - if {[file exists $file]} { - return $file + # if the filename has a path component, then the file must exist + if {[llength [file split $file]] > 1} { + verbose "Checking $file" 2 + if {[file exists $file] && \ + [file executable $file] && [file type $file] == "file"} { + verbose "file $file is executable and not a link" 2 + return [file normalize $file] + } else { + return 0 + } } + + # Otherwise the file must exist in the PATH if {[info exists env(PATH)]} { set path [split $env(PATH) ":"] } else { return 0 } - foreach i $path { - verbose "Checking against $i" 3 - if {[file exists [file join $i $file]]} { - if {[file executable [file join $i $file]]} { - return [file join $i $file] + foreach dir $path { + verbose "Checking $dir for $file" 3 + set filename [file join $dir $file] + if {[file exists $filename]} { + if {[file executable $filename] && [file type $filename] == "file"} { + verbose "file $filename is executable and not a link" 2 + return $filename } else { - warning "[file join $i $file] exists but is not an executable" + warning "file $filename exists but is not executable or is a link" } } } diff --git a/testsuite/runtest.all/utils.test b/testsuite/runtest.all/utils.test index c3e2f3c..de8c809 100644 --- a/testsuite/runtest.all/utils.test +++ b/testsuite/runtest.all/utils.test @@ -101,7 +101,30 @@ if [info exists env(TESTRUN)] { untested "unsetenv, unset an environment variable" } -# which file +# Test 'which' using a relative path. +# +if {[which ./config.status] != 0} { + pass "which, relative path to config.status" +} else { + fail "which, relative path to config.status" +} + +# Test 'which' using an absolute path. +# +if {[which [file join $objdir config.status]] != 0} { + pass "which, absolute path to config.status" +} else { + fail "which, absolute path to config.status" +} + +# Test 'which make'. +# +if {[which make] != 0} { + pass "which, make" +} else { + pass "which, make" +} + # grep args # diff file_1 file_2 # runtest_file_p
signature.asc
Description: Digital signature
_______________________________________________ DejaGnu mailing list DejaGnu@gnu.org https://lists.gnu.org/mailman/listinfo/dejagnu