Add a better PATH search to the tests.
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Tue, 7 May 2002 21:52:15 +0000 (21:52 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Tue, 7 May 2002 21:52:15 +0000 (21:52 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@367 fdb21ef1-2011-0410-befe-b5e4ea1792b1

23 files changed:
etc/TestCmd.py
test/DVIPDF.py
test/DVIPDFFLAGS.py
test/DVIPS.py
test/DVIPSFLAGS.py
test/F77.py
test/F77FLAGS.py
test/LATEX.py
test/LATEXFLAGS.py
test/LEX.py
test/LEXFLAGS.py
test/PDFLATEX.py
test/PDFLATEXFLAGS.py
test/PDFTEX.py
test/PDFTEXFLAGS.py
test/RANLIB.py
test/RANLIBFLAGS.py
test/SHF77.py
test/SHF77FLAGS.py
test/TEX.py
test/TEXFLAGS.py
test/YACC.py
test/YACCFLAGS.py

index 2d1c93257f98a672ae731ed4a574eca5b4f03aa7..06e324f7c7259ad28ae1e4c5f16413cf993b18b8 100644 (file)
@@ -41,23 +41,36 @@ or incorrect permissions).
 # AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 
-from string import join, split
-
 __author__ = "Steven Knight <knight@baldmt.com>"
 __revision__ = "TestCmd.py 0.D002 2001/08/31 14:56:12 software"
 __version__ = "0.02"
 
-from types import *
-
 import os
 import os.path
 import popen2
 import re
 import shutil
 import stat
+import string
 import sys
 import tempfile
 import traceback
+import types
+
+try:
+    from UserString import UserString
+except ImportError:
+    class UserString:
+        pass
+
+if hasattr(types, 'UnicodeType'):
+    def is_String(e):
+        return type(e) is types.StringType \
+            or type(e) is types.UnicodeType \
+            or isinstance(e, UserString)
+else:
+    def is_String(e):
+        return type(e) is types.StringType or isinstance(e, UserString)
 
 tempfile.template = 'testcmd.'
 
@@ -161,10 +174,10 @@ def pass_test(self = None, condition = 1, function = None):
 def match_exact(lines = None, matches = None):
     """
     """
-    if not type(lines) is ListType:
-       lines = split(lines, "\n")
-    if not type(matches) is ListType:
-       matches = split(matches, "\n")
+    if not type(lines) is types.ListType:
+       lines = string.split(lines, "\n")
+    if not type(matches) is types.ListType:
+       matches = string.split(matches, "\n")
     if len(lines) != len(matches):
        return
     for i in range(len(lines)):
@@ -175,10 +188,10 @@ def match_exact(lines = None, matches = None):
 def match_re(lines = None, res = None):
     """
     """
-    if not type(lines) is ListType:
-       lines = split(lines, "\n")
-    if not type(res) is ListType:
-       res = split(res, "\n")
+    if not type(lines) is types.ListType:
+       lines = string.split(lines, "\n")
+    if not type(res) is types.ListType:
+       res = string.split(res, "\n")
     if len(lines) != len(res):
        return
     for i in range(len(lines)):
@@ -190,12 +203,53 @@ def match_re_dotall(lines = None, res = None):
     """
     """
     if not type(lines) is type(""):
-        lines = join(lines, "\n")
+        lines = string.join(lines, "\n")
     if not type(res) is type(""):
-        res = join(res, "\n")
+        res = string.join(res, "\n")
     if re.compile("^" + res + "$", re.DOTALL).match(lines):
         return 1
 
+if sys.platform == 'win32':
+
+    def where_is(file, path=None, pathext=None):
+        if path is None:
+            path = os.environ['PATH']
+        if is_String(path):
+            path = string.split(path, os.pathsep)
+        if pathext is None:
+            pathext = os.environ['PATHEXT']
+        if is_String(pathext):
+            pathext = string.split(pathext, os.pathsep)
+        for ext in pathext:
+            if string.lower(ext) == string.lower(file[-len(ext):]):
+                pathext = ['']
+                break
+        for dir in path:
+            f = os.path.join(dir, file)
+            for ext in pathext:
+                fext = f + ext
+                if os.path.isfile(fext):
+                    return fext
+        return None
+
+else:
+
+    def where_is(file, path=None, pathext=None):
+        if path is None:
+            path = os.environ['PATH']
+        if is_String(path):
+            path = string.split(path, os.pathsep)
+        for dir in path:
+            f = os.path.join(dir, file)
+            if os.path.isfile(f):
+                try:
+                    st = os.stat(f)
+                except:
+                    continue
+                if stat.S_IMODE(st[stat.ST_MODE]) & 0111:
+                    return f
+        return None
+
 class TestCmd:
     """Class TestCmd
     """
@@ -372,7 +426,7 @@ class TestCmd:
        be specified; it must begin with an 'r'.  The default is
        'rb' (binary read).
        """
-       if type(file) is ListType:
+       if type(file) is types.ListType:
            file = apply(os.path.join, tuple(file))
        if not os.path.isabs(file):
            file = os.path.join(self.workdir, file)
@@ -416,7 +470,7 @@ class TestCmd:
        except AttributeError:
            (tochild, fromchild, childerr) = os.popen3(cmd)
            if stdin:
-               if type(stdin) is ListType:
+               if type(stdin) is types.ListType:
                    for line in stdin:
                        tochild.write(line)
                else:
@@ -432,7 +486,7 @@ class TestCmd:
            raise
        else:
            if stdin:
-               if type(stdin) is ListType:
+               if type(stdin) is types.ListType:
                    for line in stdin:
                        p.tochild.write(line)
                else:
@@ -487,7 +541,7 @@ class TestCmd:
        for sub in subdirs:
            if sub is None:
                continue
-           if type(sub) is ListType:
+           if type(sub) is types.ListType:
                sub = apply(os.path.join, tuple(sub))
            new = os.path.join(self.workdir, sub)
            try:
@@ -505,7 +559,7 @@ class TestCmd:
        assumed to be under the temporary working directory unless it
        is an absolute path name.
        """
-       if type(file) is ListType:
+       if type(file) is types.ListType:
            file = apply(os.path.join, tuple(file))
        if not os.path.isabs(file):
            file = os.path.join(self.workdir, file)
@@ -517,6 +571,15 @@ class TestCmd:
        """
        self.verbose = verbose
 
+    def where_is(self, file, path=None, pathext=None):
+        """Find an executable file.
+        """
+       if type(file) is types.ListType:
+           file = apply(os.path.join, tuple(file))
+       if not os.path.isabs(file):
+           file = where_is(file, path, pathext)
+        return file
+
     def workdir_set(self, path):
        """Creates a temporary working directory with the specified
        path name.  If the path is a null string (''), a unique
@@ -590,7 +653,7 @@ class TestCmd:
        exist.  The I/O mode for the file may be specified; it must
        begin with a 'w'.  The default is 'wb' (binary write).
        """
-       if type(file) is ListType:
+       if type(file) is types.ListType:
            file = apply(os.path.join, tuple(file))
        if not os.path.isabs(file):
            file = os.path.join(self.workdir, file)
index 69108e17ff0e015477b5f4e5230ba4696d607332..d22cfd8bc8c7913507fa38fb80fcdfa311c4a6a8 100644 (file)
@@ -32,11 +32,6 @@ import TestSCons
 
 python = sys.executable
 
-if sys.platform == 'win32':
-    _exe = '.exe'
-else:
-    _exe = ''
-
 test = TestSCons.TestSCons()
 
 
@@ -104,12 +99,7 @@ test.fail_test(test.read('test2.pdf') != "This is a .tex test.\n")
 
 
 
-dvipdf = None
-for dir in string.split(os.environ['PATH'], os.pathsep):
-    l = os.path.join(dir, 'dvipdf' + _exe)
-    if os.path.exists(l):
-        dvipdf = l
-        break
+dvipdf = test.where_is('dvipdf')
 
 if dvipdf:
 
index 6d653181c69e9c2b8a015f758906c8d3551357e8..e6f91463964684ce99b3901a027058dabb07a20a 100644 (file)
@@ -32,11 +32,6 @@ import TestSCons
 
 python = sys.executable
 
-if sys.platform == 'win32':
-    _exe = '.exe'
-else:
-    _exe = ''
-
 test = TestSCons.TestSCons()
 
 
@@ -110,12 +105,7 @@ test.fail_test(test.read('test2.pdf') != " -x\nThis is a .tex test.\n")
 
 
 
-dvipdf = None
-for dir in string.split(os.environ['PATH'], os.pathsep):
-    l = os.path.join(dir, 'dvipdf' + _exe)
-    if os.path.exists(l):
-        dvipdf = l
-        break
+dvipdf = test.where_is('dvipdf')
 
 if dvipdf:
 
index 91900be7be0b08a150c988c290f8e20fe56d3d92..b3bdebc31932d39fc413a2791c1528f96d91208b 100644 (file)
@@ -32,11 +32,6 @@ import TestSCons
 
 python = sys.executable
 
-if sys.platform == 'win32':
-    _exe = '.exe'
-else:
-    _exe = ''
-
 test = TestSCons.TestSCons()
 
 
@@ -119,12 +114,7 @@ test.fail_test(test.read('test4.ps') != "This is a .latex test.\n")
 
 
 
-dvips = None
-for dir in string.split(os.environ['PATH'], os.pathsep):
-    l = os.path.join(dir, 'dvips' + _exe)
-    if os.path.exists(l):
-        dvips = l
-        break
+dvips = test.where_is('dvips')
 
 if dvips:
 
index e043e755c3d87697cda26618e3323b687548f67a..664b532937b9e4bfc2372f5954970bb414635861 100644 (file)
@@ -32,11 +32,6 @@ import TestSCons
 
 python = sys.executable
 
-if sys.platform == 'win32':
-    _exe = '.exe'
-else:
-    _exe = ''
-
 test = TestSCons.TestSCons()
 
 
@@ -126,12 +121,7 @@ test.fail_test(test.read('test4.ps') != " -x\nThis is a .latex test.\n")
 
 
 
-dvips = None
-for dir in string.split(os.environ['PATH'], os.pathsep):
-    l = os.path.join(dir, 'dvips' + _exe)
-    if os.path.exists(l):
-        dvips = l
-        break
+dvips = test.where_is('dvips')
 
 if dvips:
 
index 964682d2949407507decd3ebfa27192fde3197ca..654849882a991c34dd8cfb029f3dcec0d13fa354 100644 (file)
@@ -167,12 +167,7 @@ test.fail_test(test.read('test6' + _exe) != "This is a .FPP file.\n")
 
 
 
-g77 = None
-for dir in string.split(os.environ['PATH'], os.pathsep):
-    g = os.path.join(dir, 'g77' + _exe)
-    if os.path.exists(g):
-        g77 = g
-        break
+g77 = test.where_is('g77')
 
 if g77:
 
index 5241e7b5f80b7b371b8852e93c2c0aedea09244b..e4d1f8cf43749968291cb259f86d69f8c925352a 100644 (file)
@@ -179,12 +179,7 @@ test.fail_test(test.read('test6' + _exe) != "%s\nThis is a .FPP file.\n" % o)
 
 
 
-g77 = None
-for dir in string.split(os.environ['PATH'], os.pathsep):
-    g = os.path.join(dir, 'g77' + _exe)
-    if os.path.exists(g):
-        g77 = g
-        break
+g77 = test.where_is('g77')
 
 if g77:
 
index 9ac74f53736f3bf30c87611ee9817bc1b87ea174..440054d26a3c0e2b87d46247212e2fbdd79eea92 100644 (file)
@@ -32,11 +32,6 @@ import TestSCons
 
 python = sys.executable
 
-if sys.platform == 'win32':
-    _exe = '.exe'
-else:
-    _exe = ''
-
 test = TestSCons.TestSCons()
 
 
@@ -75,12 +70,7 @@ test.fail_test(test.read('test2.dvi') != "This is a .latex test.\n")
 
 
 
-latex = None
-for dir in string.split(os.environ['PATH'], os.pathsep):
-    l = os.path.join(dir, 'latex' + _exe)
-    if os.path.exists(l):
-        latex = l
-        break
+latex = test.where_is('latex')
 
 if latex:
 
index c366c8a79fb8059039213467509488f9cfe12273..5ad4d9553741fa8d78b0acc9be4e86b5b3a5e3ee 100644 (file)
@@ -32,11 +32,6 @@ import TestSCons
 
 python = sys.executable
 
-if sys.platform == 'win32':
-    _exe = '.exe'
-else:
-    _exe = ''
-
 test = TestSCons.TestSCons()
 
 
@@ -81,12 +76,7 @@ test.fail_test(test.read('test2.dvi') != " -t\nThis is a .latex test.\n")
 
 
 
-latex = None
-for dir in string.split(os.environ['PATH'], os.pathsep):
-    l = os.path.join(dir, 'latex' + _exe)
-    if os.path.exists(l):
-        latex = l
-        break
+latex = test.where_is('latex')
 
 if latex:
 
index 59a887d16f7fd1195b15e2d47f6d3c1d7b5ba623..88c0a2deabf882b27a0fdf65e853aedb348bce42 100644 (file)
@@ -74,12 +74,7 @@ test.run(program = test.workpath('aaa' + _exe), stdout = "mylex.py\naaa.l\n")
 
 
 
-lex = None
-for dir in string.split(os.environ['PATH'], os.pathsep):
-    l = os.path.join(dir, 'lex' + _exe)
-    if os.path.exists(l):
-        lex = l
-        break
+lex = test.where_is('lex')
 
 if lex:
 
index b415495235140d1eb6b72efe82beac398f708825..e807774c2f4f7851f3736a99a30a33f7bbacb186 100644 (file)
@@ -77,12 +77,7 @@ test.run(program = test.workpath('aaa' + _exe), stdout = " -x -t\naaa.l\n")
 
 
 
-lex = None
-for dir in string.split(os.environ['PATH'], os.pathsep):
-    l = os.path.join(dir, 'lex' + _exe)
-    if os.path.exists(l):
-        lex = l
-        break
+lex = test.where_is('lex')
 
 if lex:
 
index a64f15812010a00ead4fa2f11bfb3db61d33baf4..f665d0f8ae6fdef7d4955468e2b6e35ab5667a2a 100644 (file)
@@ -32,11 +32,6 @@ import TestSCons
 
 python = sys.executable
 
-if sys.platform == 'win32':
-    _exe = '.exe'
-else:
-    _exe = ''
-
 test = TestSCons.TestSCons()
 
 
@@ -75,12 +70,7 @@ test.fail_test(not os.path.exists(test.workpath('test2.pdf')))
 
 
 
-pdflatex = None
-for dir in string.split(os.environ['PATH'], os.pathsep):
-    l = os.path.join(dir, 'pdflatex' + _exe)
-    if os.path.exists(l):
-        pdflatex = l
-        break
+pdflatex = test.where_is('pdflatex')
 
 if pdflatex:
 
index 1693b567520423ed21cde8a7d8dcf27691ecd079..6ddd41a73b74d551d17b9f0ce4e8643e018da6ce 100644 (file)
@@ -32,11 +32,6 @@ import TestSCons
 
 python = sys.executable
 
-if sys.platform == 'win32':
-    _exe = '.exe'
-else:
-    _exe = ''
-
 test = TestSCons.TestSCons()
 
 
@@ -81,12 +76,7 @@ test.fail_test(not os.path.exists(test.workpath('test2.pdf')))
 
 
 
-pdflatex = None
-for dir in string.split(os.environ['PATH'], os.pathsep):
-    l = os.path.join(dir, 'pdflatex' + _exe)
-    if os.path.exists(l):
-        pdflatex = l
-        break
+pdflatex = test.where_is('pdflatex')
 
 if pdflatex:
 
index 41024c4ffe17269dc978a5264a36fdba23a286c0..4fe534160ca82a6ec3f996887976c8c9081fd616 100644 (file)
@@ -32,11 +32,6 @@ import TestSCons
 
 python = sys.executable
 
-if sys.platform == 'win32':
-    _exe = '.exe'
-else:
-    _exe = ''
-
 test = TestSCons.TestSCons()
 
 
@@ -68,12 +63,7 @@ test.fail_test(not os.path.exists(test.workpath('test.pdf')))
 
 
 
-pdftex = None
-for dir in string.split(os.environ['PATH'], os.pathsep):
-    t = os.path.join(dir, 'pdftex' + _exe)
-    if os.path.exists(t):
-        pdftex = t
-        break
+pdftex = test.where_is('pdftex')
 
 if pdftex:
 
index 59d67befdfccc1e8366f6fdff08c384b132ac24e..aa5cc9f2cb3e07a4282e4cc0c8901e794e858884 100644 (file)
@@ -32,11 +32,6 @@ import TestSCons
 
 python = sys.executable
 
-if sys.platform == 'win32':
-    _exe = '.exe'
-else:
-    _exe = ''
-
 test = TestSCons.TestSCons()
 
 
@@ -74,12 +69,7 @@ test.fail_test(not os.path.exists(test.workpath('test.pdf')))
 
 
 
-pdftex = None
-for dir in string.split(os.environ['PATH'], os.pathsep):
-    t = os.path.join(dir, 'pdftex' + _exe)
-    if os.path.exists(t):
-        pdftex = t
-        break
+pdftex = test.where_is('pdftex')
 
 if pdftex:
 
index 12ae2128b0ad6c4055abe7a188790b09c9714721..14708e01ee03059e0cab572ee255e2ba387bc3b6 100644 (file)
@@ -37,15 +37,10 @@ if sys.platform == 'win32':
 else:
     _exe = ''
 
-ranlib = None
-for dir in string.split(os.environ['PATH'], os.pathsep):
-    r = os.path.join(dir, 'ranlib' + _exe)
-    if os.path.exists(r):
-        ranlib = r
-        break
-
 test = TestSCons.TestSCons()
 
+ranlib = test.where_is('ranlib')
+
 test.no_result(not ranlib)
 
 test.write("wrapper.py",
index 752f68574093d4cbaa16164b9ca2eee0fcd5c41b..b3e94510d917552ed0129dc6c485c1b8c56c384c 100644 (file)
@@ -36,15 +36,10 @@ if sys.platform == 'win32':
 else:
     _exe = ''
 
-ranlib = None
-for dir in string.split(os.environ['PATH'], os.pathsep):
-    r = os.path.join(dir, 'ranlib' + _exe)
-    if os.path.exists(r):
-        ranlib = r
-        break
-
 test = TestSCons.TestSCons()
 
+ranlib = test.where_is('ranlib')
+
 test.no_result(not ranlib)
 
 test.write("wrapper.py",
index 43c6485864139e0e5a0b4dcaaf017392eb247976..cffd94d14382a33702d64576439c44e913d5c606 100644 (file)
@@ -169,12 +169,7 @@ test.fail_test(test.read('test6' + _exe) != "This is a .FPP file.\n")
 
 
 
-g77 = None
-for dir in string.split(os.environ['PATH'], os.pathsep):
-    g = os.path.join(dir, 'g77' + _exe)
-    if os.path.exists(g):
-        g77 = g
-        break
+g77 = test.where_is('g77')
 
 if g77:
 
index cb1e6f688abc16775eb1c59172148f4f69f10bd9..231fea260fadc5731c8cdcc28222a05e59e4fd07 100644 (file)
@@ -185,12 +185,7 @@ test.fail_test(test.read('test6' + _exe) != "%s\nThis is a .FPP file.\n" % o)
 
 
 
-g77 = None
-for dir in string.split(os.environ['PATH'], os.pathsep):
-    g = os.path.join(dir, 'g77' + _exe)
-    if os.path.exists(g):
-        g77 = g
-        break
+g77 = test.where_is('g77')
 
 if g77:
 
index 9b442c97ba1d7d2c0c0d782067d22bf3e8da9f67..bcdd62e0181b9e2e69c4a3945703f7312f5a5d2a 100644 (file)
@@ -32,11 +32,6 @@ import TestSCons
 
 python = sys.executable
 
-if sys.platform == 'win32':
-    _exe = '.exe'
-else:
-    _exe = ''
-
 test = TestSCons.TestSCons()
 
 
@@ -68,12 +63,7 @@ test.fail_test(test.read('test.dvi') != "This is a test.\n")
 
 
 
-tex = None
-for dir in string.split(os.environ['PATH'], os.pathsep):
-    t = os.path.join(dir, 'tex' + _exe)
-    if os.path.exists(t):
-        tex = t
-        break
+tex = test.where_is('tex')
 
 if tex:
 
index 4cc08d3ec25fac245fda26ef0971e87d41375751..1f7121f4a25dda5820207bdb71ebfe1faecd9701 100644 (file)
@@ -32,11 +32,6 @@ import TestSCons
 
 python = sys.executable
 
-if sys.platform == 'win32':
-    _exe = '.exe'
-else:
-    _exe = ''
-
 test = TestSCons.TestSCons()
 
 
@@ -74,12 +69,7 @@ test.fail_test(test.read('test.dvi') != " -x\nThis is a test.\n")
 
 
 
-tex = None
-for dir in string.split(os.environ['PATH'], os.pathsep):
-    t = os.path.join(dir, 'tex' + _exe)
-    if os.path.exists(t):
-        tex = t
-        break
+tex = test.where_is('tex')
 
 if tex:
 
index 8fea904d4b5273a7754e6c0726b86c9c0482f4bc..2868085ecc594c7a84c3adc68c88b07fcb8c53de 100644 (file)
@@ -80,12 +80,7 @@ test.run(program = test.workpath('aaa' + _exe), stdout = "myyacc.py\naaa.y\n")
 
 
 
-yacc = None
-for dir in string.split(os.environ['PATH'], os.pathsep):
-    y = os.path.join(dir, 'yacc' + _exe)
-    if os.path.exists(y):
-        yacc = y
-        break
+yacc = test.where_is('yacc')
 
 if yacc:
 
index 10c29ca0536350961fd30c3f5093de283d521d04..288696ba2f14513c23d697a1eb0e451522e77cec 100644 (file)
@@ -80,12 +80,7 @@ test.run(program = test.workpath('aaa' + _exe), stdout = " -x\naaa.y\n")
 
 
 
-yacc = None
-for dir in string.split(os.environ['PATH'], os.pathsep):
-    y = os.path.join(dir, 'yacc' + _exe)
-    if os.path.exists(y):
-        yacc = y
-        break
+yacc = test.where_is('yacc')
 
 if yacc: