diff options
| author | Steven Knight <knight@baldmt.com> | 2001-10-10 21:50:55 (GMT) |
|---|---|---|
| committer | Steven Knight <knight@baldmt.com> | 2001-10-10 21:50:55 (GMT) |
| commit | 385aabf686d687432fb81fa2e68b77e3f11f06f8 (patch) | |
| tree | 319adfb4dc23d8c7b1e55fb2e691898d8b544481 /src/engine/SCons/Taskmaster.py | |
| parent | f72203b4610a100fce3065f5c5c4c41e92fc5883 (diff) | |
| download | SCons-385aabf686d687432fb81fa2e68b77e3f11f06f8.zip SCons-385aabf686d687432fb81fa2e68b77e3f11f06f8.tar.gz SCons-385aabf686d687432fb81fa2e68b77e3f11f06f8.tar.bz2 | |
Add -i (ignore errors) support
Diffstat (limited to 'src/engine/SCons/Taskmaster.py')
| -rw-r--r-- | src/engine/SCons/Taskmaster.py | 62 |
1 files changed, 32 insertions, 30 deletions
diff --git a/src/engine/SCons/Taskmaster.py b/src/engine/SCons/Taskmaster.py index 651769d..3fd787e 100644 --- a/src/engine/SCons/Taskmaster.py +++ b/src/engine/SCons/Taskmaster.py @@ -44,8 +44,9 @@ class Task: def execute(self): self.target.build() - - + def set_state(self, state): + return self.target.set_state(state) + def current(node): """Default SCons build engine is-it-current function. @@ -58,40 +59,41 @@ def current(node): class Taskmaster: """A generic Taskmaster for handling a bunch of targets. + + Classes that override methods of this class should call + the base class method, so this class can do it's thing. """ def __init__(self, targets=[], tasker=Task, current=current): - self.targets = targets + self.walkers = map(SCons.Node.Walker, targets) self.tasker = tasker self.current = current - self.num_iterated = 0 - self.walker = None - - def next_node(self): - t = None - if self.walker: - t = self.walker.next() - if t == None and self.num_iterated < len(self.targets): - t = self.targets[self.num_iterated] - self.num_iterated = self.num_iterated + 1 - t.top_target = 1 - self.walker = SCons.Node.Walker(t) - t = self.walker.next() - top = None - if hasattr(t, "top_target"): - top = 1 - return t, top + self.targets = targets def next_task(self): - n, top = self.next_node() - while n != None: - if self.current(n): - self.up_to_date(n) + while self.walkers: + n = self.walkers[0].next() + if n == None: + self.walkers.pop(0) + elif n.get_state() == SCons.Node.up_to_date: + self.up_to_date(n, self.walkers[0].is_done()) + elif n.get_state() == SCons.Node.failed: + # XXX do the right thing here + pass + elif n.get_state() == SCons.Node.executing: + # XXX do the right thing here + pass + elif n.get_state() == SCons.Node.executed: + # skip this node because it has already been executed + pass + elif self.current(n): + n.set_state(SCons.Node.up_to_date) + self.up_to_date(n, self.walkers[0].is_done()) else: + n.set_state(SCons.Node.executing) return self.tasker(n) - n, top = self.next_node() - return None - + return None + def is_blocked(self): return 0 @@ -99,8 +101,8 @@ class Taskmaster: pass def executed(self, task): - pass + task.set_state(SCons.Node.executed) def failed(self, task): - self.walker = None - self.num_iterated = len(self.targets) + self.walkers = [] + task.set_state(SCons.Node.failed) |
