summaryrefslogtreecommitdiffstats
path: root/src/engine/SCons/Node
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/SCons/Node')
-rw-r--r--src/engine/SCons/Node/FSTests.py16
-rw-r--r--src/engine/SCons/Node/NodeTests.py86
-rw-r--r--src/engine/SCons/Node/__init__.py52
3 files changed, 42 insertions, 112 deletions
diff --git a/src/engine/SCons/Node/FSTests.py b/src/engine/SCons/Node/FSTests.py
index 5917044..b5c96f9 100644
--- a/src/engine/SCons/Node/FSTests.py
+++ b/src/engine/SCons/Node/FSTests.py
@@ -40,10 +40,16 @@ class Builder:
def __init__(self, factory):
self.factory = factory
- def execute(self, target, source, env):
- global built_it
- built_it = 1
- return 0
+ def get_actions(self):
+ class Action:
+ def execute(self, targets, sources, env):
+ global built_it
+ built_it = 1
+ return 0
+ return [Action()]
+
+ def targets(self, t):
+ return [t]
def source_factory(self, name):
return self.factory(name)
@@ -554,6 +560,8 @@ class FSTestCase(unittest.TestCase):
fs.chdir(fs.Dir('..'))
# Test scanning
+ f1.builder_set(Builder(fs.File))
+ f1.env_set(Environment())
f1.target_scanner = Scanner()
f1.scan()
assert f1.implicit[0].path_ == os.path.join("d1", "f1")
diff --git a/src/engine/SCons/Node/NodeTests.py b/src/engine/SCons/Node/NodeTests.py
index 4054bb9..abfbe1c 100644
--- a/src/engine/SCons/Node/NodeTests.py
+++ b/src/engine/SCons/Node/NodeTests.py
@@ -38,7 +38,7 @@ built_target = None
built_source = None
cycle_detected = None
-class Builder:
+class MyAction:
def execute(self, target, source, env):
global built_it, built_target, built_source, built_args
built_it = 1
@@ -46,8 +46,12 @@ class Builder:
built_source = source
built_args = env
return 0
+
+class Builder:
+ def targets(self, t):
+ return [t]
def get_actions(self):
- return 'xyzzy'
+ return [MyAction()]
def get_contents(self, target, source, env):
return 7
@@ -89,58 +93,14 @@ class Environment:
class NodeTestCase(unittest.TestCase):
- def test_BuildException(self):
- """Test throwing an exception on build failure.
- """
- node = SCons.Node.Node()
- node.builder_set(FailBuilder())
- node.env_set(Environment())
- try:
- node.build()
- except SCons.Errors.BuildError:
- pass
- else:
- raise TestFailed, "did not catch expected BuildError"
-
- node = SCons.Node.Node()
- node.builder_set(ExceptBuilder())
- node.env_set(Environment())
- try:
- node.build()
- except SCons.Errors.BuildError:
- pass
- else:
- raise TestFailed, "did not catch expected BuildError"
-
- node = SCons.Node.Node()
- node.builder_set(ExceptBuilder2())
- node.env_set(Environment())
- try:
- node.build()
- except SCons.Errors.BuildError, e:
- # On a generic (non-BuildError) exception from a Builder,
- # the Node should throw a BuildError exception with
- # the args set to the exception value, type, and traceback.
- assert len(e.args) == 3, `e.args`
- assert e.args[0] == 'foo', e.args[0]
- assert e.args[1] is None
- assert type(e.args[2]) is type(sys.exc_traceback), e.args[2]
- else:
- raise TestFailed, "did not catch expected BuildError"
-
def test_build(self):
"""Test building a node
"""
global built_it
class MyNode(SCons.Node.Node):
- def __init__(self, **kw):
- apply(SCons.Node.Node.__init__, (self,), kw)
- self.prepare_count = 0
def __str__(self):
return self.path
- def prepare(self):
- self.prepare_count = self.prepare_count+ 1
# Make sure it doesn't blow up if no builder is set.
node = MyNode()
node.build()
@@ -153,8 +113,8 @@ class NodeTestCase(unittest.TestCase):
node.sources = ["yyy", "zzz"]
node.build()
assert built_it
- assert type(built_target) == type(MyNode()), type(built_target)
- assert str(built_target) == "xxx", str(built_target)
+ assert type(built_target[0]) == type(MyNode()), type(built_target[0])
+ assert str(built_target[0]) == "xxx", str(built_target[0])
assert built_source == ["yyy", "zzz"], built_source
built_it = None
@@ -166,8 +126,8 @@ class NodeTestCase(unittest.TestCase):
node.overrides = { "foo" : 1, "bar" : 2 }
node.build()
assert built_it
- assert type(built_target) == type(MyNode()), type(built_target)
- assert str(built_target) == "qqq", str(built_target)
+ assert type(built_target[0]) == type(MyNode()), type(built_target[0])
+ assert str(built_target[0]) == "qqq", str(built_target[0])
assert built_source == ["rrr", "sss"], built_source
assert built_args["foo"] == 1, built_args
assert built_args["bar"] == 2, built_args
@@ -185,28 +145,6 @@ class NodeTestCase(unittest.TestCase):
fff.sources = ["hhh", "iii"]
ggg.sources = ["hhh", "iii"]
- built_it = None
- fff.build()
- assert built_it
- ggg.build()
- assert ggg.prepare_count== 1, ggg.prepare_count
- assert type(built_target) == type(MyNode()), type(built_target)
- assert str(built_target) == "fff", str(built_target)
- assert built_source == ["hhh", "iii"], built_source
-
- delattr(lb, 'status')
- fff.prepare_count = 0
- ggg.prepare_count = 0
-
- built_it = None
- ggg.build()
- #assert built_it
- fff.build()
- assert fff.prepare_count== 1, fff.prepare_count
- assert type(built_target) == type(MyNode()), type(built_target)
- assert str(built_target) == "fff", str(built_target)
- assert built_source == ["hhh", "iii"], built_source
-
def test_depends_on(self):
parent = SCons.Node.Node()
child = SCons.Node.Node()
@@ -249,8 +187,8 @@ class NodeTestCase(unittest.TestCase):
"""
node = SCons.Node.Node()
node.builder_set(Builder())
- a = node.get_actions()
- assert a == 'xyzzy', a
+ a = node.builder.get_actions()
+ assert isinstance(a[0], MyAction), a[0]
def test_set_bsig(self):
"""Test setting a Node's signature
diff --git a/src/engine/SCons/Node/__init__.py b/src/engine/SCons/Node/__init__.py
index 82dfd7e..ca6e8eb 100644
--- a/src/engine/SCons/Node/__init__.py
+++ b/src/engine/SCons/Node/__init__.py
@@ -46,13 +46,10 @@ __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
-import string
-import types
import copy
-import sys
-import SCons.Sig
+import types
-from SCons.Errors import BuildError, UserError
+import SCons.Sig
import SCons.Util
# Node states
@@ -110,38 +107,25 @@ class Node:
def generate_build_env(self):
return self.env.Override(self.overrides)
- def get_actions(self):
- """Fetch the action list to build."""
- return self.builder.get_actions()
-
def build(self):
- """Actually build the node. Return the status from the build."""
- # This method is called from multiple threads in a parallel build,
- # so only do thread safe stuff here. Do thread unsafe stuff in built().
+ """Actually build the node.
+
+ This method is called from multiple threads in a parallel build,
+ so only do thread safe stuff here. Do thread unsafe stuff in
+ built().
+ """
if not self.builder:
return None
- try:
- # If this Builder instance has already been called,
- # there will already be an associated status.
- stat = self.builder.status
- except AttributeError:
- try:
- stat = self.builder.execute(self, self.sources, self.generate_build_env())
- except KeyboardInterrupt:
- raise
- except UserError:
- raise
- except BuildError:
- raise
- except:
- raise BuildError(self, "Exception",
- sys.exc_type,
- sys.exc_value,
- sys.exc_traceback)
- if stat:
- raise BuildError(node = self, errstr = "Error %d" % stat)
-
- return stat
+ action_list = self.builder.get_actions()
+ if not action_list:
+ return
+ targets = self.builder.targets(self)
+ env = self.generate_build_env()
+ for action in action_list:
+ stat = action.execute(targets, self.sources, env)
+ if stat:
+ raise SCons.Errors.BuildError(node = self,
+ errstr = "Error %d" % stat)
def built(self):
"""Called just after this node is sucessfully built."""