diff options
author | Steven Knight <knight@baldmt.com> | 2003-04-20 03:30:39 (GMT) |
---|---|---|
committer | Steven Knight <knight@baldmt.com> | 2003-04-20 03:30:39 (GMT) |
commit | b462d3a29bc8ed264b51c6af5e38cd878ca00ea2 (patch) | |
tree | 3d4cbf18f71cfa6b6622e3a4a33f4f36d522063a /src | |
parent | 1691e6792ea238c0cfe3d8f4cc1aa56262d343b4 (diff) | |
download | SCons-b462d3a29bc8ed264b51c6af5e38cd878ca00ea2.zip SCons-b462d3a29bc8ed264b51c6af5e38cd878ca00ea2.tar.gz SCons-b462d3a29bc8ed264b51c6af5e38cd878ca00ea2.tar.bz2 |
Make Export() work for local variables. (Anthony Roach)
Diffstat (limited to 'src')
-rw-r--r-- | src/CHANGES.txt | 6 | ||||
-rw-r--r-- | src/engine/SCons/Script/SConscript.py | 67 |
2 files changed, 51 insertions, 22 deletions
diff --git a/src/CHANGES.txt b/src/CHANGES.txt index 2f3ffbd..f6f2746 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -69,6 +69,12 @@ RELEASE 0.14 - XXX - Add a standalone "Alias" function (separate from an Environment). + - Make Export() work for local variables. + + - Support passing a dictionary to Export(). + + - Support Import('*') to import everything that's been Export()ed. + From Greg Spencer: - Support the C preprocessor #import statement. diff --git a/src/engine/SCons/Script/SConscript.py b/src/engine/SCons/Script/SConscript.py index 1c9d2b2..e77b879 100644 --- a/src/engine/SCons/Script/SConscript.py +++ b/src/engine/SCons/Script/SConscript.py @@ -75,24 +75,46 @@ def _scons_add_args(alist): a, b = string.split(arg, '=', 2) arguments[a] = b +def get_calling_namespaces(): + """Return the locals and globals for the function that called + into this module in the current callstack.""" + try: 1/0 + except: frame = sys.exc_info()[2].tb_frame + + while frame.f_globals.get("__name__") == __name__: frame = frame.f_back + + return frame.f_locals, frame.f_globals + + +def compute_exports(exports): + """Compute a dictionary of exports given one of the parameters + to the Export() function or the exports argument to SConscript().""" + exports = SCons.Util.argmunge(exports) + loc, glob = get_calling_namespaces() + + retval = {} + try: + for export in exports: + if SCons.Util.is_Dict(export): + retval.update(export) + else: + try: + retval[export] = loc[export] + except KeyError: + retval[export] = glob[export] + except KeyError, x: + raise SCons.Errors.UserError, "Export of non-existant variable '%s'"%x + + return retval + + class Frame: """A frame on the SConstruct/SConscript call stack""" def __init__(self, exports): self.globals = BuildDefaultGlobals() self.retval = None self.prev_dir = SCons.Node.FS.default_fs.getcwd() - self.exports = {} # exports from the calling SConscript - - try: - if SCons.Util.is_List(exports): - for export in exports: - self.exports[export] = stack[-1].globals[export] - else: - for export in string.split(exports): - self.exports[export] = stack[-1].globals[export] - except KeyError, x: - raise SCons.Errors.UserError, "Export of non-existant variable '%s'"%x - + self.exports = compute_exports(exports) # exports from the calling SConscript # the SConstruct/SConscript call stack: stack = [] @@ -339,21 +361,22 @@ def FindFile(file, dirs): return SCons.Node.FS.find_file(file, nodes) def Export(*vars): - try: - for var in vars: - for v in string.split(var): - global_exports[v] = stack[-1].globals[v] - except KeyError, x: - raise SCons.Errors.UserError, "Export of non-existant variable '%s'"%x + for var in vars: + global_exports.update(compute_exports(var)) def Import(*vars): try: for var in vars: - for v in string.split(var): - if stack[-1].exports.has_key(v): - stack[-1].globals[v] = stack[-1].exports[v] + var = SCons.Util.argmunge(var) + for v in var: + if 'v' == '*': + stack[-1].globals.update(global_exports) + stack[-1].globals.update(stack[-1].exports[v]) else: - stack[-1].globals[v] = global_exports[v] + if stack[-1].exports.has_key(v): + stack[-1].globals[v] = stack[-1].exports[v] + else: + stack[-1].globals[v] = global_exports[v] except KeyError,x: raise SCons.Errors.UserError, "Import of non-existant variable '%s'"%x |