Changes to the CommandGenerator functionality. (Charles Crain)
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Fri, 8 Mar 2002 06:01:39 +0000 (06:01 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Fri, 8 Mar 2002 06:01:39 +0000 (06:01 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@287 fdb21ef1-2011-0410-befe-b5e4ea1792b1

src/engine/SCons/Action.py
src/engine/SCons/ActionTests.py
src/engine/SCons/Script/SConscript.py
test/CommandGenerator.py

index 7bee0828ba049f474c94702d1c140d901bb36422..26595d664f1a3fc2de129bd1712bf9f00e924ea9 100644 (file)
@@ -163,6 +163,10 @@ def SetCommandHandler(func):
     global spawn
     spawn = func
 
+def GetCommandHandler():
+    global spawn
+    return spawn
+
 class CommandGenerator:
     """
     Wrappes a command generator function so the Action() factory
@@ -264,8 +268,8 @@ class CommandAction(ActionBase):
         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):
@@ -324,10 +328,23 @@ class CommandGeneratorAction(ActionBase):
         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:
index 461da6e2126d7297afcd1b33d64335731eee4523..592fa82f8df52f33654001e1169da1047a94dee0 100644 (file)
@@ -156,14 +156,26 @@ class CommandGeneratorActionTestCase(unittest.TestCase):
         """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):
index 7210bed646a86f1b6b62b4bb1e861b669c0f5bf2..d50f521a238c35bc2101e392d769d332271eebe9 100644 (file)
@@ -189,4 +189,5 @@ def BuildDefaultGlobals():
     globals['Scanner']           = SCons.Scanner.Base
     globals['SConscript']        = SConscript
     globals['SetCommandHandler'] = SCons.Action.SetCommandHandler
+    globals['GetCommandHandler'] = SCons.Action.GetCommandHandler
     return globals
index c1413d64910205d50eaf6d1454361c120da2a6ca..a85b07a89e538c47c54ee5876925fb81a91c21a3 100644 (file)
@@ -45,11 +45,12 @@ test.write('SConstruct', """
 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')