Merge pull request #283 from grissiom/win32spawn

Scons: fix the Win32Spawn
This commit is contained in:
Bernard Xiong 2014-05-25 08:19:20 +08:00
commit 69621ff5cc
1 changed files with 32 additions and 13 deletions

View File

@ -12,24 +12,43 @@ Env = None
class Win32Spawn: class Win32Spawn:
def spawn(self, sh, escape, cmd, args, env): def spawn(self, sh, escape, cmd, args, env):
# deal with the cmd build-in commands which cannot be used in
# subprocess.Popen
if cmd == 'del':
for f in args[1:]:
try:
os.remove(f)
except Exception as e:
print 'Error removing file: %s' % e
return -1
return 0
import subprocess import subprocess
newargs = string.join(args[1:], ' ') newargs = string.join(args[1:], ' ')
cmdline = cmd + " " + newargs cmdline = cmd + " " + newargs
startupinfo = subprocess.STARTUPINFO() startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
proc = subprocess.Popen(cmdline, stdin=subprocess.PIPE, stdout=subprocess.PIPE, # Make sure the env is constructed by strings
stderr=subprocess.PIPE, startupinfo=startupinfo, shell = False) _e = {k: str(v) for k, v in env.items()}
data, err = proc.communicate()
rv = proc.wait()
if data:
print data
if err:
print err
if rv: # Windows(tm) CreateProcess does not use the env passed to it to find
return rv # the executables. So we have to modify our own PATH to make Popen
return 0 # work.
old_path = os.environ['PATH']
os.environ['PATH'] = _e['PATH']
try:
proc = subprocess.Popen(cmdline, env=_e,
startupinfo=startupinfo, shell=False)
except Exception as e:
print 'Error in Popen: %s' % e
return -1
finally:
os.environ['PATH'] = old_path
return proc.wait()
def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = []): def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = []):
import SCons.cpp import SCons.cpp
@ -59,11 +78,11 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [
env['LIBDIRPREFIX'] = '--userlibpath ' env['LIBDIRPREFIX'] = '--userlibpath '
# patch for win32 spawn # patch for win32 spawn
if env['PLATFORM'] == 'win32' and rtconfig.PLATFORM == 'gcc': if env['PLATFORM'] == 'win32':
win32_spawn = Win32Spawn() win32_spawn = Win32Spawn()
win32_spawn.env = env win32_spawn.env = env
env['SPAWN'] = win32_spawn.spawn env['SPAWN'] = win32_spawn.spawn
if env['PLATFORM'] == 'win32': if env['PLATFORM'] == 'win32':
os.environ['PATH'] = rtconfig.EXEC_PATH + ";" + os.environ['PATH'] os.environ['PATH'] = rtconfig.EXEC_PATH + ";" + os.environ['PATH']
else: else: