diff --git a/SConstruct b/SConstruct index 210f813646..e9dfae5038 100755 --- a/SConstruct +++ b/SConstruct @@ -126,6 +126,7 @@ AddOption('--with-systemc-tests', action='store_true', help='Build systemc tests') from gem5_scons import Transform, error, warning, summarize_warnings +from gem5_scons import TempFileSpawn import gem5_scons ######################################################################## @@ -134,7 +135,7 @@ import gem5_scons # ######################################################################## -main = Environment(tools=['default', 'git']) +main = Environment(tools=['default', 'git', TempFileSpawn]) from gem5_scons.util import get_termcap termcap = get_termcap() diff --git a/site_scons/gem5_scons/__init__.py b/site_scons/gem5_scons/__init__.py index 9d62c47b3e..5b5777c071 100644 --- a/site_scons/gem5_scons/__init__.py +++ b/site_scons/gem5_scons/__init__.py @@ -40,6 +40,7 @@ import os import sys +import tempfile import textwrap from gem5_scons.util import get_termcap @@ -58,6 +59,25 @@ def strip_build_path(path, env): path = path[len(build_base):] return path +def TempFileSpawn(scons_env): + old_pspawn = scons_env['PSPAWN'] + old_spawn = scons_env['SPAWN'] + + def wrapper(old, sh, esc, cmd, sh_args, *py_args): + with tempfile.NamedTemporaryFile() as temp: + temp.write(' '.join(sh_args).encode()) + temp.flush() + sh_args = [sh, esc(temp.name)] + return old(sh, esc, sh, sh_args, *py_args) + + def new_pspawn(sh, esc, cmd, args, sh_env, stdout, stderr): + return wrapper(old_pspawn, sh, esc, cmd, args, sh_env, stdout, stderr) + def new_spawn(sh, esc, cmd, args, sh_env): + return wrapper(old_spawn, sh, esc, cmd, args, sh_env) + + scons_env['PSPAWN'] = new_pspawn + scons_env['SPAWN'] = new_spawn + # Generate a string of the form: # common/path/prefix/src1, src2 -> tgt1, tgt2 # to print while building.