diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/CHANGES.txt | 12 | ||||
-rw-r--r-- | src/engine/SCons/Environment.py | 27 | ||||
-rw-r--r-- | src/engine/SCons/EnvironmentTests.py | 26 | ||||
-rw-r--r-- | src/engine/SCons/Script/SConscript.py | 31 | ||||
-rw-r--r-- | src/engine/SCons/Script/__init__.py | 8 |
5 files changed, 77 insertions, 27 deletions
diff --git a/src/CHANGES.txt b/src/CHANGES.txt index d8a6155..259e199 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -43,8 +43,16 @@ RELEASE X.XX - XXX - Support arbitrary expansion of construction variables within file and directory arguments to Builder calls and Environment methods. - - Add Environment-method versions of AddPreAction(), AddPostAction(), - Default(), FindFile(), and Local(). + - Add Environment-method versions of the following global function: + AddPreAction(), AddPostAction(), Clean(), Default(), FindFile() + and Local(). + + - Add the following global functions that correspond to the same-named + Environment methods: AlwaysBuild(), Command(), Depends(), Ignore(), + Install(), InstallAs(), Precious(), SideEffect() and SourceCode(). + + - Rearrange the man page to show construction environment methods and + global functions in the same list, and to explain the difference. From Bram Moolenaar: diff --git a/src/engine/SCons/Environment.py b/src/engine/SCons/Environment.py index 074fd3c..f2cc03f 100644 --- a/src/engine/SCons/Environment.py +++ b/src/engine/SCons/Environment.py @@ -50,6 +50,9 @@ import SCons.Errors import SCons.Node import SCons.Node.FS import SCons.Platform +import SCons.Sig +import SCons.Sig.MD5 +import SCons.Sig.TimeStamp import SCons.Tool import SCons.Util import SCons.Warnings @@ -60,6 +63,8 @@ class _Null: _null = _Null DefaultTargets = None +CleanTargets = {} +SigModule = None def installFunc(target, source, env): """Install a source file into a target using the function specified @@ -603,6 +608,28 @@ class Environment: tlist = tlist[0] return tlist + def Clean(self, target, files): + global CleanTargets + + if not isinstance(target, SCons.Node.Node): + target = self.subst(target) + target = SCons.Node.FS.default_fs.Entry(target, create=1) + + if not SCons.Util.is_List(files): + files = [files] + + nodes = [] + for f in files: + if isinstance(f, SCons.Node.Node): + nodes.append(f) + else: + nodes.extend(self.arg2nodes(f, self.fs.Entry)) + + try: + CleanTargets[target].extend(nodes) + except KeyError: + CleanTargets[target] = nodes + def Command(self, target, source, action): """Builds the supplied target files from the supplied source files using the supplied action. Action may diff --git a/src/engine/SCons/EnvironmentTests.py b/src/engine/SCons/EnvironmentTests.py index db05351..1dc47e2 100644 --- a/src/engine/SCons/EnvironmentTests.py +++ b/src/engine/SCons/EnvironmentTests.py @@ -1051,6 +1051,32 @@ class EnvironmentTestCase(unittest.TestCase): assert t[4].path == 'bbb' assert t[4].always_build + def test_Clean(self): + """Test the Clean() method""" + env = Environment(FOO = 'fff', BAR = 'bbb') + + CT = SCons.Environment.CleanTargets + + foo = env.arg2nodes('foo')[0] + fff = env.arg2nodes('fff')[0] + + t = env.Clean('foo', 'aaa') + l = map(str, CT[foo]) + assert l == ['aaa'], l + + t = env.Clean(foo, ['$BAR', 'ccc']) + l = map(str, CT[foo]) + assert l == ['aaa', 'bbb', 'ccc'], l + + eee = env.arg2nodes('eee')[0] + + t = env.Clean('$FOO', 'ddd') + l = map(str, CT[fff]) + assert l == ['ddd'], l + t = env.Clean(fff, [eee, 'fff']) + l = map(str, CT[fff]) + assert l == ['ddd', 'eee', 'fff'], l + def test_Command(self): """Test the Command() method.""" env = Environment() diff --git a/src/engine/SCons/Script/SConscript.py b/src/engine/SCons/Script/SConscript.py index 276ff4e..b79c34a 100644 --- a/src/engine/SCons/Script/SConscript.py +++ b/src/engine/SCons/Script/SConscript.py @@ -56,7 +56,6 @@ import traceback def do_nothing(text): pass HelpFunction = do_nothing -clean_targets = {} arguments = {} launch_dir = os.path.abspath(os.curdir) @@ -467,25 +466,6 @@ def SetJobs(num): "\tuse SetOption('num_jobs', num) instead.") SetOption('num_jobs', num) -def Clean(target, files): - if not isinstance(target, SCons.Node.Node): - target = SCons.Node.FS.default_fs.Entry(target, create=1) - - if not SCons.Util.is_List(files): - files = [files] - - nodes = [] - for f in files: - if isinstance(f, SCons.Node.Node): - nodes.append(f) - else: - nodes.extend(SCons.Node.arg2nodes(f, SCons.Node.FS.default_fs.Entry)) - - try: - clean_targets[target].extend(nodes) - except KeyError: - clean_targets[target] = nodes - def Exit(value=0): sys.exit(value) @@ -522,7 +502,6 @@ def BuildDefaultGlobals(): globals['BuildDir'] = BuildDir globals['Builder'] = SCons.Builder.Builder globals['CacheDir'] = SCons.Node.FS.default_fs.CacheDir - globals['Clean'] = Clean globals['Configure'] = SCons.SConf.SConf globals['CScan'] = SCons.Defaults.CScan globals['DefaultEnvironment'] = SCons.Defaults.DefaultEnvironment @@ -574,9 +553,19 @@ def BuildDefaultGlobals(): EnvironmentMethods = [ 'AddPostAction', 'AddPreAction', + 'AlwaysBuild', + 'Clean', + 'Command', 'Default', + 'Depends', 'FindFile', + 'Ignore', + 'Install', + 'InstallAs', 'Local', + 'Precious', + 'SideEffect', + 'SourceCode', ] for name in EnvironmentMethods: diff --git a/src/engine/SCons/Script/__init__.py b/src/engine/SCons/Script/__init__.py index 3ab4ed0..34b112f 100644 --- a/src/engine/SCons/Script/__init__.py +++ b/src/engine/SCons/Script/__init__.py @@ -181,8 +181,8 @@ class CleanTask(SCons.Taskmaster.Task): if (self.targets[0].has_builder() or self.targets[0].side_effect) \ and not os.path.isdir(str(self.targets[0])): display("Removed " + str(self.targets[0])) - if SCons.Script.SConscript.clean_targets.has_key(self.targets[0]): - files = SCons.Script.SConscript.clean_targets[self.targets[0]] + if SCons.Environment.CleanTargets.has_key(self.targets[0]): + files = SCons.Environment.CleanTargets[self.targets[0]] for f in files: SCons.Util.fs_delete(str(f), 0) @@ -196,8 +196,8 @@ class CleanTask(SCons.Taskmaster.Task): else: if removed: display("Removed " + str(t)) - if SCons.Script.SConscript.clean_targets.has_key(self.targets[0]): - files = SCons.Script.SConscript.clean_targets[self.targets[0]] + if SCons.Environment.CleanTargets.has_key(self.targets[0]): + files = SCons.Environment.CleanTargets[self.targets[0]] for f in files: SCons.Util.fs_delete(str(f)) |