Dynamically check for the existence of utilities. (sam th)
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Thu, 29 Aug 2002 03:22:52 +0000 (03:22 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Thu, 29 Aug 2002 03:22:52 +0000 (03:22 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@451 fdb21ef1-2011-0410-befe-b5e4ea1792b1

26 files changed:
src/CHANGES.txt
src/engine/SCons/Platform/__init__.py
src/engine/SCons/Tool/ToolTests.py
src/engine/SCons/Tool/__init__.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/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

index 74b562132e30226b980847af2782ae195664cd14..32479f9f9c7abe5457d785bedaa33f92dfb88c2f 100644 (file)
@@ -46,6 +46,11 @@ RELEASE 0.09 -
    utility is available, which is much faster than fork()/exec(),
    and fixes the -j option on several platforms.
 
+  From sam th:
+
+  - Dynamically check for the existence of utilities with which to
+    initialize Environments by default.
+
 
 
 RELEASE 0.08 - Mon, 15 Jul 2002 12:08:51 -0500
index d8fefbd23dc85a8ee9b37e66094a787edd1383e6..2b35a2ea57ee607c4793691a83cec3e29e31dfbf 100644 (file)
@@ -89,7 +89,7 @@ def DefaultToolList(name = platform_default()):
     """Select a default tool list for the specified platform.
     """
     module = platform_module(name)
-    return module.tool_list()
+    return SCons.Tool.tool_list()
 
 class PlatformSpec:
     def __init__(self, name):
index a7e03e87f8e099671812648545bf3f5db234ac54..cfd84b32eb97c9bd214dd06418466247f3506d31 100644 (file)
@@ -32,10 +32,12 @@ 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?
         t = SCons.Tool.Tool('g++')
         env= { 'BUILDERS' : {}, 'ENV' : {} }
         t(env, 'foo')
-        assert env['CXX'] == 'c++', env['CXX']
+        assert (env['CXX'] == 'c++' or env['CXX'] == 'g++'), env['CXX']
         assert env['CXXFLAGS'] == '$CCFLAGS', env['CXXFLAGS']
         assert env['INCPREFIX'] == '-I', env['INCPREFIX']
 
index 08ab5c2a69aee5aa90076ae035b5807a106694bf..d791526f2c04707b04756bd0893d1c39902f839f 100644 (file)
@@ -67,6 +67,7 @@ def Tool(name, platform = None):
             file.close()
     spec = ToolSpec(name)
     spec.__call__ = sys.modules[full_name].generate
+    spec.exists = sys.modules[full_name].exists
     return spec
 
 def createObjBuilders(env):
@@ -123,3 +124,34 @@ def createCFileBuilders(env):
         env['BUILDERS']['CXXFile'] = cxx_file
 
     return (c_file, cxx_file)
+
+linkers = ['gnulink', 'mslink', 'ilink']
+c_compilers = ['gcc', 'msvc', 'icc']
+cxx_compilers = ['g++'] # only those that are seperate from the c compiler
+fortran_compilers = ['g77']
+assemblers = ['gas', 'nasm', 'masm']
+other_tools = ['ar', 'dvipdf', 'dvips',
+               'latex', 'lex', 'lib',
+               'pdflatex', 'pdftex',
+               'tar', 'tex', 'yacc']
+
+def FindTool(tools):
+    for tool in tools:
+        t = Tool(tool)
+        if t.exists():
+            return tool
+    return None
+
+def _ToolExists(tool):
+    return Tool(tool).exists()
+
+def FindAllTools(tools):
+    return filter (_ToolExists, tools)
+             
+def tool_list():
+    return [FindTool(linkers),
+            FindTool(c_compilers),
+            FindTool(cxx_compilers),
+            FindTool(fortran_compilers),
+            FindTool(assemblers)
+           ] + FindAllTools(other_tools)
index ab870b63c78fba27d0a3700cd30f1a63a84e200e..da66413581f23a71703400d314091d7a1b361248 100644 (file)
@@ -56,4 +56,5 @@ def generate(env, platform):
     env['SHLINKFLAGS'] = '$LINKFLAGS -shared'
     env['SHLINKCOM']   = '$SHLINK $SHLINKFLAGS -o $TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
 
-
+def exists():
+    return SCons.Util.WhereIs('ar')
index 230ce92cbac2acf9275451d53197cce8a3ee72af..6de52f1c326a72d7f383cd315f05c8323d835172 100644 (file)
@@ -47,3 +47,6 @@ def generate(env, platform):
     env['DVIPDF']      = 'dvipdf'
     env['DVIPDFFLAGS'] = ''
     env['PDFCOM']      = '$DVIPDF $DVIPDFFLAGS $SOURCES $TARGET'
+
+def exists():
+    return SCons.Util.WhereIs('dvipdf')
index 098cba73419010a55507bb35226773b24921b585..7da853dd380b0299e7e9c425569d490523bcd1d0 100644 (file)
@@ -49,3 +49,6 @@ def generate(env, platform):
     env['DVIPS']      = 'dvips'
     env['DVIPSFLAGS'] = ''
     env['PSCOM']      = '$DVIPS $DVIPSFLAGS -o $TARGET $SOURCES'
+
+def exists():
+    return SCons.Util.WhereIs('dvips')
index f631b0b064b5d92b8fd5b3e670159f4889a02796..3c6dd3656518d5e972ae2ce1fc203bde079a69aa 100644 (file)
@@ -37,6 +37,15 @@ import os.path
 
 import SCons.Defaults
 import SCons.Tool
+import SCons.Util
+
+compilers = ['c++', 'g++']
+
+for i in compilers:
+    if SCons.Util.WhereIs(i):
+        cxx = i
+        break
+    cxx = None
 
 CXXSuffixes = ['.cc', '.cpp', '.cxx', '.c++', '.C++']
 if os.path.normcase('.c') != os.path.normcase('.C'):
@@ -50,7 +59,7 @@ def generate(env, platform):
         static_obj.add_action(suffix, SCons.Defaults.CXXAction)
         shared_obj.add_action(suffix, SCons.Defaults.ShCXXAction)
 
-    env['CXX']        = 'c++'
+    env['CXX']        = cxx
     env['CXXFLAGS']   = '$CCFLAGS'
     env['CXXCOM']     = '$CXX $CXXFLAGS $CPPFLAGS $_CPPINCFLAGS -c -o $TARGET $SOURCES'
     env['SHCXX']      = '$CXX'
@@ -60,3 +69,6 @@ def generate(env, platform):
     env['INCSUFFIX']  = ''
 
     env['CXXFILESUFFIX'] = '.cc'
+
+def exists():
+    return cxx
index dbafcf27d0412462fac969b56d23bef690766016..1066c0f5598cc0a6ab52bb0228e288c122890d06 100644 (file)
@@ -37,6 +37,15 @@ import os.path
 
 import SCons.Defaults
 import SCons.Tool
+import SCons.Util
+
+compilers = ['g77', 'f77']
+for i in compilers:
+    if SCons.Util.WhereIs(i):
+        compiler = i
+        break
+    compiler = None
+
 
 F77Suffixes = ['.f', '.for', '.FOR']
 F77PPSuffixes = ['.fpp', '.FPP']
@@ -65,3 +74,6 @@ def generate(env, platform):
     env['SHF77FLAGS'] = '$F77FLAGS -fPIC'
     env['SHF77COM']   = '$SHF77 $SHF77FLAGS $_F77INCFLAGS -c -o $TARGET $SOURCES'
     env['SHF77PPCOM'] = '$SHF77 $SHF77FLAGS $CPPFLAGS $_F77INCFLAGS -c -o $TARGET $SOURCES'
+
+def exists():
+    return compiler
index 6fc3d8c084e05169919f0907fb12b82b6f6aa365..36672a1a33910455e3c400b833ec258b5392a195 100644 (file)
@@ -37,6 +37,16 @@ import os.path
 
 import SCons.Defaults
 import SCons.Tool
+import SCons.Util
+
+assemblers = ['as', 'gas']
+
+for i in assemblers:
+    if SCons.Util.WhereIs(i):
+        as = i
+        break
+    as = None
+
 
 ASSuffixes = ['.s', '.asm', '.ASM']
 ASPPSuffixes = ['.spp', '.SPP']
@@ -55,7 +65,10 @@ def generate(env, platform):
     for suffix in ASPPSuffixes:
         static_obj.add_action(suffix, SCons.Defaults.ASPPAction)
 
-    env['AS']        = 'as'
+    env['AS']        = as
     env['ASFLAGS']   = ''
     env['ASCOM']     = '$AS $ASFLAGS -o $TARGET $SOURCES'
     env['ASPPCOM']   = '$CC $ASFLAGS $CPPFLAGS -o $TARGET $SOURCES'
+
+def exists():
+    return as
index d767b218c1244271974a9178d8bbbf28b76123bb..8eae17f717acd6fc588156d3e6966f3f8ebc6cf5 100644 (file)
@@ -37,6 +37,16 @@ import os.path
 
 import SCons.Tool
 import SCons.Defaults
+import SCons.Util
+
+compilers = ['cc', 'gcc']
+
+for i in compilers:
+    if SCons.Util.WhereIs(i):
+        cc = i
+        break
+    cc = None
+
 
 CSuffixes = ['.c']
 if os.path.normcase('.c') == os.path.normcase('.C'):
@@ -50,7 +60,7 @@ def generate(env, platform):
         static_obj.add_action(suffix, SCons.Defaults.CAction)
         shared_obj.add_action(suffix, SCons.Defaults.ShCAction)
 
-    env['CC']        = 'gcc'
+    env['CC']        = cc
     env['CCFLAGS']   = ''
     env['CCCOM']     = '$CC $CCFLAGS $CPPFLAGS $_CPPINCFLAGS -c -o $TARGET $SOURCES'
     env['SHCC']      = '$CC'
@@ -61,3 +71,6 @@ def generate(env, platform):
     env['INCSUFFIX']  = ''
 
     env['CFILESUFFIX'] = '.c'
+
+def exists():
+    return cc
index 630d95afef108b1e3ec55b245875c857d55c1aeb..3fc78b1082f0c8888b930eb6f0fb6f15b809b419 100644 (file)
@@ -36,8 +36,16 @@ __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
 import SCons.Defaults
 import SCons.Util
 
+linkers = ['c++', 'cc', 'g++', 'gcc']
+
+for i in linkers:
+    if SCons.Util.WhereIs(i):
+        linker = i
+        break
+    linker = None
+
 def generate(env, platform):
-    """Add Builders and construction variables for ar to an Environment."""
+    """Add Builders and construction variables for gnulink to an Environment."""
     env['BUILDERS']['SharedLibrary'] = SCons.Defaults.SharedLibrary
     env['BUILDERS']['Program'] = SCons.Defaults.Program
     
@@ -45,10 +53,13 @@ def generate(env, platform):
     env['SHLINKFLAGS'] = '$LINKFLAGS -shared'
     env['SHLINKCOM']   = '$SHLINK $SHLINKFLAGS -o $TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
     env['SHLIBEMITTER']= None
-    env['LINK']        = 'c++'
+    env['LINK']        = linker
     env['LINKFLAGS']   = ''
     env['LINKCOM']     = '$LINK $LINKFLAGS -o $TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
     env['LIBDIRPREFIX']='-L'
     env['LIBDIRSUFFIX']=''
     env['LIBLINKPREFIX']='-l'
     env['LIBLINKSUFFIX']=''
+
+def exists():
+    return linker
index 2d8afc9183ee9a2316151de50ddd082f7d287195..df1eb00ce1c0b41cfbbddae5087a455a4f3d3b29 100644 (file)
@@ -67,3 +67,5 @@ def generate(env, platform):
     env['CFILESUFFIX'] = '.c'
     env['CXXFILESUFFIX'] = '.cc'
     
+def exists():
+    return SCons.Util.WhereIs('icc')
index 460a46858bece4c482cda7f7e533ce2b9c578623..323f808e561207ac51e2ba40edafacff712935f4 100644 (file)
@@ -46,3 +46,6 @@ def generate(env, platform):
     env['LIBDIRSUFFIX']=''
     env['LIBLINKPREFIX']=''
     env['LIBLINKSUFFIX']='$LIBSUFFIX'
+
+def exists():
+    return SCons.Util.WhereIs('ilink')
index cb53ccf4bd10abd2fd257e58d343f14174a06534..65235803185967dc2d14e4175a78b63b3f271190 100644 (file)
@@ -53,3 +53,6 @@ def generate(env, platform):
     env['LATEX']      = 'latex'
     env['LATEXFLAGS'] = ''
     env['LATEXCOM']   = '$LATEX $LATEXFLAGS $SOURCES'
+
+def exists():
+    return SCons.Util.WhereIs('latex')
index c8851e2901d803478138c89726a4c654aac6e578..0dda1288c8c521275fdb5e69ffd698571fc1a099 100644 (file)
@@ -46,3 +46,6 @@ def generate(env, platform):
     env['LEX']      = 'lex'
     env['LEXFLAGS'] = ''
     env['LEXCOM']   = '$LEX $LEXFLAGS -t $SOURCES > $TARGET'
+    
+def exists():
+    return SCons.Util.WhereIs('lex')
index 9683abf73ef0ea38af05f1a5a59b514f99746fd2..477bf9eedb5d5b20763d800c5e3db4b84bd950c9 100644 (file)
@@ -43,4 +43,6 @@ def generate(env, platform):
     env['AR']          = 'lib'
     env['ARFLAGS']     = '/nologo'
     env['ARCOM']       = '$AR $ARFLAGS /OUT:$TARGET $SOURCES'
-    
+
+def exists():
+    return SCons.Util.WhereIs('lib')
index e88266dad2090135b573a0d1401a33140ede4048..9d95913f6105636895d498219c0a3d98b2eda13e 100644 (file)
@@ -59,3 +59,6 @@ def generate(env, platform):
     env['ASFLAGS']   = '/nologo'
     env['ASCOM']     = '$AS $ASFLAGS /c /Fo$TARGET $SOURCES'
     env['ASPPCOM']   = '$CC $ASFLAGS $CPPFLAGS /c /Fo$TARGET $SOURCES'
+
+def exists():
+    return SCons.Util.WhereIs('ml')
index 5b458c05e5e85559863c515878416b6f36873ae4..1bc9ce3e3749b324f7351654b2c75708d136f024 100644 (file)
@@ -39,6 +39,7 @@ import string
 import SCons.Defaults
 import SCons.Errors
 import SCons.Action
+import SCons.Util
 
 from SCons.Tool.msvc import get_msdev_paths
 
@@ -150,3 +151,6 @@ def generate(env, platform):
     include_path, lib_path, exe_path = get_msdev_paths()
     env['ENV']['LIB']            = lib_path
     env['ENV']['PATH']           = exe_path
+
+def exists():
+    return SCons.Util.WhereIs('link')
index 54796e3c441f6431164292cae8684579d57c3b05..33da2ece75772965e73fa9285c84f999bc076967 100644 (file)
@@ -221,3 +221,5 @@ def generate(env, platform):
     env['CFILESUFFIX'] = '.c'
     env['CXXFILESUFFIX'] = '.cc'
     
+def exists():
+    return SCons.Util.WhereIs('cl')
index b757a53ac458c099f46de3aa973840d585599ce7..e341ddee92574efddd1ec4cd00da9fcd76a7ffaa 100644 (file)
@@ -59,3 +59,6 @@ def generate(env, platform):
     env['ASFLAGS']   = ''
     env['ASCOM']     = '$AS $ASFLAGS -o $TARGET $SOURCES'
     env['ASPPCOM']   = '$CC $ASFLAGS $CPPFLAGS -c -o $TARGET $SOURCES'
+
+def exists():
+    return SCons.Util.WhereIs('nasm')
index 340622ce8450952f1d13e6a0009ccedfc694dd5b..1e9e733f2587c51cd5bc3611ed6da1b819c47427 100644 (file)
@@ -52,3 +52,6 @@ def generate(env, platform):
     env['PDFLATEX']      = 'pdflatex'
     env['PDFLATEXFLAGS'] = ''
     env['PDFLATEXCOM']   = '$PDFLATEX $PDFLATEXFLAGS $SOURCES $TARGET'
+
+def exists():
+    return SCons.Util.WhereIs('pdflatex')
index 1acc9cef9163c1b5bbb5866c6f82f5f91c38f7d1..f7dc60c3903bb09f9637fd276e5f625f2bc516ac 100644 (file)
@@ -48,3 +48,6 @@ def generate(env, platform):
     env['PDFTEX']      = 'pdftex'
     env['PDFTEXFLAGS'] = ''
     env['PDFTEXCOM']   = '$PDFTEX $PDFTEXFLAGS $SOURCES $TARGET'
+
+def exists():
+    return SCons.Util.WhereIs('pdftex')
index fff9dff05359169126d082bbe2fdbc395e75ac24..0acfd56aa98e33f953c424bf6e9a3fafe9a1862c 100644 (file)
@@ -35,12 +35,22 @@ __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
 
 import SCons.Builder
 import SCons.Node.FS
+import SCons.Util
+
+tars = ['gtar', 'tar']
+
+for i in tars:
+    if SCons.Util.WhereIs(i):
+        tar = i
+        break
+    tar = None
 
 TarBuilder = SCons.Builder.Builder(action = '$TARCOM',
                                    source_factory = SCons.Node.FS.default_fs.Entry,
                                   suffix = '$TARSUFFIX',
                                    multi = 1)
 
+
 def generate(env, platform):
     """Add Builders and construction variables for tar to an Environment."""
     try:
@@ -49,7 +59,10 @@ def generate(env, platform):
         bld = TarBuilder
         env['BUILDERS']['Tar'] = bld
 
-    env['TAR']        = 'tar'
+    env['TAR']        = tar
     env['TARFLAGS']   = '-c'
     env['TARCOM']     = '$TAR $TARFLAGS -f $TARGET $SOURCES'
     env['TARSUFFIX']  = '.tar'
+
+def exists():
+    return tar
index 10413aa645587f89e86ad5f0e42db534e52b5d23..9e0d9629f4c602effe01463c12b8a6e92ef19a88 100644 (file)
@@ -48,3 +48,6 @@ def generate(env, platform):
     env['TEX']      = 'tex'
     env['TEXFLAGS'] = ''
     env['TEXCOM']   = '$TEX $TEXFLAGS $SOURCES'
+
+def exists():
+    return SCons.Util.WhereIs('tex')
index 34abe77187f08b2278a09f67b9642c9b3d0a85e4..bce4a39fc6717caa131069ce3e05dc82e17af3c0 100644 (file)
@@ -45,3 +45,6 @@ def generate(env, platform):
     env['YACC']      = 'yacc'
     env['YACCFLAGS'] = ''
     env['YACCCOM']   = '$YACC $YACCFLAGS -o $TARGET $SOURCES'
+
+def exists():
+    return SCons.Util.WhereIs('yacc')