diff options
| author | Steven Knight <knight@baldmt.com> | 2003-07-23 14:20:43 (GMT) |
|---|---|---|
| committer | Steven Knight <knight@baldmt.com> | 2003-07-23 14:20:43 (GMT) |
| commit | 5d238601a22fa009de4df38e0257c405f9b243db (patch) | |
| tree | fb5cb1676ff40c4f66c49b4fb5893fa30d72765a /src/engine | |
| parent | 628a6c6cbdbcbcceec438d2063f51b16e65f37aa (diff) | |
| download | SCons-5d238601a22fa009de4df38e0257c405f9b243db.zip SCons-5d238601a22fa009de4df38e0257c405f9b243db.tar.gz SCons-5d238601a22fa009de4df38e0257c405f9b243db.tar.bz2 | |
Fix a problem when using --cache-show.
Diffstat (limited to 'src/engine')
| -rw-r--r-- | src/engine/SCons/Action.py | 28 | ||||
| -rw-r--r-- | src/engine/SCons/ActionTests.py | 33 | ||||
| -rw-r--r-- | src/engine/SCons/Node/FS.py | 11 | ||||
| -rw-r--r-- | src/engine/SCons/Node/FSTests.py | 30 |
4 files changed, 93 insertions, 9 deletions
diff --git a/src/engine/SCons/Action.py b/src/engine/SCons/Action.py index 49b0cb1..c9186a4 100644 --- a/src/engine/SCons/Action.py +++ b/src/engine/SCons/Action.py @@ -299,6 +299,13 @@ class CommandGeneratorAction(ActionBase): raise SCons.Errors.UserError("Object returned from command generator: %s cannot be used to create an Action." % repr(ret)) return gen_cmd + def strfunction(self, target, source, env): + if not SCons.Util.is_List(source): + source = [source] + rsources = map(rfile, source) + act = self.__generate(target, source, env, 0) + return act.strfunction(target, rsources, env) + def __call__(self, target, source, env): if not SCons.Util.is_List(source): source = [source] @@ -322,10 +329,17 @@ class LazyCmdGenerator: def __init__(self, var): self.var = SCons.Util.to_String(var) + def strfunction(self, target, source, env): + try: + return env[self.var] + except KeyError: + # The variable reference substitutes to nothing. + return '' + def __call__(self, target, source, env, for_signature): - if env.has_key(self.var): + try: return env[self.var] - else: + except KeyError: # The variable reference substitutes to nothing. return '' @@ -394,6 +408,16 @@ class ListAction(ActionBase): def get_actions(self): return self.list + def strfunction(self, target, source, env): + s = [] + for l in self.list: + if l.strfunction: + x = l.strfunction(target, source, env) + if not SCons.Util.is_List(x): + x = [x] + s.extend(x) + return string.join(s, "\n") + def __call__(self, target, source, env): for l in self.list: r = l(target, source, env) diff --git a/src/engine/SCons/ActionTests.py b/src/engine/SCons/ActionTests.py index d14edfd..64b5f53 100644 --- a/src/engine/SCons/ActionTests.py +++ b/src/engine/SCons/ActionTests.py @@ -764,6 +764,19 @@ class CommandGeneratorActionTestCase(unittest.TestCase): a = SCons.Action.CommandGeneratorAction(f) assert a.generator == f + def test_strfunction(self): + """Test the command generator Action string function + """ + def f(target, source, env, for_signature, self=self): + dummy = env['dummy'] + self.dummy = dummy + return "$FOO" + a = SCons.Action.CommandGeneratorAction(f) + self.dummy = 0 + s = a.strfunction([], [], env=Environment(FOO='xyzzy', dummy=1)) + assert self.dummy == 1, self.dummy + assert s == ['xyzzy'], s + def test_execute(self): """Test executing a command generator Action """ @@ -980,6 +993,17 @@ class ListActionTestCase(unittest.TestCase): g = l[1].get_actions() assert g == [l[1]], g + def test_strfunction(self): + """Test the string function for a list of subsidiary Actions + """ + def f(target,source,env): + pass + def g(target,source,env): + pass + a = SCons.Action.ListAction([f, g, "XXX", f]) + s = a.strfunction([], [], Environment()) + assert s == "f([], [])\ng([], [])\nXXX\nf([], [])", s + def test_execute(self): """Test executing a list of subsidiary Actions """ @@ -1041,6 +1065,15 @@ class LazyActionTestCase(unittest.TestCase): assert isinstance(a9, SCons.Action.CommandGeneratorAction), a10 assert a10.generator.var == 'FOO', a10.generator.var + def test_strfunction(self): + """Test the lazy-evaluation Action string function + """ + def f(target, source, env): + pass + a = SCons.Action.Action('$BAR') + s = a.strfunction([], [], env=Environment(BAR=f, s=self)) + assert s == "f([], [])", s + def test_execute(self): """Test executing a lazy-evaluation Action """ diff --git a/src/engine/SCons/Node/FS.py b/src/engine/SCons/Node/FS.py index a17cee0..12b8869 100644 --- a/src/engine/SCons/Node/FS.py +++ b/src/engine/SCons/Node/FS.py @@ -1246,11 +1246,12 @@ class File(Entry): if self.fs.cache_show: if CacheRetrieveSilent(self, None, None) == 0: def do_print(action, targets, sources, env, self=self): - al = action.strfunction(targets, self.sources, env) - if not SCons.Util.is_List(al): - al = [al] - for a in al: - action.show(a) + if action.strfunction: + al = action.strfunction(targets, self.sources, env) + if not SCons.Util.is_List(al): + al = [al] + for a in al: + action.show(a) self._for_each_action(do_print) return elif CacheRetrieve(self, None, None) == 0: diff --git a/src/engine/SCons/Node/FSTests.py b/src/engine/SCons/Node/FSTests.py index 13f171e..a80c8f9 100644 --- a/src/engine/SCons/Node/FSTests.py +++ b/src/engine/SCons/Node/FSTests.py @@ -86,11 +86,11 @@ class Action: return [self] class Builder: - def __init__(self, factory): + def __init__(self, factory, action=Action()): self.factory = factory self.env = Environment() self.overrides = {} - self.action = Action() + self.action = action def get_actions(self): return [self] @@ -1499,6 +1499,32 @@ class CacheDirTestCase(unittest.TestCase): SCons.Warnings.warningAsException(old_warn_exceptions) SCons.Warnings.suppressWarningClass(SCons.Warnings.CacheWriteErrorWarning) + # Verify that we don't blow up if there's no strfunction() + # for an action. + act = Action() + act.strfunction = None + f8 = fs.File("cd.f8") + f8.builder_set(Builder(fs.File, action=act)) + f8.env_set(Environment()) + try: + SCons.Node.FS.CacheRetrieveSilent = retrieve_succeed + self.retrieved = [] + built_it = None + + f8.build() + assert self.retrieved == [f8], self.retrieved + assert built_it is None, built_it + + SCons.Node.FS.CacheRetrieveSilent = retrieve_fail + self.retrieved = [] + built_it = None + + f8.build() + assert self.retrieved == [f8], self.retrieved + assert built_it, built_it + finally: + SCons.Node.FS.CacheRetrieveSilent = save_CacheRetrieveSilent + class clearTestCase(unittest.TestCase): def runTest(self): fs = SCons.Node.FS.FS() |
