diff --git a/testsuite/run-tests b/testsuite/run-tests
index 0982fd2d8b885b558378c93d2975263462e956ef..87a04a4624a8888607762b4f1c6353a2f5aca984 100755
--- a/testsuite/run-tests
+++ b/testsuite/run-tests
@@ -3,9 +3,23 @@
 failed=0
 all=0
 
+if [ -z "$srcdir" ] ; then
+  srcdir=`pwd`
+fi
+
+export srcdir
+
+find_program () {
+  if [ -x "$1" ] ; then
+    echo "./$1"
+  else
+    echo "$srcdir/$1"
+  fi
+}
+
 env_program () {
-  if [ -x ./"$1" ] ; then
-    if ./"$1"; then : ; else
+  if [ -x "$1" ] ; then
+    if "$1"; then : ; else
       echo FAIL: $1
       exit 1
     fi
@@ -13,8 +27,8 @@ env_program () {
 }
 
 test_program () {
-  testname=`echo "$1" | sed -e 's,-test$,,' -e 's,^\./,,'`
-  "./$1"
+  testname=`basename "$1" -test`
+  "$1"
   case "$?" in
       0)
     	echo PASS: $testname
@@ -31,12 +45,12 @@ test_program () {
   esac
 }
 
-env_program setup-env
+env_program `find_program setup-env`
 
 if [ $# -eq 0 ] ; then
-  for f in *-test; do test_program "$f"; done
+  for f in *-test; do test_program "./$f"; done
 else
-  for f in "$@" ; do test_program "$f"; done
+  for f in "$@" ; do test_program `find_program "$f"`; done
 fi
 
 if [ $failed -eq 0 ] ; then
@@ -49,7 +63,7 @@ echo "$dashes"
 echo "$banner"
 echo "$dashes"
 
-env_program teardown-env
+env_program `find_program teardown-env`
 
 [ "$failed" -eq 0 ]