Redo the _whooollleee_ build system
Following the tutorials on http://www.ostricher.com/tag/scons/, I rebuilt the build system so that SConscript files are *much* easier to write.
This commit is contained in:
parent
10b650c9a4
commit
c56cc557f8
6 changed files with 335 additions and 146 deletions
59
site_scons/site_tools/lib.py
Normal file
59
site_scons/site_tools/lib.py
Normal file
|
@ -0,0 +1,59 @@
|
|||
# lib.py
|
||||
# Eryn Wells <eryn@erynwells.me>
|
||||
|
||||
'''
|
||||
SCons builder for a lib directory.
|
||||
'''
|
||||
|
||||
import SCons.Errors
|
||||
import SCons.Script
|
||||
|
||||
|
||||
def _process_lib_dir(env, lib, src_dir=None, out_dir=None, inc_dir=None):
|
||||
if not src_dir:
|
||||
src_dir = env.lib_root.Dir(lib)
|
||||
if not src_dir.isdir():
|
||||
err = 'Invalid library source directory: {}'.format(src_dir)
|
||||
env.log_error(err)
|
||||
raise SCons.Errors.UserError(err)
|
||||
if not out_dir:
|
||||
out_dir = env.build_root.Dir('lib').Dir(lib)
|
||||
if not inc_dir:
|
||||
include_dir = src_dir.Dir('include')
|
||||
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)
|
||||
return out
|
||||
|
||||
|
||||
def _build_library(env, lib_func):
|
||||
original_builder = lib_func
|
||||
|
||||
def builder(env, lib_name, sources, *args, **kwargs):
|
||||
lib = original_builder(lib_name, sources, *args, **kwargs)
|
||||
env.register_lib(lib_name, lib)
|
||||
return lib
|
||||
|
||||
return builder
|
||||
|
||||
#
|
||||
# SCons tool interface
|
||||
#
|
||||
|
||||
def generate(env):
|
||||
env.SetDefault(LIBS={})
|
||||
env.AddMethod(_process_lib_dir, 'LibDir')
|
||||
env.AddMethod(_build_library(env, env.Library), 'Library')
|
||||
env.AddMethod(_build_library(env, env.StaticLibrary), 'StaticLibrary')
|
||||
env.AddMethod(_build_library(env, env.SharedLibrary), 'SharedLibrary')
|
||||
|
||||
def exists(env):
|
||||
return True
|
51
site_scons/site_tools/test.py
Normal file
51
site_scons/site_tools/test.py
Normal file
|
@ -0,0 +1,51 @@
|
|||
# test.py
|
||||
# Eryn Wells <eryn@erynwells.me>
|
||||
|
||||
'''
|
||||
Test builder for SCons. Test files are compiled to objects and stored in the
|
||||
environment.
|
||||
'''
|
||||
|
||||
def _process_test_dir(env, dir, program=None):
|
||||
# TODO: Builder for test directories?
|
||||
pass
|
||||
|
||||
|
||||
def _build_test_object(env, source, program=None):
|
||||
obj = env.Object(source)
|
||||
if not program:
|
||||
program = 'test'
|
||||
try:
|
||||
env.test_objects(program).extend(obj)
|
||||
except TypeError:
|
||||
env.test_objects(program).append(obj)
|
||||
return obj
|
||||
|
||||
|
||||
def _build_test_program(env, name=None):
|
||||
if not name:
|
||||
name = 'test'
|
||||
prog = env.Program(name, env.test_objects(name), LIBS=[env.lib('gtest')])
|
||||
env.register_test_program(name, prog)
|
||||
return
|
||||
|
||||
|
||||
def _run_tests(env, name=None):
|
||||
if not name:
|
||||
name = 'test'
|
||||
cmd = env.Command(env.test_program(name), None, '$SOURCE --gtest_color=yes')
|
||||
env.AlwaysBuild(cmd)
|
||||
return cmd
|
||||
|
||||
#
|
||||
# SCons tool interface
|
||||
#
|
||||
|
||||
def generate(env):
|
||||
env.SetDefault(TESTS={})
|
||||
env.AddMethod(_build_test_object, 'Test')
|
||||
env.AddMethod(_build_test_program, 'TestProgram')
|
||||
env.AddMethod(_run_tests, 'TestRun')
|
||||
|
||||
def exists(env):
|
||||
return 'Object' in env
|
Loading…
Add table
Add a link
Reference in a new issue