diff --git a/SConscript b/SConscript index fb02641..7a04d1d 100644 --- a/SConscript +++ b/SConscript @@ -5,6 +5,21 @@ import psutil import sys import time +import SCons.Script +import SCons.Warnings + +class _Dependency: + name: str = '' + version: str = '' + +class _Target: + builder = None + target = None + source = None + args: list = [] + kwargs: dict = {} + dependencies: list = [] + def _cook(env: Environment, recipe_name: str, *args, **kwargs): import importlib.util source_file = None @@ -20,6 +35,9 @@ def _cook(env: Environment, recipe_name: str, *args, **kwargs): spec.loader.exec_module(recipe) return recipe.cook(env, *args, **kwargs) +def _module(env: Environment, file: str): + return SConscript(file, exports = 'env', variant_dir = env['VARIANT_DIR'], src_dir = '.') + def _parse_lib_conf(env: Environment, lib_conf: dict) -> None: env.Append(CPPPATH = lib_conf.get('CPPPATH', []), CPPDEFINES = lib_conf.get('CPPDEFINES', []), @@ -84,8 +102,24 @@ def _error(env: Environment, message: str): print(message, file=sys.stderr) env.Exit(1) +def _build_action(target, source, env): + the_target = env['_target'] + the_target.builder.method(env=env, *the_target.args, **the_target.kwargs) + +_Builder = Builder(action=Action(_build_action, None)) + +def _add_dependency(name: str, version: str) -> _Dependency: + dependency = _Dependency() + dependency.name = name + dependency.version = version + return dependency + def _wrap_builder(builder, is_lib: bool = False): - def _wrapped(env, dependencies = [], *args, **kwargs): + def _wrapped(env, dependencies = {}, *args, **kwargs): + target_dependencies = [] + for name, version in dependencies.items(): + target_dependencies.append(_add_dependency(name, version)) + if 'CPPPATH' not in kwargs: kwargs['CPPPATH'] = copy.copy(env['CPPPATH']) if 'CPPDEFINES' not in kwargs: @@ -94,8 +128,6 @@ def _wrap_builder(builder, is_lib: bool = False): kwargs['LIBPATH'] = copy.copy(env['LIBPATH']) if 'LIBS' not in kwargs and 'LIBS' in env: kwargs['LIBS'] = copy.copy(env['LIBS']) - for dependency in dependencies: - _inject_dependency(dependency, kwargs) if 'LIBS' in kwargs: libs_copy = list(kwargs['LIBS']) for lib in libs_copy: @@ -103,21 +135,19 @@ def _wrap_builder(builder, is_lib: bool = False): kwargs['LIBS'].remove(lib) kwargs['source'].append(lib) - result = builder(*args, **kwargs) - if is_lib: - # generate a new libconf - return { - 'CPPPATH': kwargs.get('CPPPATH', []), - 'CPPDEFINES': kwargs.get('CPPDEFINES', []), - 'LIBPATH': kwargs.get('LIBPATH', []), - 'LIBS': result + kwargs.get('LIBS', []), - 'ADDITIONAL_SOURCES': kwargs.get('add_source', []), - '_target': result - } - return result + target = _Target() + target.target = kwargs.get('target', None) + target.source = kwargs.get('source', None) + target.builder = builder + target.args = args + target.kwargs = kwargs + target.dependencies = target_dependencies + # return _Builder(target=kwargs.get('target', None), source=kwargs.get('source', None), env=env, _target=target) + return builder(*args, **kwargs) return _wrapped def _wrap_default(default): + print(default) def _wrapped(env, arg): if isinstance(arg, dict) and '_target' in arg: default(arg['_target']) @@ -430,6 +460,7 @@ env.AddMethod(_wrap_builder(env.UnityProgram), 'UnityProgram') env.AddMethod(_wrap_builder(env.UnityLibrary, is_lib = True), 'UnityLibrary') env.AddMethod(_wrap_builder(env.UnityStaticLibrary, is_lib = True), 'UnityStaticLibrary') env.AddMethod(_wrap_builder(env.UnitySharedLibrary, is_lib = True), 'UnitySharedLibrary') +env.AddMethod(_module, 'Module') if hasattr(env, 'Gch'): env.AddMethod(_wrap_builder(env.Gch), 'Gch') @@ -442,4 +473,30 @@ if dump_env: print(env.Dump()) print('==== End Environment Dump =====') +_old_fn = SCons.Warnings.process_warn_strings + +import SCons.Util +class _FrameWrapper(SCons.Util.Proxy): + def __init__(self, subject): + super().__init__(subject) + + def __getattr__(self, name): + if name == 'retval': + print('YAY') + return super().__getattr__(name) + + +SCons.Script.call_stack[0] = _FrameWrapper(SCons.Script.call_stack[0]) + +print(SCons.Script.call_stack) +def _wrapped(*args, **kwargs): + for target in SCons.Script.BUILD_TARGETS: + if hasattr(target, 'abspath'): + print('Target: ', target.abspath) + else: + print('Target: ', target) + _old_fn(*args, **kwargs) + +SCons.Warnings.process_warn_strings = _wrapped + Return('env')