Scons: fix the Win32Spawn
Windows(tm) CreateProcess does not use the env passed to it to find the executables. So we have to modify our own PATH to make Popen work. Also, detect the cmd build-in commands and execute it directly. Tested on MDK toolchain on RB4088 and the MSVS toolchain on simulator BSP.
This commit is contained in:
parent
adbe1ea390
commit
66ac9821de
|
@ -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:
|
||||||
|
|
Loading…
Reference in New Issue