diff options
-rw-r--r-- | src/engine/SCons/Builder.py | 19 | ||||
-rw-r--r-- | src/engine/SCons/Environment.py | 27 | ||||
-rw-r--r-- | src/engine/SCons/Node/NodeTests.py | 59 | ||||
-rw-r--r-- | src/engine/SCons/Node/__init__.py | 37 | ||||
-rw-r--r-- | src/engine/SCons/Scanner/C.py | 7 | ||||
-rw-r--r-- | src/engine/SCons/Scanner/Prog.py | 5 | ||||
-rw-r--r-- | src/engine/SCons/Script/SConscript.py | 5 | ||||
-rw-r--r-- | src/engine/SCons/Util.py | 36 | ||||
-rw-r--r-- | src/engine/SCons/UtilTests.py | 51 |
9 files changed, 129 insertions, 117 deletions
diff --git a/src/engine/SCons/Builder.py b/src/engine/SCons/Builder.py index a62d91d..46fe9cb 100644 --- a/src/engine/SCons/Builder.py +++ b/src/engine/SCons/Builder.py @@ -36,6 +36,7 @@ import string from Errors import UserError import SCons.Action +import SCons.Node import SCons.Node.FS import SCons.Util @@ -132,15 +133,15 @@ class BuilderBase: ret.append(f) return ret - tlist = SCons.Util.scons_str2nodes(adjustixes(target, - env.subst(self.prefix), - env.subst(self.suffix)), - self.node_factory) + tlist = SCons.Node.arg2nodes(adjustixes(target, + env.subst(self.prefix), + env.subst(self.suffix)), + self.node_factory) - slist = SCons.Util.scons_str2nodes(adjustixes(source, - None, - env.subst(self.src_suffix)), - self.node_factory) + slist = SCons.Node.arg2nodes(adjustixes(source, + None, + env.subst(self.src_suffix)), + self.node_factory) return tlist, slist def __call__(self, env, target = None, source = None): @@ -248,7 +249,7 @@ class MultiStepBuilder(BuilderBase): self.src_builder = src_builder def __call__(self, env, target = None, source = None): - slist = SCons.Util.scons_str2nodes(source, self.node_factory) + slist = SCons.Node.arg2nodes(source, self.node_factory) final_sources = [] src_suffix = env.subst(self.src_suffix) sdict = {} diff --git a/src/engine/SCons/Environment.py b/src/engine/SCons/Environment.py index 65af179..04bf26d 100644 --- a/src/engine/SCons/Environment.py +++ b/src/engine/SCons/Environment.py @@ -30,10 +30,11 @@ XXX __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" -import os import copy +import os import os.path import re +import shutil import string import sys import types @@ -41,6 +42,7 @@ import types import SCons.Builder import SCons.Defaults from SCons.Errors import UserError +import SCons.Node import SCons.Node.FS import SCons.Util @@ -91,8 +93,8 @@ class Environment: """ def __init__(self, **kw): - import SCons.Defaults - self._dict = our_deepcopy(SCons.Defaults.ConstructionEnvironment) + self.fs = SCons.Node.FS.default_fs + self._dict = our_deepcopy(SCons.Defaults.ConstructionEnvironment) apply(self.Update, (), kw) # @@ -187,8 +189,8 @@ class Environment: def Depends(self, target, dependency): """Explicity specify that 'target's depend on 'dependency'.""" - tlist = SCons.Util.scons_str2nodes(target) - dlist = SCons.Util.scons_str2nodes(dependency) + tlist = SCons.Node.arg2nodes(target, self.fs.File) + dlist = SCons.Node.arg2nodes(dependency, self.fs.File) for t in tlist: t.add_dependency(dlist) @@ -198,8 +200,8 @@ class Environment: def Ignore(self, target, dependency): """Ignore a dependency.""" - tlist = SCons.Util.scons_str2nodes(target) - dlist = SCons.Util.scons_str2nodes(dependency) + tlist = SCons.Node.arg2nodes(target, self.fs.File) + dlist = SCons.Node.arg2nodes(dependency, self.fs.File) for t in tlist: t.add_ignore(dlist) @@ -210,7 +212,7 @@ class Environment: def Precious(self, *targets): tlist = [] for t in targets: - tlist.extend(SCons.Util.scons_str2nodes(t)) + tlist.extend(SCons.Node.arg2nodes(t, self.fs.File)) for t in tlist: t.set_precious() @@ -246,9 +248,8 @@ class Environment: def Install(self, dir, source): """Install specified files in the given directory.""" - sources = SCons.Util.scons_str2nodes(source) - dnodes = SCons.Util.scons_str2nodes(dir, - SCons.Node.FS.default_fs.Dir) + sources = SCons.Node.arg2nodes(source, self.fs.File) + dnodes = SCons.Node.arg2nodes(dir, self.fs.Dir) tgt = [] for dnode in dnodes: for src in sources: @@ -260,8 +261,8 @@ class Environment: def InstallAs(self, target, source): """Install sources as targets.""" - sources = SCons.Util.scons_str2nodes(source) - targets = SCons.Util.scons_str2nodes(target) + sources = SCons.Node.arg2nodes(source, self.fs.File) + targets = SCons.Node.arg2nodes(target, self.fs.File) ret = [] for src, tgt in map(lambda x, y: (x, y), sources, targets): ret.append(InstallBuilder(self, tgt, src)) diff --git a/src/engine/SCons/Node/NodeTests.py b/src/engine/SCons/Node/NodeTests.py index 8a166f2..1c92476 100644 --- a/src/engine/SCons/Node/NodeTests.py +++ b/src/engine/SCons/Node/NodeTests.py @@ -25,6 +25,7 @@ __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" import os import sys +import types import unittest import SCons.Errors @@ -683,6 +684,64 @@ class NodeTestCase(unittest.TestCase): assert tn.scanned[ds] assert len(tn.implicit[ds]) == 2, tn.implicit + def test_arg2nodes(self): + """Test the arg2nodes function.""" + dict = {} + class X(SCons.Node.Node): + pass + def Factory(name, directory = None, create = 1, dict=dict, X=X): + if not dict.has_key(name): + dict[name] = X() + dict[name].name = name + return dict[name] + + nodes = SCons.Node.arg2nodes("Util.py UtilTests.py", Factory) + assert len(nodes) == 2, nodes + assert isinstance(nodes[0], X) + assert isinstance(nodes[1], X) + assert nodes[0].name == "Util.py" + assert nodes[1].name == "UtilTests.py" + + if hasattr(types, 'UnicodeType'): + code = """if 1: + nodes = SCons.Node.arg2nodes(u"Util.py UtilTests.py", Factory) + assert len(nodes) == 2, nodes + assert isinstance(nodes[0], X) + assert isinstance(nodes[1], X) + assert nodes[0].name == u"Util.py" + assert nodes[1].name == u"UtilTests.py" + \n""" + exec code + + nodes = SCons.Node.arg2nodes(["Util.py", "UtilTests.py"], Factory) + assert len(nodes) == 2, nodes + assert isinstance(nodes[0], X) + assert isinstance(nodes[1], X) + assert nodes[0].name == "Util.py" + assert nodes[1].name == "UtilTests.py" + + n1 = Factory("Util.py") + nodes = SCons.Node.arg2nodes([n1, "UtilTests.py"], Factory) + assert len(nodes) == 2, nodes + assert isinstance(nodes[0], X) + assert isinstance(nodes[1], X) + assert nodes[0].name == "Util.py" + assert nodes[1].name == "UtilTests.py" + + class SConsNode(SCons.Node.Node): + pass + nodes = SCons.Node.arg2nodes(SConsNode()) + assert len(nodes) == 1, nodes + assert isinstance(nodes[0], SConsNode), node + + class OtherNode: + pass + nodes = SCons.Node.arg2nodes(OtherNode()) + assert len(nodes) == 1, nodes + assert isinstance(nodes[0], OtherNode), node + + + if __name__ == "__main__": suite = unittest.makeSuite(NodeTestCase, 'test_') if not unittest.TextTestRunner().run(suite).wasSuccessful(): diff --git a/src/engine/SCons/Node/__init__.py b/src/engine/SCons/Node/__init__.py index c66a1a4..a7c8521 100644 --- a/src/engine/SCons/Node/__init__.py +++ b/src/engine/SCons/Node/__init__.py @@ -31,12 +31,14 @@ __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" -from SCons.Errors import BuildError import string import types import copy import sys +from SCons.Errors import BuildError +import SCons.Util + # Node states # # These are in "priority" order, so that the maximum value for any @@ -318,3 +320,36 @@ class Walker: def is_done(self): return not self.stack + + +def arg2nodes(arg, node_factory=None): + """This function converts a string or list into a list of Node instances. + It follows the rules outlined in the SCons design document by accepting + any of the following inputs: + - A single string containing names separated by spaces. These will be + split apart at the spaces. + - A single Node instance, + - A list containingg either strings or Node instances. Any strings + in the list are not split at spaces. + In all cases, the function returns a list of Node instances.""" + + narg = arg + if SCons.Util.is_String(arg): + narg = string.split(arg) + elif not SCons.Util.is_List(arg): + narg = [arg] + + nodes = [] + for v in narg: + if SCons.Util.is_String(v): + if node_factory: + nodes.append(node_factory(v)) + # Do we enforce the following restriction? Maybe, but it + # would also restrict what we can do to allow people to + # use the engine with alternate Node implementations... + #elif not issubclass(v.__class__, Node): + # raise TypeError + else: + nodes.append(v) + + return nodes diff --git a/src/engine/SCons/Scanner/C.py b/src/engine/SCons/Scanner/C.py index 7a9a4ba..8d4497c 100644 --- a/src/engine/SCons/Scanner/C.py +++ b/src/engine/SCons/Scanner/C.py @@ -33,6 +33,9 @@ __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" import copy import os.path import re + +import SCons.Node +import SCons.Node.FS import SCons.Scanner import SCons.Util @@ -60,8 +63,8 @@ class CScanner(SCons.Scanner.Recursive): given environment. """ try: - dirs = tuple(SCons.Util.scons_str2nodes(env.Dictionary('CPPPATH'), - self.fs.Dir)) + dirs = tuple(SCons.Node.arg2nodes(env.Dictionary('CPPPATH'), + self.fs.Dir)) except: dirs = () if not self.pathscanners.has_key(dirs): diff --git a/src/engine/SCons/Scanner/Prog.py b/src/engine/SCons/Scanner/Prog.py index 87b0ce8..9ecc37b 100644 --- a/src/engine/SCons/Scanner/Prog.py +++ b/src/engine/SCons/Scanner/Prog.py @@ -26,6 +26,7 @@ __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" import copy import string +import SCons.Node import SCons.Node.FS import SCons.Scanner import SCons.Util @@ -65,8 +66,8 @@ class ProgScanner(SCons.Scanner.Base): libs = string.split(libs) try: - dirs = tuple(SCons.Util.scons_str2nodes(env.Dictionary('LIBPATH'), - self.fs.Dir)) + dirs = tuple(SCons.Node.arg2nodes(env.Dictionary('LIBPATH'), + self.fs.Dir)) except: dirs = () diff --git a/src/engine/SCons/Script/SConscript.py b/src/engine/SCons/Script/SConscript.py index d50f521..2cfc64b 100644 --- a/src/engine/SCons/Script/SConscript.py +++ b/src/engine/SCons/Script/SConscript.py @@ -123,7 +123,7 @@ def Default(*targets): if isinstance(t, SCons.Node.Node): default_targets.append(t) else: - default_targets.extend(SCons.Util.scons_str2nodes(t, + default_targets.extend(SCons.Node.arg2nodes(t, SCons.Node.FS.default_fs.Entry)) def Help(text): @@ -136,8 +136,7 @@ def BuildDir(build_dir, src_dir, duplicate=1): SCons.Node.FS.default_fs.BuildDir(build_dir, src_dir, duplicate) def GetBuildPath(files): - nodes = SCons.Util.scons_str2nodes(files, - SCons.Node.FS.default_fs.Entry) + nodes = SCons.Node.arg2nodes(files, SCons.Node.FS.default_fs.Entry) ret = map(str, nodes) if len(ret) == 1: return ret[0] diff --git a/src/engine/SCons/Util.py b/src/engine/SCons/Util.py index 5175ac5..f60e981 100644 --- a/src/engine/SCons/Util.py +++ b/src/engine/SCons/Util.py @@ -44,42 +44,6 @@ except ImportError: class UserString: pass -import SCons.Node -import SCons.Node.FS - -def scons_str2nodes(arg, node_factory=SCons.Node.FS.default_fs.File): - """This function converts a string or list into a list of Node instances. - It follows the rules outlined in the SCons design document by accepting - any of the following inputs: - - A single string containing names separated by spaces. These will be - split apart at the spaces. - - A single Node instance, - - A list containingg either strings or Node instances. Any strings - in the list are not split at spaces. - In all cases, the function returns a list of Node instances.""" - - narg = arg - if is_String(arg): - narg = string.split(arg) - elif not is_List(arg): - narg = [arg] - - nodes = [] - for v in narg: - if is_String(v): - nodes.append(node_factory(v)) - # Do we enforce the following restriction? Maybe, but it - # also restricts what we can do for allowing people to - # use the engine with alternate Node implementations... - # Perhaps this should be split in two, with the SCons.Node - # logic in a wrapper somewhere under SCons.Node, and the - # string-parsing logic here...? - #elif not issubclass(v.__class__, SCons.Node.Node): - # raise TypeError - else: - nodes.append(v) - - return nodes class PathList(UserList.UserList): diff --git a/src/engine/SCons/UtilTests.py b/src/engine/SCons/UtilTests.py index 0b0003a..67bdbb4 100644 --- a/src/engine/SCons/UtilTests.py +++ b/src/engine/SCons/UtilTests.py @@ -36,57 +36,6 @@ from SCons.Util import * import TestCmd class UtilTestCase(unittest.TestCase): - def test_str2nodes(self): - """Test the str2nodes function.""" - nodes = scons_str2nodes("Util.py UtilTests.py") - assert len(nodes) == 2, nodes - assert isinstance(nodes[0], SCons.Node.FS.File) - assert isinstance(nodes[1], SCons.Node.FS.File) - assert nodes[0].path == "Util.py" - assert nodes[1].path == "UtilTests.py" - - if hasattr(types, 'UnicodeType'): - code = """if 1: - nodes = scons_str2nodes(u"Util.py UtilTests.py") - assert len(nodes) == 2, nodes - assert isinstance(nodes[0], SCons.Node.FS.File) - assert isinstance(nodes[1], SCons.Node.FS.File) - assert nodes[0].path == u"Util.py" - assert nodes[1].path == u"UtilTests.py" - \n""" - exec code - - nodes = scons_str2nodes("Util.py UtilTests.py", SCons.Node.FS.FS().File) - assert len(nodes) == 2, nodes - assert isinstance(nodes[0], SCons.Node.FS.File) - assert isinstance(nodes[1], SCons.Node.FS.File) - assert nodes[0].path == "Util.py" - assert nodes[1].path == "UtilTests.py" - - nodes = scons_str2nodes(["Util.py", "UtilTests.py"]) - assert len(nodes) == 2, nodes - assert isinstance(nodes[0], SCons.Node.FS.File) - assert isinstance(nodes[1], SCons.Node.FS.File) - assert nodes[0].path == "Util.py" - assert nodes[1].path == "UtilTests.py" - - n1 = SCons.Node.FS.default_fs.File("Util.py") - nodes = scons_str2nodes([n1, "UtilTests.py"]) - assert len(nodes) == 2, nodes - assert isinstance(nodes[0], SCons.Node.FS.File) - assert isinstance(nodes[1], SCons.Node.FS.File) - assert nodes[0].path == "Util.py" - assert nodes[1].path == "UtilTests.py" - - class SConsNode(SCons.Node.Node): - pass - node = scons_str2nodes(SConsNode()) - - class OtherNode: - pass - node = scons_str2nodes(OtherNode()) - - def test_subst(self): """Test the subst function.""" loc = {} |