From 66ac9821de92f0015ba070b4285e8df1fa822bb6 Mon Sep 17 00:00:00 2001 From: Grissiom Date: Sat, 24 May 2014 13:04:49 +0800 Subject: [PATCH] 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. --- tools/building.py | 45 ++++++++++++++++++++++++++++++++------------- 1 file 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 - 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 + # Make sure the env is constructed by strings + _e = {k: str(v) for k, v in env.items()} - if rv: - return rv - return 0 + # 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 + + 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: