Execute commands using os.spawnvpe() if it's available. (J.T. Conklin)
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Sat, 4 Oct 2003 13:26:47 +0000 (13:26 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Sat, 4 Oct 2003 13:26:47 +0000 (13:26 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@809 fdb21ef1-2011-0410-befe-b5e4ea1792b1

src/CHANGES.txt
src/engine/SCons/Platform/posix.py

index 692f3e3f6a1f32a25ecbcda4c2ee12b2e82aecb2..6101191578d0e725f9936b537ee940fd7bca8457 100644 (file)
 
 RELEASE X.XX - XXX
 
+  From J.T. Conklin:
+
+  - On POSIX, execute commands with the more modern os.spawnvpe()
+    function, if it's available.
+
   From Charles Crain:
 
   - Add support for a JARCHDIR variable to control changing to a
index 9b7e11c4852610f7839e954f5933cd7e09928ae2..e6b4b159198259e362e5445203d26d8744de4600 100644 (file)
@@ -75,6 +75,13 @@ def env_spawn(sh, escape, cmd, args, env):
         return stat | 0x80
     return stat >> 8
 
+def spawn_spawn(sh, escape, cmd, args, env):
+    args = [sh, '-c', string.join(args)]
+    stat = os.spawnvpe(os.P_WAIT, sh, args, env)
+    # os.spawnvpe() returns the actual exit code, not the encoding
+    # returned by os.waitpid() or os.system().
+    return stat
+
 def fork_spawn(sh, escape, cmd, args, env):
     pid = os.fork()
     if not pid:
@@ -178,16 +185,29 @@ def piped_fork_spawn(sh, escape, cmd, args, env, stdout, stderr):
 
 
 def generate(env):
+    # If os.spawnvpe() exists, we use it to spawn commands.  Otherwise
+    # if the env utility exists, we use os.system() to spawn commands,
+    # finally we fall back on os.fork()/os.exec().  
+    #
+    # os.spawnvpe() is prefered because it is the most efficient.  But
+    # for Python versions without it, os.system() is prefered because it
+    # is claimed that it works better with threads (i.e. -j) and is more
+    # efficient than forking Python.
+    #
+    # NB: Other people on the scons-users mailing list have claimed that
+    # os.fork()/os.exec() works better than os.system().  There may just
+    # not be a default that works best for all users.
+
+    if os.__dict__.has_key('spawnvpe'):
+        spawn = spawn_spawn
+    elif env.Detect('env'):
+        spawn = env_spawn
+    else:
+        spawn = fork_spawn
 
-    # If the env command exists, then we can use os.system()
-    # to spawn commands, otherwise we fall back on os.fork()/os.exec().
-    # os.system() is prefered because it seems to work better with
-    # threads (i.e. -j) and is more efficient than forking Python.
     if env.Detect('env'):
-        spawn = env_spawn
         pspawn = piped_env_spawn
     else:
-        spawn = fork_spawn
         pspawn = piped_fork_spawn
 
     if not env.has_key('ENV'):