Add RANLIB, and check for the existence of 'ranlib' before adding it to the default...
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Sat, 2 Mar 2002 07:27:27 +0000 (07:27 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Sat, 2 Mar 2002 07:27:27 +0000 (07:27 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@282 fdb21ef1-2011-0410-befe-b5e4ea1792b1

doc/man/scons.1
src/CHANGES.txt
src/engine/SCons/Defaults.py
test/RANLIB.py [new file with mode: 0644]
test/RANLIBFLAGS.py [new file with mode: 0644]

index c32c6f8dd75daa3573a4ed785d333887b519ce34..9614a0fc3aacbb455c21ba51c9fa8591b9a2a3f7 100644 (file)
@@ -733,10 +733,10 @@ by the user. The following is a list of the automatically defined construction
 variables:
 
 .IP AR
-The static library command.
+The static library archiver.
 
 .IP ARFLAGS
-General options passed to the static library command.
+General options passed to the static library archiver.
 
 .IP ARCOM
 The command line used to generate a static library from object files.
@@ -922,6 +922,12 @@ The prefix used for executable file names.
 .IP PROGSUFFIX
 The suffix used for executable file names.
 
+.IP RANLIB
+The archive indexer.
+
+.IP RANLIBFLAGS
+General options passed to the archive indexer.
+
 .IP SCANNERS
 A list of the available implicit dependency scanners. [CScan] by default.
 
index cc3db98312a667c4ddf501683c93e63101ff3dc0..5835996abcc7e0f4d6ab758a3b31643e82630360 100644 (file)
@@ -20,6 +20,9 @@ RELEASE 0.06 -
 
   - Man page:  document LIBS, fix a typo.
 
+  - Added RANLIB and RANLIBFLAGS construction variables.  Only use them
+    in ARCOM if there's a "ranlib" program on the system.
+
 
 
 RELEASE 0.05 - Thu, 21 Feb 2002 16:50:03 -0600
index d12983803811ead901b357690aff81afd68bdc51..0a8e4cd575dfb5c32d278c9a53bccef5175f4c6d 100644 (file)
@@ -4,7 +4,7 @@ Builders and other things for the local site.  Here's where we'll
 duplicate the functionality of autoconf until we move it into the
 installation procedure or use something like qmconf.
 
-The code that reads the registry to find MSVC components was borrowed 
+The code that reads the registry to find MSVC components was borrowed
 from distutils.msvccompiler.
 
 """
@@ -37,6 +37,7 @@ __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
 
 
 import os
+import stat
 import string
 import sys
 
@@ -47,6 +48,22 @@ import SCons.Scanner.Prog
 import SCons.Errors
 import SCons.Util
 
+
+
+def whereis(file):
+    for dir in string.split(os.environ['PATH'], os.pathsep):
+        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
+
+
+
 CFile = SCons.Builder.Builder(name = 'CFile',
                               action = { '.l'    : '$LEXCOM',
                                          '.y'    : '$YACCCOM',
@@ -116,10 +133,10 @@ def get_devstudio_versions ():
                 i = i + 1
         except SCons.Util.RegError:
             pass
-    
+
     if not L:
         raise SCons.Errors.InternalError, "DevStudio was not found."
-    
+
     L.sort()
     L.reverse()
     return L
@@ -127,10 +144,10 @@ def get_devstudio_versions ():
 def get_msvc_path (path, version, platform='x86'):
     """
     Get a list of devstudio directories (include, lib or path).  Return
-    a string delimited by ';'. An exception will be raised if unable to 
+    a string delimited by ';'. An exception will be raised if unable to
     access the registry or appropriate registry keys not found.
     """
-       
+
     if not SCons.Util.can_read_reg:
         raise SCons.Errors.InternalError, "No Windows registry module was found"
 
@@ -164,7 +181,7 @@ def get_msvc_path (path, version, platform='x86'):
 def get_msdev_dir(version):
     """Returns the root directory of the MSDev installation from the
     registry if it can be found, otherwise we guess."""
-    if SCons.Util.can_read_reg:  
+    if SCons.Util.can_read_reg:
         K = ('Software\\Microsoft\\Devstudio\\%s\\' +
              'Products\\Microsoft Visual C++') % \
              version
@@ -176,10 +193,10 @@ def get_msdev_dir(version):
                 return os.path.split(val)[0]
             except SCons.Util.RegError:
                 pass
-    
+
 def make_win32_env_from_paths(include, lib, path):
     """
-    Build a dictionary of construction variables for a win32 platform. 
+    Build a dictionary of construction variables for a win32 platform.
     include - include path
     lib - library path
     path - executable path
@@ -224,20 +241,25 @@ def make_win32_env_from_paths(include, lib, path):
                 'PATHEXT' : '.COM;.EXE;.BAT;.CMD',
             },
         }
-    
+
 def make_win32_env(version):
     """
-    Build a dictionary of construction variables for a win32 platform. 
+    Build a dictionary of construction variables for a win32 platform.
     ver - the version string of DevStudio to use (e.g. "6.0")
     """
     return make_win32_env_from_paths(get_msvc_path("include", version),
                                      get_msvc_path("lib", version),
-                                     get_msvc_path("path", version) 
+                                     get_msvc_path("path", version)
                                      + ";" + os.environ['PATH'])
