summaryrefslogtreecommitdiffstats
path: root/src/engine/SCons/Taskmaster.py
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2002-03-20 16:45:30 (GMT)
committerSteven Knight <knight@baldmt.com>2002-03-20 16:45:30 (GMT)
commita9272652019c6d0cad2f20737e210f820ec9394d (patch)
tree6c66bb13fa20cbd1e46b837e2ab734039cb68b6e /src/engine/SCons/Taskmaster.py
parent70d4bf67b7fefce28d76d451c959ba633720214e (diff)
downloadSCons-a9272652019c6d0cad2f20737e210f820ec9394d.zip
SCons-a9272652019c6d0cad2f20737e210f820ec9394d.tar.gz
SCons-a9272652019c6d0cad2f20737e210f820ec9394d.tar.bz2
Fix subtle problems in end cases with using multiple scanners on a Node.
Diffstat (limited to 'src/engine/SCons/Taskmaster.py')
-rw-r--r--src/engine/SCons/Taskmaster.py23
1 files changed, 16 insertions, 7 deletions
diff --git a/src/engine/SCons/Taskmaster.py b/src/engine/SCons/Taskmaster.py
index 0106f46..404355e 100644
--- a/src/engine/SCons/Taskmaster.py
+++ b/src/engine/SCons/Taskmaster.py
@@ -54,10 +54,11 @@ class Task:
Note that it's generally a good idea for sub-classes to call
these methods explicitly to update state, etc., rather than
roll their own interaction with Taskmaster from scratch."""
- def __init__(self, tm, targets, top):
+ def __init__(self, tm, targets, top, scanner = None):
self.tm = tm
self.targets = targets
self.top = top
+ self.scanner = scanner
def execute(self):
if self.targets[0].get_state() != SCons.Node.up_to_date:
@@ -89,8 +90,9 @@ class Task:
parents = {}
for p in reduce(lambda x, y: x + y.get_parents(), self.targets, []):
parents[p] = 1
- ready = filter(lambda x: (x.get_state() == SCons.Node.pending
- and x.children_are_executed()),
+ ready = filter(lambda x, s=self.scanner:
+ (x.get_state() == SCons.Node.pending
+ and x.children_are_executed(s)),
parents.keys())
tasks = {}
for t in map(lambda r: r.task, ready):
@@ -171,9 +173,12 @@ class Taskmaster:
# (finished or currently executing). Find another one.
return []
# Scan the file before fetching its children().
- node.scan()
+ if parent:
+ scanner = parent.src_scanner_get(node.scanner_key())
+ else:
+ scanner = None
return filter(lambda x: x.get_state() != SCons.Node.up_to_date,
- node.children())
+ node.children(scanner))
def cycle_error(node, stack):
if node.builder:
@@ -201,8 +206,12 @@ class Taskmaster:
tlist = node.builder.targets(node)
except AttributeError:
tlist = [ node ]
- task = self.tasker(self, tlist, self.walkers[0].is_done())
- if not tlist[0].children_are_executed():
+ if parent:
+ scanner = parent.src_scanner_get(node.scanner_key())
+ else:
+ scanner = None
+ task = self.tasker(self, tlist, self.walkers[0].is_done(), scanner)
+ if not tlist[0].children_are_executed(scanner):
for t in tlist:
t.set_state(SCons.Node.pending)
t.task = task