Some tests.
This commit is contained in:
parent
6c1ad82c16
commit
8bea4a6db5
87
SConscript
87
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')
|
||||
|
Loading…
x
Reference in New Issue
Block a user