Added command line tool and removed lib folder from gitignore.

This commit is contained in:
2025-09-20 14:01:31 +02:00
parent 79366c9098
commit b9335a6247
9 changed files with 230 additions and 47 deletions

View File

@@ -23,7 +23,7 @@ from SCons.Script import *
sys.path.append(os.path.join(Dir('.').abspath, 'lib'))
from spp import _init_interface
from spp import _init_interface, Module, Target, TargetType
_init_interface(globals=globals())
@@ -46,12 +46,6 @@ _GCC_CPU_FEATURES_MAP = {
'avx2': '-mavx2'
}
class TargetType(enum.Enum):
PROGRAM = 0
STATIC_LIBRARY = 1
SHARED_LIBRARY = 2
MISC = 3
class _VersionSpec:
minimum_version = None
maximum_version = None
@@ -73,23 +67,6 @@ class _Dependency:
depdeps: list = []
cook_result: dict = {}
@dataclass
class _Module:
name: str
folder: str
description: str
cxx_namespace: str
class _Target:
name: str
target_type: TargetType
builder = None
args: list = []
kwargs: dict = {}
dependencies: list = []
target = None
module: _Module = None
def _find_recipe(env: Environment, recipe_name: str):
if recipe_name in env['SPP_RECIPES']:
return env['SPP_RECIPES'][recipe_name]
@@ -150,7 +127,7 @@ def _module(env: Environment, file: str):
folder = _normalize_module_path(env, env.File(file).dir.abspath)
if folder is not None: # only include modules inside the source tree
dirname = os.path.basename(folder)
env.Append(SPP_MODULES = {folder: _Module(
env.Append(SPP_MODULES = {folder: Module(
name=dirname,
folder=folder,
description='',
@@ -202,7 +179,7 @@ def _inject_dependency(dependency, kwargs: dict, add_sources: bool = True) -> No
_inject_list(kwargs, dependency.cook_result, 'LINKFLAGS')
for depdep in dependency.depdeps:
_inject_dependency(depdep, kwargs)
elif isinstance(dependency, _Target):
elif isinstance(dependency, Target):
_inject_list(kwargs, dependency.kwargs, 'CPPPATH')
_inject_list(kwargs, dependency.kwargs, 'CPPDEFINES')
_inject_list(kwargs, dependency.kwargs, 'LIBPATH')
@@ -489,7 +466,7 @@ def _wrap_builder(builder, target_type: TargetType):
if 'source' in kwargs:
kwargs['source'] = _fix_filearg(kwargs['source'])
target = _Target()
target = Target()
if 'name' in kwargs:
target.name = kwargs['name']
else:
@@ -518,7 +495,7 @@ def _wrap_builder(builder, target_type: TargetType):
def _wrap_default(default):
def _wrapped(env, arg):
if isinstance(arg, _Target):
if isinstance(arg, Target):
env.Append(SPP_DEFAULT_TARGETS = [arg])
elif isinstance(arg, dict) and '_target' in arg:
default(arg['_target'])
@@ -528,7 +505,7 @@ def _wrap_default(default):
def _wrap_depends(depends):
def _wrapped(env, dependant, dependency):
if isinstance(dependant, _Target) or isinstance(dependency, _Target):
if isinstance(dependant, Target) or isinstance(dependency, Target):
env.Append(SPP_TARGET_DEPENDENCIES = [(dependant, dependency, depends)])
return
elif isinstance(dependant, dict) and '_target' in dependant:
@@ -538,7 +515,7 @@ def _wrap_depends(depends):
depends(dependant, dependency)
return _wrapped
def _build_target(target: _Target):
def _build_target(target: Target):
for dependency in target.dependencies:
_inject_dependency(dependency, target.kwargs)
if 'LIBS' in target.kwargs:
@@ -548,7 +525,7 @@ def _build_target(target: _Target):
target.kwargs['LIBS'].remove(lib)
target.kwargs['LIBS'].append(env.File(lib))
pass
elif isinstance(lib, _Target):
elif isinstance(lib, Target):
if not lib.target:
_build_target(lib)
target.kwargs['LIBS'].remove(lib)
@@ -568,6 +545,7 @@ def _finalize(env: Environment):
_generate_project(generate_project)
Exit(0)
_hook_pre_finalize.invoke()
version_requirements = {dep.name: {
'min': dep.version_spec.minimum_version and _version_to_string(dep.version_spec.minimum_version),
'max': dep.version_spec.maximum_version and _version_to_string(dep.version_spec.maximum_version),
@@ -594,13 +572,15 @@ def _finalize(env: Environment):
for target in env['SPP_DEFAULT_TARGETS']:
env.Default(target.target)
for dependant, dependency, depends in env['SPP_TARGET_DEPENDENCIES']:
if isinstance(dependant, _Target):
if isinstance(dependant, Target):
dependant = dependant.target
if isinstance(dependency, _Target):
if isinstance(dependency, Target):
dependency = dependency.target
depends(dependant, dependency)
def _find_target(env: Environment, target_name: str) -> '_Target|None':
_hook_post_finalize.invoke()
def _find_target(env: Environment, target_name: str) -> 'Target|None':
for target in env['SPP_TARGETS']:
if target.name == target_name:
return target
@@ -668,9 +648,9 @@ def _generate_project(project_type: str) -> None:
if ms_style:
return f'{{{result.upper()}}}'
return result
root_path = pathlib.Path(env.Dir('#').abspath)
def _make_entry(target, type, prefix, suffix) -> str:
def _full_path(build_type) -> str:
trgt = _target_entry(target.kwargs['target'])
@@ -719,8 +699,8 @@ def _generate_project(project_type: str) -> None:
return ''
path = path[pos+1:]
return path
def _folder_list(file_list: list[str], skip_eles: int = 0) -> list[str]:
result = {}
for file in file_list:
@@ -739,7 +719,7 @@ def _generate_project(project_type: str) -> None:
def _get_sources(target_dict: dict) -> list[str]:
target : _Target = target_dict['target']
target : Target = target_dict['target']
sources = target.kwargs.get('source')
return [str(pathlib.Path(source.abspath).relative_to(root_path)) for source in sources]
@@ -955,6 +935,9 @@ class _Hook:
_hook_pre_environment = _Hook()
_hook_post_environment = _Hook()
_hook_config_complete = _Hook()
_hook_pre_finalize = _Hook()
_hook_post_finalize = _Hook()
def _load_addon(modname: str, modpath: pathlib.Path) -> None:
_debug('addons', f'Loading addon {modname} from {modpath}.')
@@ -966,12 +949,17 @@ def _load_addon(modname: str, modpath: pathlib.Path) -> None:
if hasattr(module, 'available') and not module.available():
_debug('addons', f'Addon {modname} is not available and will not be loaded.')
return
if hasattr(module, 'pre_environment'):
_hook_pre_environment.add_func(module.pre_environment)
_debug('addons', f'Addon {modname} registered a pre_environment hook.')
if hasattr(module, 'post_environment'):
_hook_post_environment.add_func(module.post_environment)
_debug('addons', f'Addon {modname} registered a post_environment hook.')
def _add_hook(func_name: str, hook: _Hook) -> None:
if hasattr(module, func_name):
hook.add_func(getattr(module, func_name))
_debug('addons', f'Addon {modname} registered a {func_name} hook.')
_add_hook('pre_environment', _hook_pre_environment)
_add_hook('post_environment', _hook_post_environment)
_add_hook('config_complete', _hook_config_complete)
_add_hook('pre_finalize', _hook_pre_finalize)
_add_hook('post_finalize', _hook_post_finalize)
def _load_addons(folder: pathlib.Path) -> None:
_debug('addons', f'Loading addons from {folder}.')
@@ -1235,7 +1223,7 @@ env['SPP_DEFAULT_TARGETS'] = []
env['SPP_TARGET_DEPENDENCIES'] = []
env['SPP_DEPENDENCIES'] = {}
env['SPP_RECIPES'] = {}
env['SPP_MODULES'] = {} # maps from folder to _Module
env['SPP_MODULES'] = {} # maps from folder to Module
env['SPP_CPU_FEATURES'] = config.get('USE_CPU_FEATURES', [])
env['OBJSUFFIX'] = f".{env['BUILD_TYPE']}{env['OBJSUFFIX']}"
@@ -1437,6 +1425,8 @@ env.AddMethod(_find_target, 'FindTarget')
if hasattr(env, 'Gch'):
env.AddMethod(_wrap_builder(env.Gch, TargetType.STATIC_LIBRARY), 'Gch')
_hook_config_complete.invoke()
for addon_file in env.Glob('addons/old/*.py'):
env = SConscript(addon_file, exports = 'env')