diff options
author | Steven Knight <knight@baldmt.com> | 2003-03-26 15:57:50 (GMT) |
---|---|---|
committer | Steven Knight <knight@baldmt.com> | 2003-03-26 15:57:50 (GMT) |
commit | 95a4d924e02d940a8960e28be71056dab84deb9f (patch) | |
tree | ca6f9d1b4c0a5581a10756fa7a3fda0be75d4c62 /src/engine/SCons/Node | |
parent | c24f1504b711f871c0c4310a460727ac1a859936 (diff) | |
download | SCons-95a4d924e02d940a8960e28be71056dab84deb9f.zip SCons-95a4d924e02d940a8960e28be71056dab84deb9f.tar.gz SCons-95a4d924e02d940a8960e28be71056dab84deb9f.tar.bz2 |
Add warnings when we switch to BuildDir() targets when using -u or -U.
Diffstat (limited to 'src/engine/SCons/Node')
-rw-r--r-- | src/engine/SCons/Node/FS.py | 33 | ||||
-rw-r--r-- | src/engine/SCons/Node/FSTests.py | 15 | ||||
-rw-r--r-- | src/engine/SCons/Node/NodeTests.py | 8 | ||||
-rw-r--r-- | src/engine/SCons/Node/__init__.py | 5 |
4 files changed, 61 insertions, 0 deletions
diff --git a/src/engine/SCons/Node/FS.py b/src/engine/SCons/Node/FS.py index 57fd1c2..d6b7b53 100644 --- a/src/engine/SCons/Node/FS.py +++ b/src/engine/SCons/Node/FS.py @@ -197,6 +197,7 @@ class ParentOfRoot: self.name='' self.duplicate=0 self.srcdir=None + self.build_dirs=[] def is_under(self, dir): return 0 @@ -714,6 +715,24 @@ class FS: def CacheDir(self, path): self.CachePath = path + def build_dir_target_climb(self, dir, tail): + """Create targets in corresponding build directories + + Climb the directory tree, and look up path names + relative to any linked build directories we find. + """ + targets = [] + message = None + while dir: + for bd in dir.build_dirs: + p = apply(os.path.join, [bd.path] + tail) + targets.append(self.Entry(p)) + tail = [dir.name] + tail + dir = dir.up() + if targets: + message = "building associated BuildDir targets: %s" % string.join(map(str, targets)) + return targets, message + # XXX TODO? # Annotate with the creator # rel_path @@ -749,6 +768,7 @@ class Dir(Entry): self.cwd = self self.builder = 1 self._sconsign = None + self.build_dirs = [] def __clearRepositoryCache(self, duplicate=None): """Called when we change the repository(ies) for a directory. @@ -801,6 +821,7 @@ class Dir(Entry): self.srcdir = srcdir self.duplicate = duplicate self.__clearRepositoryCache(duplicate) + srcdir.build_dirs.append(self) def getRepositories(self): """Returns a list of repositories for this directory.""" @@ -850,6 +871,11 @@ class Dir(Entry): """A null "builder" for directories.""" pass + def alter_targets(self): + """Return any corresponding targets in a build directory. + """ + return self.fs.build_dir_target_climb(self, []) + def calc_signature(self, calc): """A directory has no signature.""" return None @@ -1160,6 +1186,13 @@ class File(Entry): """ return self.has_builder() or self.side_effect or self.has_src_builder() + def alter_targets(self): + """Return any corresponding targets in a build directory. + """ + if self.has_builder(): + return [], None + return self.fs.build_dir_target_climb(self.dir, [self.name]) + def prepare(self): """Prepare for this file to be created.""" diff --git a/src/engine/SCons/Node/FSTests.py b/src/engine/SCons/Node/FSTests.py index d460c1e..11146eb 100644 --- a/src/engine/SCons/Node/FSTests.py +++ b/src/engine/SCons/Node/FSTests.py @@ -282,6 +282,21 @@ class BuildDirTestCase(unittest.TestCase): assert f10.exists() assert f10.get_contents() == 'stuff', f10.get_contents() + f11 = fs.File('src/file11') + t, m = f11.alter_targets() + bdt = map(lambda n: n.path, t) + assert bdt == ['build/var1/file11', 'build/var2/file11'], bdt + + f12 = fs.File('src/file12') + f12.builder = 1 + bdt, m = f12.alter_targets() + assert bdt == [], map(lambda n: n.path, bdt) + + d13 = fs.Dir('src/new_dir') + t, m = d13.alter_targets() + bdt = map(lambda n: n.path, t) + assert bdt == ['build/var1/new_dir', 'build/var2/new_dir'], bdt + save_Mkdir = SCons.Node.FS.Mkdir dir_made = [] def mkdir_func(target, source, env, dir_made=dir_made): diff --git a/src/engine/SCons/Node/NodeTests.py b/src/engine/SCons/Node/NodeTests.py index 91b35d0..f282860 100644 --- a/src/engine/SCons/Node/NodeTests.py +++ b/src/engine/SCons/Node/NodeTests.py @@ -277,6 +277,14 @@ class NodeTestCase(unittest.TestCase): assert n2.is_derived() == 1 assert n3.is_derived() == 1 + def test_alter_targets(self): + """Test the alter_targets() method + """ + n = SCons.Node.Node() + t, m = n.alter_targets() + assert t == [], t + assert m == None, m + def test_builder_sig_adapter(self): """Test the node's adapter for builder signatures """ diff --git a/src/engine/SCons/Node/__init__.py b/src/engine/SCons/Node/__init__.py index 326aee3..222cd1f 100644 --- a/src/engine/SCons/Node/__init__.py +++ b/src/engine/SCons/Node/__init__.py @@ -231,6 +231,11 @@ class Node: def is_derived(self): return self.has_builder() or self.side_effect + def alter_targets(self): + """Return a list of alternate targets for this Node. + """ + return [], None + def builder_sig_adapter(self): """Create an adapter for calculating a builder's signature. |