summaryrefslogtreecommitdiff
path: root/tools/building.py
diff options
context:
space:
mode:
authorGrissiom <[email protected]>2014-05-24 13:04:49 +0800
committerGrissiom <[email protected]>2014-05-24 13:04:49 +0800
commit66ac9821de92f0015ba070b4285e8df1fa822bb6 (patch)
tree9e18cddf5be956b13fe2ec4721d2dc64c203d6a3 /tools/building.py
parentadbe1ea3902d4adc47fd6a03ba89db89abf5cac3 (diff)
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.
Diffstat (limited to 'tools/building.py')
-rw-r--r--tools/building.py45
1 files changed, 32 insertions, 13 deletions
diff --git a/tools/building.py b/tools/building.py
index 61c1de743d..726056533f 100644
--- a/tools/building.py
+++ b/tools/building.py
@@ -12,24 +12,43 @@ Env = None
class Win32Spawn:
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
newargs = string.join(args[1:], ' ')
cmdline = cmd + " " + newargs
startupinfo = subprocess.STARTUPINFO()
+ startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
+
+ # Make sure the env is constructed by strings
+ _e = {k: str(v) for k, v in env.items()}
- proc = subprocess.Popen(cmdline, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
- stderr=subprocess.PIPE, startupinfo=startupinfo, shell = False)
- data, err = proc.communicate()
- rv = proc.wait()
- if data:
- print data
- if err:
- print err
+ # 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.
+ 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
- if rv:
- return rv
- return 0
+ return proc.wait()
def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = []):
import SCons.cpp
@@ -59,11 +78,11 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [
env['LIBDIRPREFIX'] = '--userlibpath '
# patch for win32 spawn
- if env['PLATFORM'] == 'win32' and rtconfig.PLATFORM == 'gcc':
+ if env['PLATFORM'] == 'win32':
win32_spawn = Win32Spawn()
win32_spawn.env = env
env['SPAWN'] = win32_spawn.spawn
-
+
if env['PLATFORM'] == 'win32':
os.environ['PATH'] = rtconfig.EXEC_PATH + ";" + os.environ['PATH']
else: