Some tests.
This commit is contained in:
parent
6c1ad82c16
commit
8bea4a6db5
87
SConscript
87
SConscript
@ -5,6 +5,21 @@ import psutil
|
|||||||
import sys
|
import sys
|
||||||
import time
|
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):
|
def _cook(env: Environment, recipe_name: str, *args, **kwargs):
|
||||||
import importlib.util
|
import importlib.util
|
||||||
source_file = None
|
source_file = None
|
||||||
@ -20,6 +35,9 @@ def _cook(env: Environment, recipe_name: str, *args, **kwargs):
|
|||||||
spec.loader.exec_module(recipe)
|
spec.loader.exec_module(recipe)
|
||||||
return recipe.cook(env, *args, **kwargs)
|
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:
|
def _parse_lib_conf(env: Environment, lib_conf: dict) -> None:
|
||||||
env.Append(CPPPATH = lib_conf.get('CPPPATH', []),
|
env.Append(CPPPATH = lib_conf.get('CPPPATH', []),
|
||||||
CPPDEFINES = lib_conf.get('CPPDEFINES', []),
|
CPPDEFINES = lib_conf.get('CPPDEFINES', []),
|
||||||
@ -84,8 +102,24 @@ def _error(env: Environment, message: str):
|
|||||||
print(message, file=sys.stderr)
|
print(message, file=sys.stderr)
|
||||||
env.Exit(1)
|
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 _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:
|
if 'CPPPATH' not in kwargs:
|
||||||
kwargs['CPPPATH'] = copy.copy(env['CPPPATH'])
|
kwargs['CPPPATH'] = copy.copy(env['CPPPATH'])
|
||||||
if 'CPPDEFINES' not in kwargs:
|
if 'CPPDEFINES' not in kwargs:
|
||||||
@ -94,8 +128,6 @@ def _wrap_builder(builder, is_lib: bool = False):
|
|||||||
kwargs['LIBPATH'] = copy.copy(env['LIBPATH'])
|
kwargs['LIBPATH'] = copy.copy(env['LIBPATH'])
|
||||||
if 'LIBS' not in kwargs and 'LIBS' in env:
|
if 'LIBS' not in kwargs and 'LIBS' in env:
|
||||||
kwargs['LIBS'] = copy.copy(env['LIBS'])
|
kwargs['LIBS'] = copy.copy(env['LIBS'])
|
||||||
for dependency in dependencies:
|
|
||||||
_inject_dependency(dependency, kwargs)
|
|
||||||
if 'LIBS' in kwargs:
|
if 'LIBS' in kwargs:
|
||||||
libs_copy = list(kwargs['LIBS'])
|
libs_copy = list(kwargs['LIBS'])
|
||||||
for lib in libs_copy:
|
for lib in libs_copy:
|
||||||
@ -103,21 +135,19 @@ def _wrap_builder(builder, is_lib: bool = False):
|
|||||||
kwargs['LIBS'].remove(lib)
|
kwargs['LIBS'].remove(lib)
|
||||||
kwargs['source'].append(lib)
|
kwargs['source'].append(lib)
|
||||||
|
|
||||||
result = builder(*args, **kwargs)
|
target = _Target()
|
||||||
if is_lib:
|
target.target = kwargs.get('target', None)
|
||||||
# generate a new libconf
|
target.source = kwargs.get('source', None)
|
||||||
return {
|
target.builder = builder
|
||||||
'CPPPATH': kwargs.get('CPPPATH', []),
|
target.args = args
|
||||||
'CPPDEFINES': kwargs.get('CPPDEFINES', []),
|
target.kwargs = kwargs
|
||||||
'LIBPATH': kwargs.get('LIBPATH', []),
|
target.dependencies = target_dependencies
|
||||||
'LIBS': result + kwargs.get('LIBS', []),
|
# return _Builder(target=kwargs.get('target', None), source=kwargs.get('source', None), env=env, _target=target)
|
||||||
'ADDITIONAL_SOURCES': kwargs.get('add_source', []),
|
return builder(*args, **kwargs)
|
||||||
'_target': result
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
return _wrapped
|
return _wrapped
|
||||||
|
|
||||||
def _wrap_default(default):
|
def _wrap_default(default):
|
||||||
|
print(default)
|
||||||
def _wrapped(env, arg):
|
def _wrapped(env, arg):
|
||||||
if isinstance(arg, dict) and '_target' in arg:
|
if isinstance(arg, dict) and '_target' in arg:
|
||||||
default(arg['_target'])
|
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.UnityLibrary, is_lib = True), 'UnityLibrary')
|
||||||
env.AddMethod(_wrap_builder(env.UnityStaticLibrary, is_lib = True), 'UnityStaticLibrary')
|
env.AddMethod(_wrap_builder(env.UnityStaticLibrary, is_lib = True), 'UnityStaticLibrary')
|
||||||
env.AddMethod(_wrap_builder(env.UnitySharedLibrary, is_lib = True), 'UnitySharedLibrary')
|
env.AddMethod(_wrap_builder(env.UnitySharedLibrary, is_lib = True), 'UnitySharedLibrary')
|
||||||
|
env.AddMethod(_module, 'Module')
|
||||||
|
|
||||||
if hasattr(env, 'Gch'):
|
if hasattr(env, 'Gch'):
|
||||||
env.AddMethod(_wrap_builder(env.Gch), 'Gch')
|
env.AddMethod(_wrap_builder(env.Gch), 'Gch')
|
||||||
@ -442,4 +473,30 @@ if dump_env:
|
|||||||
print(env.Dump())
|
print(env.Dump())
|
||||||
print('==== End Environment 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')
|
Return('env')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user