Add TempFileMunge support to AIX, Cygwin, HP-UX, Linux/UNIX and SunOS. (Leanid Nazdr...
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Thu, 10 Mar 2005 13:30:11 +0000 (13:30 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Thu, 10 Mar 2005 13:30:11 +0000 (13:30 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@1251 fdb21ef1-2011-0410-befe-b5e4ea1792b1

src/engine/SCons/Platform/__init__.py
src/engine/SCons/Platform/aix.py
src/engine/SCons/Platform/cygwin.py
src/engine/SCons/Platform/hpux.py
src/engine/SCons/Platform/posix.py
src/engine/SCons/Platform/sunos.py
src/engine/SCons/Platform/win32.py

index 0856775a600219a9f670342f4cb7e5105a462e65..9c15a087d175660b3a184f5d301a5790faf9e17a 100644 (file)
@@ -48,6 +48,7 @@ import imp
 import os
 import string
 import sys
+import tempfile
 
 import SCons.Errors
 import SCons.Tool
@@ -116,6 +117,76 @@ class PlatformSpec:
 
     def __str__(self):
         return self.name
+        
+class TempFileMunge:
+    """A callable class.  You can set an Environment variable to this,
+    then call it with a string argument, then it will perform temporary
+    file substitution on it.  This is used to circumvent the long command
+    line limitation.
+
+    Example usage:
+    env["TEMPFILE"] = TempFileMunge
+    env["LINKCOM"] = "${TEMPFILE('$LINK $TARGET $SOURCES')}"
+    """
+    def __init__(self, cmd):
+        self.cmd = cmd
+
+    def __call__(self, target, source, env, for_signature):
+        if for_signature:
+            return self.cmd
+        cmd = env.subst_list(self.cmd, 0, target, source)[0]
+        try:
+            maxline = int(env.subst('$MAXLINELENGTH'))
+        except ValueError:
+            maxline = 2048
+        if (reduce(lambda x, y: x + len(y), cmd, 0) + len(cmd)) <= maxline:
+            return self.cmd
+        else:
+            # We do a normpath because mktemp() has what appears to be
+            # a bug in Win32 that will use a forward slash as a path
+            # delimiter.  Win32's link mistakes that for a command line
+            # switch and barfs.
+            #
+            # We use the .lnk suffix for the benefit of the Phar Lap
+            # linkloc linker, which likes to append an .lnk suffix if
+            # none is given.
+            tmp = os.path.normpath(tempfile.mktemp('.lnk'))
+            native_tmp = SCons.Util.get_native_path(tmp)
+
+            if env['SHELL'] and env['SHELL'] == 'sh':
+                # The sh shell will try to escape the backslashes in the
+                # path, so unescape them.
+                native_tmp = string.replace(native_tmp, '\\', r'\\\\')
+                # In Cygwin, we want to use rm to delete the temporary
+                # file, because del does not exist in the sh shell.
+                rm = env.Detect('rm') or 'del'
+            else:
+                # Don't use 'rm' if the shell is not sh, because rm won't
+                # work with the win32 shells (cmd.exe or command.com) or
+                # win32 path names.
+                rm = 'del'
+
+            args = map(SCons.Util.quote_spaces, cmd[1:])
+            open(tmp, 'w').write(string.join(args, " ") + "\n")
+            # XXX Using the SCons.Action.print_actions value directly
+            # like this is bogus, but expedient.  This class should
+            # really be rewritten as an Action that defines the
+            # __call__() and strfunction() methods and lets the
+            # normal action-execution logic handle whether or not to
+            # print/execute the action.  The problem, though, is all
+            # of that is decided before we execute this method as
+            # part of expanding the $TEMPFILE construction variable.
+            # Consequently, refactoring this will have to wait until
+            # we get more flexible with allowing Actions to exist
+            # independently and get strung together arbitrarily like
+            # Ant tasks.  In the meantime, it's going to be more
+            # user-friendly to not let obsession with architectural
+            # purity get in the way of just being helpful, so we'll
+            # reach into SCons.Action directly.
+            if SCons.Action.print_actions:
+                print("Using tempfile "+native_tmp+" for command line:\n"+
+                      str(cmd[0]) + " " + string.join(args," "))
+            return [ cmd[0], '@' + native_tmp + '\n' + rm, native_tmp ]
     
 def Platform(name = platform_default()):
     """Select a canned Platform specification.
index e0d2e76d27dfb08b336a9f20ab6c9dce140e4cdf..cc1146664d2e06e8f78bfd923954f31d88d680aa 100644 (file)
@@ -57,3 +57,6 @@ def get_xlc(env, xlc, xlc_r, packages):
 
 def generate(env):
     posix.generate(env)
+    #Based on AIX 5.2: ARG_MAX=24576 - 3000 for environment expansion
+    env['MAXLINELENGTH']  = 21576
+
index fad95be4d9ea6f26495802ecf06559e42132a9cf..728eda3929906955f84f1b384aa28b8bec3f542a 100644 (file)
@@ -33,7 +33,7 @@ selection method.
 __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
 
 import posix
-import win32
+from SCons.Platform import TempFileMunge
 
 def generate(env):
     posix.generate(env)
@@ -44,4 +44,5 @@ def generate(env):
     env['SHLIBSUFFIX'] = '.dll'
     env['LIBPREFIXES'] = [ '$LIBPREFIX', '$SHLIBPREFIX' ]
     env['LIBSUFFIXES'] = [ '$LIBSUFFIX', '$SHLIBSUFFIX' ]
-    env['TEMPFILE']    = win32.TempFileMunge
+    env['TEMPFILE']    = TempFileMunge
+    env['MAXLINELENGTH']  = 2048
index 9b3a6bb6d0e5fd9517a8b1a16dcec5fcd91eb8aa..ddbfafc45b3b2c79ed328442c4af3682d454d58e 100644 (file)
@@ -36,3 +36,5 @@ import posix
 
 def generate(env):
     posix.generate(env)
+    #Based on HP-UX11i: ARG_MAX=2048000 - 3000 for environment expansion
+    env['MAXLINELENGTH']  = 2045000
index 24ce2fb5430324f39a7cef4ddec9fa40440a4aeb..b945d1cc636d3c3ca2c04061c46d174fb5987b0d 100644 (file)
@@ -40,6 +40,7 @@ import sys
 import select
 
 import SCons.Util
+from SCons.Platform import TempFileMunge
 
 exitvalmap = {
     2 : 127,
@@ -240,6 +241,10 @@ def generate(env):
     env['SPAWN']          = spawn
     env['SHELL']          = 'sh'
     env['ESCAPE']         = escape
+    env['TEMPFILE']       = TempFileMunge
+    #Based on LINUX: ARG_MAX=ARG_MAX=131072 - 3000 for environment expansion
+    #Note: specific platforms might rise or lower this value
+    env['MAXLINELENGTH']  = 128072
 
     # This platform supports RPATH specifications.
     env['__RPATH'] = '$_RPATH'
index 6b37dd67acaf245e80fec326507900b6501e2511..b2bbb7f2c01f99e15c74ce104371f5e0ec859927 100644 (file)
@@ -36,3 +36,5 @@ import posix
 
 def generate(env):
     posix.generate(env)
+    #Based on sunSparc 8:32bit   ARG_MAX=1048320 - 3000 for environment expansion
+    env['MAXLINELENGTH']  = 1045320
index 62f2ee7e0c2617e040f45f08ee0f16fbb1c0e4d7..382e5b8d233b6b255746e6f2c0b06aa78a9ecb1e 100644 (file)
@@ -36,83 +36,15 @@ import os
 import os.path
 import string
 import sys
-import tempfile
+
 from SCons.Platform.posix import exitvalmap
+from SCons.Platform import TempFileMunge
 
 # XXX See note below about why importing SCons.Action should be
 # eventually refactored.
 import SCons.Action
 import SCons.Util
 
-class TempFileMunge:
-    """A callable class.  You can set an Environment variable to this,
-    then call it with a string argument, then it will perform temporary
-    file substitution on it.  This is used to circumvent the win32 long command
-    line limitation.
-
-    Example usage:
-    env["TEMPFILE"] = TempFileMunge
-    env["LINKCOM"] = "${TEMPFILE('$LINK $TARGET $SOURCES')}"
-    """
-    def __init__(self, cmd):
-        self.cmd = cmd
-
-    def __call__(self, target, source, env, for_signature):
-        if for_signature:
-            return self.cmd
-        cmd = env.subst_list(self.cmd, 0, target, source)[0]
-        try:
-            maxline = int(env.subst('$MAXLINELENGTH'))
-        except ValueError:
-            maxline = 2048
-        if (reduce(lambda x, y: x + len(y), cmd, 0) + len(cmd)) <= maxline:
-            return self.cmd
-        else:
-            # We do a normpath because mktemp() has what appears to be
-            # a bug in Win32 that will use a forward slash as a path
-            # delimiter.  Win32's link mistakes that for a command line
-            # switch and barfs.
-            #
-            # We use the .lnk suffix for the benefit of the Phar Lap
-            # linkloc linker, which likes to append an .lnk suffix if
-            # none is given.
-            tmp = os.path.normpath(tempfile.mktemp('.lnk'))
-            native_tmp = SCons.Util.get_native_path(tmp)
-
-            if env['SHELL'] and env['SHELL'] == 'sh':
-                # The sh shell will try to escape the backslashes in the
-                # path, so unescape them.
-                native_tmp = string.replace(native_tmp, '\\', r'\\\\')
-                # In Cygwin, we want to use rm to delete the temporary
-                # file, because del does not exist in the sh shell.
-                rm = env.Detect('rm') or 'del'
-            else:
-                # Don't use 'rm' if the shell is not sh, because rm won't
-                # work with the win32 shells (cmd.exe or command.com) or
-                # win32 path names.
-                rm = 'del'
-
-            args = map(SCons.Util.quote_spaces, cmd[1:])
-            open(tmp, 'w').write(string.join(args, " ") + "\n")
-            # XXX Using the SCons.Action.print_actions value directly
-            # like this is bogus, but expedient.  This class should
-            # really be rewritten as an Action that defines the
-            # __call__() and strfunction() methods and lets the
-            # normal action-execution logic handle whether or not to
-            # print/execute the action.  The problem, though, is all
-            # of that is decided before we execute this method as
-            # part of expanding the $TEMPFILE construction variable.
-            # Consequently, refactoring this will have to wait until
-            # we get more flexible with allowing Actions to exist
-            # independently and get strung together arbitrarily like
-            # Ant tasks.  In the meantime, it's going to be more
-            # user-friendly to not let obsession with architectural
-            # purity get in the way of just being helpful, so we'll
-            # reach into SCons.Action directly.
-            if SCons.Action.print_actions:
-                print("Using tempfile "+native_tmp+" for command line:\n"+
-                      str(cmd[0]) + " " + string.join(args," "))
-            return [ cmd[0], '@' + native_tmp + '\n' + rm, native_tmp ]
 
 # The upshot of all this is that, if you are using Python 1.5.2,
 # you had better have cmd or command.com in your PATH when you run