diff options
Diffstat (limited to 'src/engine/SCons')
-rw-r--r-- | src/engine/SCons/Node/FS.py | 4 | ||||
-rw-r--r-- | src/engine/SCons/Node/FSTests.py | 9 | ||||
-rw-r--r-- | src/engine/SCons/Script/SConscript.py | 47 | ||||
-rw-r--r-- | src/engine/SCons/Script/__init__.py | 2 |
4 files changed, 46 insertions, 16 deletions
diff --git a/src/engine/SCons/Node/FS.py b/src/engine/SCons/Node/FS.py index 551ae06..b0bc3e4 100644 --- a/src/engine/SCons/Node/FS.py +++ b/src/engine/SCons/Node/FS.py @@ -366,6 +366,7 @@ class FS: self.pathTop = path self.Root = {} self.Top = None + self.SConstruct = None self.CachePath = None self.cache_force = None self.cache_show = None @@ -373,6 +374,9 @@ class FS: def set_toplevel_dir(self, path): assert not self.Top, "You can only set the top-level path on an FS object that has not had its File, Dir, or Entry methods called yet." self.pathTop = path + + def set_SConstruct(self, path): + self.SConstruct = self.File(path) def __setTopLevelDir(self): if not self.Top: diff --git a/src/engine/SCons/Node/FSTests.py b/src/engine/SCons/Node/FSTests.py index 10e4676..3a862eb 100644 --- a/src/engine/SCons/Node/FSTests.py +++ b/src/engine/SCons/Node/FSTests.py @@ -1265,6 +1265,14 @@ class get_actionsTestCase(unittest.TestCase): a = dir.get_actions() assert a == [], a +class SConstructTestCase(unittest.TestCase): + def runTest(self): + """Test setting the SConstruct file""" + + fs = SCons.Node.FS.FS() + fs.set_SConstruct('xxx') + assert fs.SConstruct.path == 'xxx' + class CacheDirTestCase(unittest.TestCase): def runTest(self): """Test CacheDir functionality""" @@ -1397,6 +1405,7 @@ if __name__ == "__main__": suite.addTest(has_builderTestCase()) suite.addTest(prepareTestCase()) suite.addTest(get_actionsTestCase()) + suite.addTest(SConstructTestCase()) suite.addTest(CacheDirTestCase()) if not unittest.TextTestRunner().run(suite).wasSuccessful(): sys.exit(1) diff --git a/src/engine/SCons/Script/SConscript.py b/src/engine/SCons/Script/SConscript.py index d9da651..ab071e0 100644 --- a/src/engine/SCons/Script/SConscript.py +++ b/src/engine/SCons/Script/SConscript.py @@ -182,6 +182,10 @@ def GetSConscriptFilenames(ls, kw): def SConscript(*ls, **kw): files, exports = GetSConscriptFilenames(ls, kw) + default_fs = SCons.Node.FS.default_fs + top = default_fs.Top + sd = default_fs.SConstruct.rfile().dir + # evaluate each SConscript file results = [] for fn in files: @@ -195,19 +199,20 @@ def SConscript(*ls, **kw): if isinstance(fn, SCons.Node.Node): f = fn else: - f = SCons.Node.FS.default_fs.File(str(fn)) + f = default_fs.File(str(fn)) _file_ = None - old_dir = SCons.Node.FS.default_fs.getcwd() - SCons.Node.FS.default_fs.chdir(SCons.Node.FS.default_fs.Dir('#'), - change_os_dir=1) + old_dir = default_fs.getcwd() + + # Change directory to the top of the source + # tree to make sure the os's cwd and the cwd of + # SCons.Node.FS.default_fs match so we can open the + # SConscript. + default_fs.chdir(top, change_os_dir=1) if f.rexists(): - # Change directory to top of source tree to make sure - # the os's cwd and the cwd of SCons.Node.FS.default_fs - # match so we can open the SConscript. _file_ = open(f.rstr(), "r") elif f.has_builder(): # The SConscript file apparently exists in a source - # code management system. Build it, but then remove + # code management system. Build it, but then clear # the builder so that it doesn't get built *again* # during the actual build phase. f.build() @@ -216,11 +221,22 @@ def SConscript(*ls, **kw): if os.path.exists(s): _file_ = open(s, "r") if _file_: - SCons.Node.FS.default_fs.chdir(f.dir, - change_os_dir=sconscript_chdir) - # prepend the SConscript directory to sys.path so - # that Python modules in the SConscript directory can - # be easily imported + # Chdir to the SConscript directory. Use a path + # name relative to the SConstruct file so that if + # we're using the -f option, we're essentially + # creating a parallel SConscript directory structure + # in our local directory tree. + # + # XXX This is broken for multiple-repository cases + # where the SConstruct and SConscript files might be + # in different Repositories. For now, cross that + # bridge when someone comes to it. + ldir = default_fs.Dir(f.dir.get_path(sd)) + default_fs.chdir(ldir, change_os_dir=sconscript_chdir) + + # Append the SConscript directory to the beginning + # of sys.path so Python modules in the SConscript + # directory can be easily imported. sys.path = [ f.dir.abspath ] + sys.path # This is the magic line that actually reads up and @@ -237,10 +253,9 @@ def SConscript(*ls, **kw): finally: sys.path = old_sys_path frame = stack.pop() - SCons.Node.FS.default_fs.chdir(frame.prev_dir) + default_fs.chdir(frame.prev_dir) if old_dir: - SCons.Node.FS.default_fs.chdir(old_dir, - change_os_dir=sconscript_chdir) + default_fs.chdir(old_dir, change_os_dir=sconscript_chdir) results.append(frame.retval) diff --git a/src/engine/SCons/Script/__init__.py b/src/engine/SCons/Script/__init__.py index ca0d50e..1f9daf5 100644 --- a/src/engine/SCons/Script/__init__.py +++ b/src/engine/SCons/Script/__init__.py @@ -742,6 +742,8 @@ def _main(): if not scripts: raise SCons.Errors.UserError, "No SConstruct file found." + SCons.Node.FS.default_fs.set_SConstruct(scripts[0]) + class Unbuffered: def __init__(self, file): self.file = file |