diff options
Diffstat (limited to 'src/engine/SCons/Node')
| -rw-r--r-- | src/engine/SCons/Node/FSTests.py | 3 | ||||
| -rw-r--r-- | src/engine/SCons/Node/NodeTests.py | 39 | ||||
| -rw-r--r-- | src/engine/SCons/Node/__init__.py | 19 |
3 files changed, 39 insertions, 22 deletions
diff --git a/src/engine/SCons/Node/FSTests.py b/src/engine/SCons/Node/FSTests.py index 4031d3f..747fdf1 100644 --- a/src/engine/SCons/Node/FSTests.py +++ b/src/engine/SCons/Node/FSTests.py @@ -93,6 +93,7 @@ class Builder: self.env = Environment() self.overrides = {} self.action = action + self.target_scanner = None def targets(self, t): return [t] @@ -868,7 +869,7 @@ class FSTestCase(unittest.TestCase): f1.builder_set(Builder(fs.File)) f1.env_set(Environment()) xyz = fs.File("xyz") - f1.target_scanner = Scanner(xyz) + f1.builder.target_scanner = Scanner(xyz) f1.scan() assert f1.implicit[0].path == "xyz" diff --git a/src/engine/SCons/Node/NodeTests.py b/src/engine/SCons/Node/NodeTests.py index 7282f80..12224d3 100644 --- a/src/engine/SCons/Node/NodeTests.py +++ b/src/engine/SCons/Node/NodeTests.py @@ -117,10 +117,13 @@ class Environment: self._dict.update(dict) def get_calculator(self): return SCons.Sig.default_calc + def get_scanner(self, scanner_key): + return self._dict['SCANNERS'][0] class Builder: - def __init__(self, is_explicit=1): - self.env = Environment() + def __init__(self, env=None, is_explicit=1): + if env is None: env = Environment() + self.env = env self.overrides = {} self.action = MyAction() self.source_factory = MyNode @@ -796,8 +799,6 @@ class NodeTestCase(unittest.TestCase): def test_get_source_scanner(self): """Test fetching the source scanner for a Node """ - class Builder: - pass target = SCons.Node.Node() source = SCons.Node.Node() s = target.get_source_scanner(source) @@ -807,19 +808,34 @@ class NodeTestCase(unittest.TestCase): ts2 = Scanner() ts3 = Scanner() - source.backup_source_scanner = ts1 - s = target.get_source_scanner(source) + class Builder1(Builder): + def __call__(self, source): + r = SCons.Node.Node() + r.builder = self + return [r] + class Builder2(Builder1): + def __init__(self, scanner): + self.source_scanner = scanner + + builder = Builder2(ts1) + + targets = builder([source]) + s = targets[0].get_source_scanner(source) assert s is ts1, s - target.builder = Builder() + target.builder_set(Builder2(ts1)) target.builder.source_scanner = ts2 s = target.get_source_scanner(source) assert s is ts2, s - target.source_scanner = ts3 - s = target.get_source_scanner(source) + builder = Builder1(env=Environment(SCANNERS = [ts3])) + + targets = builder([source]) + + s = targets[0].get_source_scanner(source) assert s is ts3, s + def test_scan(self): """Test Scanner functionality """ @@ -831,8 +847,7 @@ class NodeTestCase(unittest.TestCase): d = MyNode("ddd") node.found_includes = [d] - assert node.target_scanner == None, node.target_scanner - node.target_scanner = s + node.builder.target_scanner = s assert node.implicit is None node.scan() @@ -866,7 +881,7 @@ class NodeTestCase(unittest.TestCase): sn = StoredNode("eee") sn._children = ['fake'] sn.builder_set(Builder()) - sn.target_scanner = s + sn.builder.target_scanner = s sn.scan() diff --git a/src/engine/SCons/Node/__init__.py b/src/engine/SCons/Node/__init__.py index 3b0d3a4..24ea2a9 100644 --- a/src/engine/SCons/Node/__init__.py +++ b/src/engine/SCons/Node/__init__.py @@ -68,7 +68,7 @@ executed = 4 failed = 5 stack = 6 # nodes that are in the current Taskmaster execution stack -# controls whether implicit depedencies are cached: +# controls whether implicit dependencies are cached: implicit_cache = 0 # controls whether implicit dep changes are ignored: @@ -119,9 +119,6 @@ class Node: self.implicit = None # implicit (scanned) dependencies (None means not scanned yet) self.waiting_parents = [] self.wkids = None # Kids yet to walk, when it's an array - self.target_scanner = None # explicit scanner from this node's Builder - self.source_scanner = None - self.backup_source_scanner = None self.env = None self.state = None @@ -431,15 +428,17 @@ class Node: NOTE: "self" is the target being built, "node" is the source file for which we want to fetch the scanner. """ - if self.source_scanner: - return self.source_scanner + if not self.has_builder(): + return None # if not buildable, can't have sources... try: scanner = self.builder.source_scanner if scanner: return scanner except AttributeError: pass - return node.backup_source_scanner or None + + # No scanner specified by builder, try env['SCANNERS'] + return self.get_build_env().get_scanner(node.scanner_key()) def scan(self): """Scan this node's dependents for implicit dependencies.""" @@ -481,8 +480,10 @@ class Node: self._add_child(self.implicit, self.implicit_dict, deps) # scan this node itself for implicit dependencies - deps = self.get_implicit_deps(build_env, self.target_scanner, self) - self._add_child(self.implicit, self.implicit_dict, deps) + scanner = self.builder.target_scanner + if scanner: + deps = self.get_implicit_deps(build_env, scanner, self) + self._add_child(self.implicit, self.implicit_dict, deps) # XXX See note above re: --implicit-cache. #if implicit_cache: |