-    
+
 
 if os.name == 'posix':
 
+    arcom = '$AR $ARFLAGS $TARGET $SOURCES'
+    ranlib = 'ranlib'
+    if whereis(ranlib):
+        arcom = arcom + '\n$RANLIB $RANLIBFLAGS $TARGET'
+
     ConstructionEnvironment = {
         'CC'         : 'cc',
         'CCFLAGS'    : '',
@@ -250,7 +272,9 @@ if os.name == 'posix':
         'LINKCOM'    : '$LINK $LINKFLAGS -o $TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS',
         'AR'         : 'ar',
         'ARFLAGS'    : 'r',
-        'ARCOM'      : '$AR $ARFLAGS $TARGET $SOURCES\nranlib $TARGET',
+        'RANLIB'     : ranlib,
+        'RANLIBFLAGS' : '',
+        'ARCOM'      : arcom,
         'LEX'        : 'lex',
         'LEXFLAGS'   : '',
         'LEXCOM'     : '$LEX $LEXFLAGS -o$TARGET $SOURCES',
diff --git a/test/RANLIB.py b/test/RANLIB.py
new file mode 100644 (file)
index 0000000..2e151cd
--- /dev/null
@@ -0,0 +1,96 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2001, 2002 Steven Knight
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import string
+import sys
+import TestSCons
+
+python = sys.executable
+
+if sys.platform == 'win32':
+    _exe = '.exe'
+else:
+    _exe = ''
+
+test = TestSCons.TestSCons()
+
+test.write("wrapper.py",
+"""import os
+import string
+import sys
+open('%s', 'wb').write("wrapper.py\\n")
+os.system(string.join(sys.argv[1:], " "))
+""" % string.replace(test.workpath('wrapper.out'), '\\', '\\\\'))
+
+test.write('SConstruct', """
+foo = Environment(LIBS = ['foo'], LIBPATH = ['.'])
+ranlib = foo.Dictionary('RANLIB')
+bar = Environment(LIBS = ['bar'], LIBPATH = ['.'],
+                  RANLIB = r'%s wrapper.py ' + ranlib)
+foo.Library(target = 'foo', source = 'foo.c')
+bar.Library(target = 'bar', source = 'bar.c')
+
+foo.Program(target = 'f', source = 'main.c')
+bar.Program(target = 'b', source = 'main.c')
+""" % python)
+
+test.write('foo.c', r"""
+void
+library_function(void)
+{
+       printf("foo.c\n");
+}
+""")
+
+test.write('bar.c', r"""
+void
+library_function(void)
+{
+       printf("bar.c\n");
+}
+""")
+
+test.write('main.c', r"""
+int
+main(int argc, char *argv[])
+{
+       argv[argc++] = "--";
+       library_function();
+       exit (0);
+}
+""")
+
+
+test.run(arguments = 'f' + _exe)
+
+test.fail_test(os.path.exists(test.workpath('wrapper.out')))
+
+test.run(arguments = 'b' + _exe)
+
+test.fail_test(test.read('wrapper.out') != "wrapper.py\n")
+
+test.pass_test()
diff --git a/test/RANLIBFLAGS.py b/test/RANLIBFLAGS.py
new file mode 100644 (file)
index 0000000..1855af2
--- /dev/null
@@ -0,0 +1,97 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2001, 2002 Steven Knight
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import string
+import sys
+import TestSCons
+
+python = sys.executable
+
+if sys.platform == 'win32':
+    _exe = '.exe'
+else:
+    _exe = ''
+
+test = TestSCons.TestSCons()
+
+test.write("wrapper.py",
+"""import os
+import string
+import sys
+open('%s', 'wb').write("wrapper.py\\n")
+os.system(string.join(sys.argv[1:], " "))
+""" % string.replace(test.workpath('wrapper.out'), '\\', '\\\\'))
+
+test.write('SConstruct', """
+foo = Environment(LIBS = ['foo'], LIBPATH = ['.'])
+ranlib = foo.Dictionary('RANLIB')
+ranlibflags = foo.Dictionary('RANLIBFLAGS')
+bar = Environment(LIBS = ['bar'], LIBPATH = ['.'], RANLIB = '',
+                  RANLIBFLAGS = r'%s wrapper.py ' + ranlib + ' ' + ranlibflags)
+foo.Library(target = 'foo', source = 'foo.c')
+bar.Library(target = 'bar', source = 'bar.c')
+
+foo.Program(target = 'f', source = 'main.c')
+bar.Program(target = 'b', source = 'main.c')
+""" % python)
+
+test.write('foo.c', r"""
+void
+library_function(void)
+{
+       printf("foo.c\n");
+}
+""")
+
+test.write('bar.c', r"""
+void
+library_function(void)
+{
+       printf("bar.c\n");
+}
+""")
+
+test.write('main.c', r"""
+int
+main(int argc, char *argv[])
+{
+       argv[argc++] = "--";
+       library_function();
+       exit (0);
+}
+""")
+
+
+test.run(arguments = 'f' + _exe)
+
+test.fail_test(os.path.exists(test.workpath('wrapper.out')))
+
+test.run(arguments = 'b' + _exe)
+
+test.fail_test(test.read('wrapper.out') != "wrapper.py\n")
+
+test.pass_test()