Refactor SCons.Util.Detect() into an Environment method.
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Thu, 5 Sep 2002 15:33:09 +0000 (15:33 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Thu, 5 Sep 2002 15:33:09 +0000 (15:33 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@458 fdb21ef1-2011-0410-befe-b5e4ea1792b1

27 files changed:
src/engine/SCons/Environment.py
src/engine/SCons/EnvironmentTests.py
src/engine/SCons/Tool/ToolTests.py
src/engine/SCons/Tool/ar.py
src/engine/SCons/Tool/dvipdf.py
src/engine/SCons/Tool/dvips.py
src/engine/SCons/Tool/g++.py
src/engine/SCons/Tool/g77.py
src/engine/SCons/Tool/gas.py
src/engine/SCons/Tool/gcc.py
src/engine/SCons/Tool/gnulink.py
src/engine/SCons/Tool/icc.py
src/engine/SCons/Tool/ifl.py
src/engine/SCons/Tool/ilink.py
src/engine/SCons/Tool/latex.py
src/engine/SCons/Tool/lex.py
src/engine/SCons/Tool/lib.py
src/engine/SCons/Tool/masm.py
src/engine/SCons/Tool/mslink.py
src/engine/SCons/Tool/msvc.py
src/engine/SCons/Tool/nasm.py
src/engine/SCons/Tool/pdflatex.py
src/engine/SCons/Tool/pdftex.py
src/engine/SCons/Tool/tar.py
src/engine/SCons/Tool/tex.py
src/engine/SCons/Tool/yacc.py
src/engine/SCons/Util.py

index 6566427bb33261682f71ae6a94a72d9a95a4fd24..cd7aced3dc5623f91b7489973554fa4ec24475ff 100644 (file)
@@ -440,6 +440,23 @@ class Environment:
         except KeyError:
             return None
 
+    def Detect(self, progs):
+        """Return the first available program in progs.
+        """
+        path = None
+        pathext = None
+        if self.has_key('ENV'):
+            if self['ENV'].has_key('PATH'):
+                path = self['ENV']['PATH']
+            if self['ENV'].has_key('PATHEXT'):
+                pathext = self['ENV']['PATHEXT']
+        if not SCons.Util.is_List(progs):
+            progs = [ progs ]
+        for prog in progs:
+            path = SCons.Util.WhereIs(prog, path, pathext)
+            if path: return prog
+        return None
+
 class VarInterpolator:
     def __init__(self, dest, src, prefix, suffix):
         self.dest = dest
index 81549905f001f06595d60e2a8d053310fe06e002..21d241d4759467b757e0d1d119eabb3e298b3852 100644 (file)
 
 __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
 
+import os
 import string
 import sys
+import TestCmd
 import unittest
 
 from SCons.Environment import *
@@ -580,7 +582,35 @@ class EnvironmentTestCase(unittest.TestCase):
         assert dict['_CPPINCFLAGS'][17] == '$)', \
                dict['_CPPINCFLAGS'][17]
 
+    def test_Detect(self):
+        """Test Detect()ing tools"""
+        test = TestCmd.TestCmd(workdir = '')
+        test.subdir('sub1', 'sub2')
+        test.write(['sub1', 'xxx.exe'], "sub1/xxx.exe\n")
+        test.write(['sub2', 'xxx.exe'], "sub2/xxx.exe\n")
 
+        sub1 = test.workpath('sub1')
+        sub2 = test.workpath('sub2')
+        env = Environment(ENV = { 'PATH' : [sub1, sub2] })
+        x = env.Detect('xxx.exe')
+        assert x is None, x
+
+        sub2_xxx_exe = test.workpath('sub2', 'xxx.exe')
+        os.chmod(sub2_xxx_exe, 0755)
+
+        env = Environment(ENV = { 'PATH' : [sub1, sub2] })
+        x = env.Detect('xxx.exe')
+        assert x == 'xxx.exe'
+
+        sub1_xxx_exe = test.workpath('sub1', 'xxx.exe')
+        os.chmod(sub1_xxx_exe, 0755)
+
+        x = env.Detect('xxx.exe')
+        assert x == 'xxx.exe'
+
+        env = Environment(ENV = { 'PATH' : [] })
+        x = env.Detect('xxx.exe')
+        assert x is None, x
 
     def test_platform(self):
         """Test specifying a platform callable when instantiating."""
index cfd84b32eb97c9bd214dd06418466247f3506d31..23901f75fb76137a5e0341bc945c48faa340d00e 100644 (file)
@@ -32,10 +32,21 @@ import SCons.Tool
 class ToolTestCase(unittest.TestCase):
     def test_Tool(self):
         """Test the Tool() function"""
-        # FIXME - this might fail, since there might be no C++ compiler on the system.
-        # How do we handle this?
+        class Environment:
+            def __init__(self):
+                self.dict = {}
+            def Detect(self, progs):
+                if not SCons.Util.is_List(progs):
+                    progs = [ progs ]
+                return progs[0]
+            def __getitem__(self, key):
+                return self.dict[key]
+            def __setitem__(self, key, val):
+                self.dict[key] = val
+        env = Environment()
+        env['BUILDERS'] = {}
+        env['ENV'] = {}
         t = SCons.Tool.Tool('g++')
-        env= { 'BUILDERS' : {}, 'ENV' : {} }
         t(env, 'foo')
         assert (env['CXX'] == 'c++' or env['CXX'] == 'g++'), env['CXX']
         assert env['CXXFLAGS'] == '$CCFLAGS', env['CXXFLAGS']
index 0535b23b8c190549fc3eef255449a4e7206a3ae3..5eda93803cfc67184b9ff6eb22448afb0e45d49c 100644 (file)
@@ -44,7 +44,7 @@ def generate(env, platform):
     
     arcom = '$AR $ARFLAGS $TARGET $SOURCES'
     ranlib = 'ranlib'
-    if SCons.Util.Detect([ranlib], env):
+    if env.Detect(ranlib):
         arcom = arcom + '\n$RANLIB $RANLIBFLAGS $TARGET'
 
     env['AR']          = 'ar'
@@ -57,4 +57,4 @@ def generate(env, platform):
     env['SHLINKCOM']   = '$SHLINK $SHLINKFLAGS -o $TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
 
 def exists(env):
-    return SCons.Util.Detect(['ar'], env)
+    return env.Detect('ar')
index c99c333f762fb8283c1c300bf96d2263d6a85350..e9b383926040889e5025e91d5e6e058df511b68d 100644 (file)
@@ -49,4 +49,4 @@ def generate(env, platform):
     env['PDFCOM']      = '$DVIPDF $DVIPDFFLAGS $SOURCES $TARGET'
 
 def exists(env):
-    return SCons.Util.Detect(['dvipdf'], env)
+    return env.Detect('dvipdf')
index dc8ad0d7c9bfd55e3dc0f5acda2c18b4305fac8f..91ad550e7394d2c00b1e17b93adfadd26dba951a 100644 (file)
@@ -51,4 +51,4 @@ def generate(env, platform):
     env['PSCOM']      = '$DVIPS $DVIPSFLAGS -o $TARGET $SOURCES'
 
 def exists(env):
-    return SCons.Util.Detect(['dvips'], env)
+    return env.Detect('dvips')
index 9dba2c2a6a1d3baa4630224c5ad3165ccdcff356..d2274a507956f84970de6c3d043b08959fed66b2 100644 (file)
@@ -53,7 +53,7 @@ def generate(env, platform):
         static_obj.add_action(suffix, SCons.Defaults.CXXAction)
         shared_obj.add_action(suffix, SCons.Defaults.ShCXXAction)
 
-    env['CXX']        = SCons.Util.Detect(compilers, env) or 'c++'
+    env['CXX']        = env.Detect(compilers) or 'c++'
     env['CXXFLAGS']   = '$CCFLAGS'
     env['CXXCOM']     = '$CXX $CXXFLAGS $CPPFLAGS $_CPPINCFLAGS -c -o $TARGET $SOURCES'
     env['SHCXX']      = '$CXX'
@@ -65,4 +65,4 @@ def generate(env, platform):
     env['CXXFILESUFFIX'] = '.cc'
 
 def exists(env):
-    return SCons.Util.Detect(compilers, env)
+    return env.Detect(compilers)
index c3ddcbf2a784242149820e12b2c60f73b0815b11..8075bd99f16a20f6b1e279f63470bf8adb8f72d2 100644 (file)
@@ -60,7 +60,7 @@ def generate(env, platform):
         static_obj.add_action(suffix, SCons.Defaults.F77PPAction)
         shared_obj.add_action(suffix, SCons.Defaults.ShF77PPAction)
 
-    env['F77']        = SCons.Util.Detect(compilers, env) or 'g77'
+    env['F77']        = env.Detect(compilers) or 'g77'
     env['F77FLAGS']   = ''
     env['F77COM']     = '$F77 $F77FLAGS $_F77INCFLAGS -c -o $TARGET $SOURCES'
     env['F77PPCOM']   = '$F77 $F77FLAGS $CPPFLAGS $_F77INCFLAGS -c -o $TARGET $SOURCES'
@@ -70,4 +70,4 @@ def generate(env, platform):
     env['SHF77PPCOM'] = '$SHF77 $SHF77FLAGS $CPPFLAGS $_F77INCFLAGS -c -o $TARGET $SOURCES'
 
 def exists(env):
-    return SCons.Util.Detect(compilers, env)
+    return env.Detect(compilers)
index a8c2864b54fed29502d693e68a92e464b5d13737..8d24348008018503b43525fd8a2e6d1da540f0f0 100644 (file)
@@ -58,10 +58,10 @@ def generate(env, platform):
     for suffix in ASPPSuffixes:
         static_obj.add_action(suffix, SCons.Defaults.ASPPAction)
 
-    env['AS']        = SCons.Util.Detect(assemblers, env) or 'as'
+    env['AS']        = env.Detect(assemblers) or 'as'
     env['ASFLAGS']   = ''
     env['ASCOM']     = '$AS $ASFLAGS -o $TARGET $SOURCES'
     env['ASPPCOM']   = '$CC $ASFLAGS $CPPFLAGS -o $TARGET $SOURCES'
 
 def exists(env):
-    return SCons.Util.Detect(assemblers, env)
+    return env.Detect(assemblers)
index 6dbe0afaa0a4d6e1da4e948bbf6b79cc775cc2e7..f1c085aa8f30e0d40f56832722a9fc66a673aff0 100644 (file)
@@ -53,7 +53,7 @@ def generate(env, platform):
         static_obj.add_action(suffix, SCons.Defaults.CAction)
         shared_obj.add_action(suffix, SCons.Defaults.ShCAction)
 
-    env['CC']        = SCons.Util.Detect(compilers, env) or 'cc'
+    env['CC']        = env.Detect(compilers) or 'cc'
     env['CCFLAGS']   = ''
     env['CCCOM']     = '$CC $CCFLAGS $CPPFLAGS $_CPPINCFLAGS -c -o $TARGET $SOURCES'
     env['SHCC']      = '$CC'
@@ -66,4 +66,4 @@ def generate(env, platform):
     env['CFILESUFFIX'] = '.c'
 
 def exists(env):
-    return SCons.Util.Detect(compilers, env)
+    return env.Detect(compilers)
index 0a6b22e8d0264ec6fb7e95a524af46ee7c7c1a53..7d4d2734ca9d5bc7765c4b78bc29fc12eb0f648e 100644 (file)
@@ -47,7 +47,7 @@ def generate(env, platform):
     env['SHLINKFLAGS'] = '$LINKFLAGS -shared'
     env['SHLINKCOM']   = '$SHLINK $SHLINKFLAGS -o $TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
     env['SHLIBEMITTER']= None
-    env['LINK']        = SCons.Util.Detect(linkers, env) or 'c++'
+    env['LINK']        = env.Detect(linkers) or 'c++'
     env['LINKFLAGS']   = ''
     env['LINKCOM']     = '$LINK $LINKFLAGS -o $TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
     env['LIBDIRPREFIX']='-L'
@@ -56,4 +56,4 @@ def generate(env, platform):
     env['LIBLINKSUFFIX']=''
 
 def exists(env):
-    return SCons.Util.Detect(linkers, env)
+    return env.Detect(linkers)
index 5a09cb8834714afbc4dc6705fae3272cd249ea8b..b21069a04732f3a17db00a1a9437987d55ae0709 100644 (file)
@@ -68,4 +68,4 @@ def generate(env, platform):
     env['CXXFILESUFFIX'] = '.cc'
 
 def exists(env):
-    return SCons.Util.Detect(['icc'], env)
+    return env.Detect('icc')
index 69a1ffde26bc56d5a59bb503b124e733578f3027..dcf44122ce65ba70c8329a710f6248d9a5ce5aab 100644 (file)
@@ -68,4 +68,4 @@ def generate(env, platform):
     env['SHF77PPCOM'] = '$SHF77 $SHF77FLAGS $CPPFLAGS $_F77INCFLAGS /c $SOURCES /Fo$TARGET'
 
 def exists(env):
-    return SCons.Util.Detect(['ifl'], env)
+    return env.Detect('ifl')
index f3e565974d005d37e1020150925b7aff318fa582..aa396dc0c44bd1070cdf59dd7b0a3ca6350e5799 100644 (file)
@@ -48,4 +48,4 @@ def generate(env, platform):
     env['LIBLINKSUFFIX']='$LIBSUFFIX'
 
 def exists(env):
-    return SCons.Util.Detect(['ilink'], env)
+    return env.Detect('ilink')
index 192ccf086eaa8966f82e1eee5c27502886b994a3..bfc30d96f33aa2d56af4dabd3989c9d7807fc416 100644 (file)
@@ -55,4 +55,4 @@ def generate(env, platform):
     env['LATEXCOM']   = '$LATEX $LATEXFLAGS $SOURCES'
 
 def exists(env):
-    return SCons.Util.Detect(['latex'], env)
+    return env.Detect('latex')
index 2a936e57d5abee56ef481bdfbf0928abf0500426..d7c61f80d625c8977d032e013a205c51ef51e8fd 100644 (file)
@@ -48,4 +48,4 @@ def generate(env, platform):
     env['LEXCOM']   = '$LEX $LEXFLAGS -t $SOURCES > $TARGET'
     
 def exists(env):
-    return SCons.Util.Detect(['lex'], env)
+    return env.Detect('lex')
index 7b5e0cd0ed3c7847d6d3331f571c92922ae5fb2b..d1b3bf00c9f0366374d852644051f40609787df4 100644 (file)
@@ -45,4 +45,4 @@ def generate(env, platform):
     env['ARCOM']       = '$AR $ARFLAGS /OUT:$TARGET $SOURCES'
 
 def exists(env):
-    return SCons.Util.Detect(['lib'], env)
+    return env.Detect('lib')
index 6581e4298528d52b0e32da3f583ab94feca3d6e5..d634b09f2657d4b57154b7c4212e8e1d1b83098d 100644 (file)
@@ -61,4 +61,4 @@ def generate(env, platform):
     env['ASPPCOM']   = '$CC $ASFLAGS $CPPFLAGS /c /Fo$TARGET $SOURCES'
 
 def exists(env):
-    return SCons.Util.Detect(['ml'], env)
+    return env.Detect('ml')
index eb8fa26b87f082e6b0236cf4d0bb28b68e8f06bf..9d399cdf54d00d6cb50410e3859ba1945e54a494 100644 (file)
@@ -153,4 +153,4 @@ def generate(env, platform):
     env['ENV']['PATH']           = exe_path
 
 def exists(env):
-    return SCons.Util.Detect(['link'], env)
+    return env.Detect('link')
index fadebc6e8974504700e36e20ce53b32f81e5cb0b..37d3e1dcc080d412b7e73c24d9296fbfc9577aea 100644 (file)
@@ -222,4 +222,4 @@ def generate(env, platform):
     env['CXXFILESUFFIX'] = '.cc'
 
 def exists(env):
-    return SCons.Util.Detect(['cl'], env)
+    return env.Detect('cl')
index 7be709165c116d596e99236373f17b1c697d75be..9dd5f0513a6bc9787f0ed070fb40cce0b7d1c3ea 100644 (file)
@@ -61,4 +61,4 @@ def generate(env, platform):
     env['ASPPCOM']   = '$CC $ASFLAGS $CPPFLAGS -c -o $TARGET $SOURCES'
 
 def exists(env):
-    return SCons.Util.Detect(['nasm'], env)
+    return env.Detect('nasm')
index 20517177c1c0925634ec2151ef7063663b9efe87..980530a83fc034a1a8add17a702e08dff94e9790 100644 (file)
@@ -54,4 +54,4 @@ def generate(env, platform):
     env['PDFLATEXCOM']   = '$PDFLATEX $PDFLATEXFLAGS $SOURCES $TARGET'
 
 def exists(env):
-    return SCons.Util.Detect(['pdflatex'], env)
+    return env.Detect('pdflatex')
index 2d538b7b149fae5f5922ab47c3e4cbb4539a3ca5..b43d8c6a9d7970c7ab51b67796fd210f4a00da08 100644 (file)
@@ -50,4 +50,4 @@ def generate(env, platform):
     env['PDFTEXCOM']   = '$PDFTEX $PDFTEXFLAGS $SOURCES $TARGET'
 
 def exists(env):
-    return SCons.Util.Detect(['pdftex'], env)
+    return env.Detect('pdftex')
index 4cf88ba23344566987d372f31ee8475fbd372fff..9edd76e5582c7c8c2dd5a4ff1595d1f1b68b16d9 100644 (file)
@@ -53,10 +53,10 @@ def generate(env, platform):
         bld = TarBuilder
         env['BUILDERS']['Tar'] = bld
 
-    env['TAR']        = SCons.Util.Detect(tars, env) or 'gtar'
+    env['TAR']        = env.Detect(tars) or 'gtar'
     env['TARFLAGS']   = '-c'
     env['TARCOM']     = '$TAR $TARFLAGS -f $TARGET $SOURCES'
     env['TARSUFFIX']  = '.tar'
 
 def exists(env):
-    return SCons.Util.Detect(tars, env)
+    return env.Detect(tars)
index deed4cb41e21c5aeb032741643572c254c5363cf..449b2dcd8e97c716c7dd9633b0854021e925eff3 100644 (file)
@@ -50,4 +50,4 @@ def generate(env, platform):
     env['TEXCOM']   = '$TEX $TEXFLAGS $SOURCES'
 
 def exists(env):
-    return SCons.Util.Detect(['tex'], env)
+    return env.Detect('tex')
index 4e63c19de7ffc416d3eed18e890eb6d53ad032a2..52e5d687204e7d1283f150b8a52f7e6b205266c3 100644 (file)
@@ -47,4 +47,4 @@ def generate(env, platform):
     env['YACCCOM']   = '$YACC $YACCFLAGS -o $TARGET $SOURCES'
 
 def exists(env):
-    return SCons.Util.Detect(['yacc'], env)
+    return env.Detect('yacc')
index bcf0e14891ec4529583c0d77162cd13a0feb29e5..63c992e33d3d8874e3168e61e9748547e52e1ff5 100644 (file)
@@ -489,17 +489,3 @@ else:
                 if stat.S_IMODE(st[stat.ST_MODE]) & 0111:
                     return f
         return None
-
-def Detect(progs, env=None):
-    "Return the first available program in progs"
-    path = None
-    pathext = None
-    if env and env.has_key('ENV'):
-        if env['ENV'].has_key('PATH'):
-            path = env['ENV']['PATH']
-        if env['ENV'].has_key('PATHEXT'):
-            pathext = env['ENV']['PATHEXT']
-    for prog in progs:
-        path = WhereIs(prog, path, pathext)
-        if path: return prog
-    return None