From e1c4e0c4b71990fc1bbdd88711784007add57e59 Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Sat, 17 Oct 2015 00:13:49 -0700 Subject: [PATCH] Add program and sconscript tools --- site_scons/site_init.py | 4 ++- site_scons/site_tools/lib.py | 9 ++---- site_scons/site_tools/program.py | 46 +++++++++++++++++++++++++++++ site_scons/site_tools/sconscript.py | 36 ++++++++++++++++++++++ 4 files changed, 87 insertions(+), 8 deletions(-) create mode 100644 site_scons/site_tools/program.py create mode 100644 site_scons/site_tools/sconscript.py diff --git a/site_scons/site_init.py b/site_scons/site_init.py index e3a4894..9eee045 100644 --- a/site_scons/site_init.py +++ b/site_scons/site_init.py @@ -149,6 +149,8 @@ class Environment(SCons.Environment.Environment): out_dir = self.build_root.Dir('src') # TODO: Do the thing. # do_sconscript(env, env.source_root, src_out_dir) + self.SConscript(self.src_root.File('SConscript'), + variant_dir=out_dir) self.Append(CPPPATH=[self.src_root]) # @@ -194,7 +196,7 @@ class Environment(SCons.Environment.Environment): def _append_custom_tools(self, kwargs): '''Add custom tools to the `kwargs`.''' tools = kwargs.setdefault('tools', ['default']) - for tool in ['lib', 'test']: + for tool in ['lib', 'test', 'program', 'sconscript']: if tool in tools: continue tools.append(tool) diff --git a/site_scons/site_tools/lib.py b/site_scons/site_tools/lib.py index b610440..f5c59cb 100644 --- a/site_scons/site_tools/lib.py +++ b/site_scons/site_tools/lib.py @@ -48,14 +48,9 @@ def _process_lib_dir(env, lib, src_dir=None, out_dir=None, inc_dir=None): if include_dir.isdir(): inc_dir = [include_dir] env.Append(CPPPATH=inc_dir) - exports = {'Library': env.Library, - 'StaticLibrary': env.StaticLibrary, - 'SharedLibrary': env.SharedLibrary} - SCons.Script._SConscript.GlobalDict.update(exports) out = env.SConscript(src_dir.File('SConscript'), - {'env': env.Clone()}, - variant_dir=out_dir, - exports=exports) + clone=True, + variant_dir=out_dir) return out diff --git a/site_scons/site_tools/program.py b/site_scons/site_tools/program.py new file mode 100644 index 0000000..edb1186 --- /dev/null +++ b/site_scons/site_tools/program.py @@ -0,0 +1,46 @@ +# program.py +# Eryn Wells + +''' +SCons tool for working with Programs. +''' + +def _program(env, name): + return env['PROGRAMS'].get(name) + + +def _register_program(env, name, program): + env['PROGRAMS'][name] = program + + +def _build_program(env): + original_builder = env.Program + + def builder(env, program, sources, local_libs=None, *args, **kwargs): + # local_libs is an array of names of libs built in the local project. + # These will be looked up in the environment and added to the LIBS + # array, if present. +# if local_libs: +# local_libs = map(lambda lib: env.lib(lib), local_libs) +# try: +# kwargs['LIBS'].extend(local_libs) +# except KeyError: +# kwargs['LIBS'] = local_libs + prog = original_builder(program, sources, *args, **kwargs) + register_program(prog) + return prog + + return builder + +# +# SCons tool interface +# + +def generate(env): + env.SetDefault(PROGRAMS={}) + env.AddMethod(_build_program(env), 'Program') + env.AddMethod(_program, 'program') + + +def exists(env): + return True diff --git a/site_scons/site_tools/sconscript.py b/site_scons/site_tools/sconscript.py new file mode 100644 index 0000000..b898481 --- /dev/null +++ b/site_scons/site_tools/sconscript.py @@ -0,0 +1,36 @@ +# sconscript.py +# Eryn Wells + +''' +SCons tool for working with SConscripts. +''' + +import SCons.Script + +def _do_sconscript(env): + original_sconscript = env.SConscript + + def sconscript(env, sconscript, clone=False, *args, **kwargs): + exports = {'Library': env.Library, + 'StaticLibrary': env.StaticLibrary, + 'SharedLibrary': env.SharedLibrary, + 'Program': env.Program} + SCons.Script._SConscript.GlobalDict.update(exports) + env.log('Reading {}'.format(sconscript)) + return original_sconscript(sconscript, + {'env': env.Clone() if clone else env}, + *args, + **kwargs) + + return sconscript + +# +# SCons tool interface +# + +def generate(env): + env.AddMethod(_do_sconscript(env), 'SConscript') + + +def exists(env): + return True