81 lines
2 KiB
Python
81 lines
2 KiB
Python
# lib.py
|
|
# Eryn Wells <eryn@erynwells.me>
|
|
|
|
'''
|
|
SCons builder for a lib directory.
|
|
'''
|
|
|
|
import os
|
|
|
|
import SCons.Errors
|
|
import SCons.Script
|
|
|
|
|
|
def _lib(env, name):
|
|
return env['LOCAL_LIBS'].get(name)
|
|
|
|
|
|
def _register_lib(env, name, lib):
|
|
if name in env['LOCAL_LIBS']:
|
|
env.log_error('Library has already been built: {}'.format(name))
|
|
env['LOCAL_LIBS'][name] = lib
|
|
|
|
|
|
def _lib_dirs(env):
|
|
for lib in os.listdir(env.lib_root.abspath):
|
|
lib_dir = env.lib_root.Dir(lib)
|
|
if not lib_dir.isdir():
|
|
continue
|
|
yield (lib, lib_dir)
|
|
|
|
|
|
def _process_lib_dirs(env):
|
|
for name, _ in _lib_dirs(env):
|
|
env.LibDir(name)
|
|
|
|
|
|
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)
|
|
out = env.SConscript(src_dir.File('SConscript'),
|
|
clone=True,
|
|
variant_dir=out_dir)
|
|
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)
|
|
_register_lib(env, lib_name, lib)
|
|
return lib
|
|
|
|
return builder
|
|
|
|
#
|
|
# SCons tool interface
|
|
#
|
|
|
|
def generate(env):
|
|
env.SetDefault(LOCAL_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')
|
|
env.AddMethod(_lib, 'lib')
|
|
env.AddMethod(_process_lib_dirs, 'process_lib_dirs')
|
|
|
|
def exists(env):
|
|
return True
|