From 9ca1ac7a1f54fafa93713e3ff6bff693ca180d3e Mon Sep 17 00:00:00 2001 From: Steven Knight Date: Fri, 7 Dec 2001 00:29:20 +0000 Subject: Fix problems with Python callable objects as Builder actions, the associated test, and handling errors returned by a builder. --- src/engine/SCons/Builder.py | 6 +++--- src/engine/SCons/BuilderTests.py | 4 ++-- src/engine/SCons/EnvironmentTests.py | 14 ++++++++++---- src/engine/SCons/Script.py | 2 +- test/Command.py | 12 +++++++++--- test/actions.py | 22 +++++++++++----------- 6 files changed, 36 insertions(+), 24 deletions(-) diff --git a/src/engine/SCons/Builder.py b/src/engine/SCons/Builder.py index 2d2d623..983e32f 100644 --- a/src/engine/SCons/Builder.py +++ b/src/engine/SCons/Builder.py @@ -350,7 +350,8 @@ class ActionBase: if type(t) is type(""): t = [t] dict['TARGETS'] = PathList(map(os.path.normpath, t)) - dict['TARGET'] = dict['TARGETS'][0] + if dict['TARGETS']: + dict['TARGET'] = dict['TARGETS'][0] if kw.has_key('source'): s = kw['source'] del kw['source'] @@ -407,8 +408,7 @@ class FunctionAction(ActionBase): # if print_actions: # XXX: WHAT SHOULD WE PRINT HERE? if execute_actions: - dict = apply(self.subst_dict, (), kw) - return apply(self.function, (), dict) + return apply(self.function, (), kw) def get_contents(self, **kw): """Return the signature contents of this callable action. diff --git a/src/engine/SCons/BuilderTests.py b/src/engine/SCons/BuilderTests.py index 54776ff..4c6ad1f 100644 --- a/src/engine/SCons/BuilderTests.py +++ b/src/engine/SCons/BuilderTests.py @@ -190,11 +190,11 @@ class BuilderTestCase(unittest.TestCase): assert show_string == expect7, show_string def function1(**kw): - open(kw['out'], 'w').write("function1\n") + open(kw['target'], 'w').write("function1\n") return 1 builder = SCons.Builder.Builder(action = function1) - r = builder.execute(out = outfile) + r = builder.execute(target = outfile) assert r == 1 c = test.read(outfile, 'r') assert c == "function1\n", c diff --git a/src/engine/SCons/EnvironmentTests.py b/src/engine/SCons/EnvironmentTests.py index 3341c83..82b19be 100644 --- a/src/engine/SCons/EnvironmentTests.py +++ b/src/engine/SCons/EnvironmentTests.py @@ -234,11 +234,17 @@ class EnvironmentTestCase(unittest.TestCase): assert 'foo1.in' in map(lambda x: x.path, t.sources) assert 'foo2.in' in map(lambda x: x.path, t.sources) - def testFunc(ENV, target, source): + def testFunc(env, target, source): assert target == 'foo.out' - assert source == 'foo1.in foo2.in' or source == 'foo2.in foo1.in' - env.Command(target='foo.out', source=['foo1.in','foo2.in'], - action=testFunc) + assert 'foo1.in' in source and 'foo2.in' in source, source + return 0 + t = env.Command(target='foo.out', source=['foo1.in','foo2.in'], + action=testFunc) + assert t.builder + assert t.builder.action.__class__.__name__ == 'FunctionAction' + t.build() + assert 'foo1.in' in map(lambda x: x.path, t.sources) + assert 'foo2.in' in map(lambda x: x.path, t.sources) def test_subst(self): """Test substituting construction variables within strings diff --git a/src/engine/SCons/Script.py b/src/engine/SCons/Script.py index 3857df6..836fb1a 100644 --- a/src/engine/SCons/Script.py +++ b/src/engine/SCons/Script.py @@ -80,7 +80,7 @@ class BuildTask(SCons.Taskmaster.Task): try: self.target.build() except BuildError, e: - sys.stderr.write("scons: *** [%s] Error %d\n" % (e.node, e.stat)) + sys.stderr.write("scons: *** [%s] Error %s\n" % (e.node, str(e.stat))) raise def failed(self): diff --git a/test/Command.py b/test/Command.py index 2b704fc..244b78c 100644 --- a/test/Command.py +++ b/test/Command.py @@ -40,16 +40,22 @@ file.close() """) test.write('SConstruct', """ +def buildIt(env, target, source): + contents = open(source[0], 'rb').read() + file = open(target, 'wb') + file.write(contents) + file.close() + return 0 + env = Environment() env.Command(target = 'f1.out', source = 'f1.in', - action = r'%s build.py $TARGET $SOURCES') + action = buildIt) env.Command(target = 'f2.out', source = 'f2.in', action = r'%s' + " build.py temp2 $SOURCES\\n" + r'%s' + " build.py $TARGET temp2") env.Command(target = 'f3.out', source = 'f3.in', action = [r'%s build.py temp3 $SOURCES', r'%s build.py $TARGET temp3']) -# Eventually, add ability to do execute Python code. -""" % (python, python, python, python, python)) +""" % (python, python, python, python)) test.write('f1.in', "f1.in\n") diff --git a/test/actions.py b/test/actions.py index cee067e..9ba689b 100644 --- a/test/actions.py +++ b/test/actions.py @@ -68,16 +68,17 @@ test.up_to_date(arguments = '.') test.write('SConstruct', """ import os -import SCons.Util -def func(**kw): - cmd = SCons.Util.scons_subst(r'%s build.py $TARGET 3 $SOURCES', kw, {}) +import string +def func(env, target, source): + cmd = r'%s build.py %%s 3 %%s' %% (target, string.join(source, ' ')) + print cmd return os.system(cmd) B = Builder(name = 'B', action = func) env = Environment(BUILDERS = [B]) env.B(target = 'foo.out', source = 'foo.in') """ % python) -test.run(arguments = '.') +test.run(arguments = '.', stderr = None) test.fail_test(test.read('foo.out') != "3\nfoo.in\n") @@ -85,16 +86,15 @@ test.up_to_date(arguments = '.') test.write('SConstruct', """ import os -import SCons.Util class bld: def __init__(self): - self.cmd = r'%s build.py $TARGET 4 $SOURCES' - def __call__(self, **kw): - cmd = SCons.Util.scons_subst(self.cmd, kw, {}) + self.cmd = r'%s build.py %%s 4 %%s' + def __call__(self, env, target, source): + cmd = self.get_contents(env, target, source) + print cmd return os.system(cmd) - def get_contents(self, **kw): - cmd = SCons.Util.scons_subst(self.cmd, kw, {}) - return cmd + def get_contents(self, env, target, source): + return self.cmd %% (target, string.join(source, ' ')) B = Builder(name = 'B', action = bld()) env = Environment(BUILDERS = [B]) env.B(target = 'foo.out', source = 'foo.in') -- cgit v0.12