Some tests.

This commit is contained in:
Patrick 2024-08-06 09:33:42 +02:00
parent 6c1ad82c16
commit 8bea4a6db5

View File

@ -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')