summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2003-05-04 18:26:04 (GMT)
committerSteven Knight <knight@baldmt.com>2003-05-04 18:26:04 (GMT)
commite591784eb29edfaf2760024f57ee1462f1bae1f3 (patch)
treea8637b156562104df4d39ab5f7b098446778cf0a
parentabe3ed8cdeb3d5a16ab3448f768f43c6aa1feeca (diff)
downloadSCons-e591784eb29edfaf2760024f57ee1462f1bae1f3.zip
SCons-e591784eb29edfaf2760024f57ee1462f1bae1f3.tar.gz
SCons-e591784eb29edfaf2760024f57ee1462f1bae1f3.tar.bz2
If we added a temporary builder to a Node while calling the emitter, don't remove it if the emitter changed it on us.
-rw-r--r--src/engine/SCons/Builder.py7
-rw-r--r--src/engine/SCons/BuilderTests.py19
2 files changed, 24 insertions, 2 deletions
diff --git a/src/engine/SCons/Builder.py b/src/engine/SCons/Builder.py
index 22b177e..19cbe27 100644
--- a/src/engine/SCons/Builder.py
+++ b/src/engine/SCons/Builder.py
@@ -306,11 +306,14 @@ class BuilderBase:
target, source = self.emitter(target=tlist, source=slist, env=env)
- # Now delete the temporary builders that we attached to the
+ # Now delete the temporary builders that we attached to any
# new targets, so that _init_nodes() doesn't do weird stuff
# to them because it thinks they already have builders.
for t in new_targets:
- t.builder = None
+ if t.builder is self:
+ # Only delete the temporary builder if the emitter
+ # didn't change it on us.
+ t.builder = None
# Have to call arg2nodes yet again, since it is legal for
# emitters to spit out strings as well as Node instances.
diff --git a/src/engine/SCons/BuilderTests.py b/src/engine/SCons/BuilderTests.py
index 02c570c..c71f18f 100644
--- a/src/engine/SCons/BuilderTests.py
+++ b/src/engine/SCons/BuilderTests.py
@@ -637,6 +637,25 @@ class BuilderTestCase(unittest.TestCase):
node_factory=MyNode)
assert builder2 == builder2a, repr(builder2.__dict__) + "\n" + repr(builder2a.__dict__)
+ # Test that, if an emitter sets a builder on the passed-in
+ # targets and passes back new targets, the new builder doesn't
+ # get overwritten.
+ new_builder = SCons.Builder.Builder(action='new')
+ node = MyNode('foo8')
+ new_node = MyNode('foo8.new')
+ def emit3(target, source, env, nb=new_builder, nn=new_node):
+ for t in target:
+ t.builder = nb
+ return [nn], source
+
+ builder3=SCons.Builder.Builder(action='foo',
+ emitter=emit3,
+ node_factory=MyNode)
+ tgt = builder3(env, target=node, source='bar')
+ assert tgt is new_node, tgt
+ assert tgt.builder is builder3, tgt.builder
+ assert node.builder is new_builder, node.builder
+
def test_no_target(self):
"""Test deducing the target from the source."""