summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2001-12-07 00:29:20 (GMT)
committerSteven Knight <knight@baldmt.com>2001-12-07 00:29:20 (GMT)
commit9ca1ac7a1f54fafa93713e3ff6bff693ca180d3e (patch)
tree7644c76e7330ecea3b6c1a8dfe7bc5b68b1ddd62
parenta12957948f90147743ecf2368a9a348c8619a09b (diff)
downloadSCons-9ca1ac7a1f54fafa93713e3ff6bff693ca180d3e.zip
SCons-9ca1ac7a1f54fafa93713e3ff6bff693ca180d3e.tar.gz
SCons-9ca1ac7a1f54fafa93713e3ff6bff693ca180d3e.tar.bz2
Fix problems with Python callable objects as Builder actions, the associated test, and handling errors returned by a builder.
-rw-r--r--src/engine/SCons/Builder.py6
-rw-r--r--src/engine/SCons/BuilderTests.py4
-rw-r--r--src/engine/SCons/EnvironmentTests.py14
-rw-r--r--src/engine/SCons/Script.py2
-rw-r--r--test/Command.py12
-rw-r--r--test/actions.py22
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')