global spawn
spawn = func
+def GetCommandHandler():
+ global spawn
+ return spawn
+
class CommandGenerator:
"""
Wrappes a command generator function so the Action() factory
self.command = string
def execute(self, **kw):
- import SCons.Util
dict = apply(self.subst_dict, (), kw)
+ import SCons.Util
cmd_list = SCons.Util.scons_subst_list(self.command, dict, {}, _rm)
for cmd_line in cmd_list:
if len(cmd_line):
if kw.has_key("target") and not SCons.Util.is_List(kw["target"]):
kw["target"] = [kw["target"]]
- cmd_list = apply(self.generator, (), kw)
+ gen_list = apply(self.generator, (), kw)
+ gen_list = map(lambda x: map(str, x), gen_list)
- cmd_list = map(lambda x: map(str, x), cmd_list)
- for cmd_line in cmd_list:
+ # Do environment variable substitution on returned command list
+ dict = apply(self.subst_dict, (), kw)
+ cmd_list = [ ]
+ for gen_line in gen_list:
+ cmd_list.append([])
+ curr_line = cmd_list[-1]
+ for gen_arg in gen_line:
+ arg_list = SCons.Util.scons_subst_list(gen_arg, dict, {})
+ curr_line.extend(arg_list[0])
+ if(len(arg_list) > 1):
+ cmd_list.extend(arg_list[1:])
+ curr_line = cmd_list[-1]
+
+ for cmd_line in filter(lambda x: x, cmd_list):
if print_actions:
self.show(cmd_line)
if execute_actions:
"""Test executing a command generator Action
"""
- def f(dummy, self=self):
+ def f(dummy, env, self=self):
self.dummy = dummy
- return [[""]]
+ return [["$FOO"]]
+ def ch(cmd, args, env, self=self):
+ self.cmd.append(cmd)
+ self.args.append(args)
a = SCons.Action.CommandGeneratorAction(f)
self.dummy = 0
- a.execute(dummy=1)
+ old_hdl = SCons.Action.GetCommandHandler()
+ self.cmd = []
+ self.args = []
+ try:
+ SCons.Action.SetCommandHandler(ch)
+ a.execute(dummy=1, env={ 'FOO' : 'foo baz\nbar ack' })
+ finally:
+ SCons.Action.SetCommandHandler(old_hdl)
assert self.dummy == 1
+ assert self.cmd == [ 'foo', 'bar'], self.cmd
+ assert self.args == [ [ 'foo', 'baz' ], [ 'bar', 'ack' ] ], self.args
del self.dummy
def test_get_contents(self):
globals['Scanner'] = SCons.Scanner.Base
globals['SConscript'] = SConscript
globals['SetCommandHandler'] = SCons.Action.SetCommandHandler
+ globals['GetCommandHandler'] = SCons.Action.GetCommandHandler
return globals
def g(source, target, env):
import sys
python = sys.executable
- return [[python, "build.py", ".temp"] + source,
- [python, "build.py"] + target + [".temp"]]
+ return [[python, "build.py", "$TEMPFILE"] + source,
+ [python, "build.py"] + target + ["$TEMPFILE"]]
b = Builder(name = 'b', generator=g)
-env = Environment(BUILDERS = [b])
+env = Environment(BUILDERS = [b],
+ TEMPFILE=".temp")
env.b(target = 'foo1.out', source = 'foo1.in')
env.b(target = 'foo2.out', source = 'foo2.in')
env.b(target = 'foo3.out', source = 'foo3.in')