From db09eb5e3a6144b7f1529ae26ab124c66490180c Mon Sep 17 00:00:00 2001 From: Patrick Wuttke Date: Sat, 20 Sep 2025 11:04:49 +0200 Subject: [PATCH] Replaced S++ submodule with loader script. --- .gitmodules | 3 -- external/scons-plus-plus | 1 - external/scons-plus-plus/SConscript | 84 +++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 4 deletions(-) delete mode 100644 .gitmodules delete mode 160000 external/scons-plus-plus create mode 100644 external/scons-plus-plus/SConscript diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 251d615..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "scons-plus-plus"] - path = external/scons-plus-plus - url = https://git.mewin.de/mewin/scons-plus-plus.git diff --git a/external/scons-plus-plus b/external/scons-plus-plus deleted file mode 160000 index 9436d2c..0000000 --- a/external/scons-plus-plus +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 9436d2c48d91dc104099d8805c696a85d7bd37f2 diff --git a/external/scons-plus-plus/SConscript b/external/scons-plus-plus/SConscript new file mode 100644 index 0000000..2faeb4f --- /dev/null +++ b/external/scons-plus-plus/SConscript @@ -0,0 +1,84 @@ +""" +SCons++ Bootstrapper +""" + + +import os +from pathlib import Path +import shutil +import subprocess +import sys +from SCons.Environment import Environment + + +Import('config') + + +_SPP_FOLDER_NAME = 'scons-plus-plus' +_SPP_DEFAULT_REPOSITORY = 'https://git.mewin.de/mewin/scons-plus-plus.git' +_SPP_DEFAULT_BRANCH = 'master' + + +spp_root: Path +spp_repository: str +spp_branch: str + +def _main() -> Environment: + global spp_root, spp_repository, spp_branch + + spp_root = config.get('SPP_ROOT') + if spp_root is None: + spp_root = _get_default_spp_root() + elif not isinstance(spp_root, Path): + spp_root = Path(str(spp_root)) + spp_root = spp_root.absolute() + + spp_repository = config.get('SPP_REPOSITORY', _SPP_DEFAULT_REPOSITORY) + spp_branch = config.get('SPP_BRANCH', _SPP_DEFAULT_BRANCH) + + _printinfo(f'Using SCons++ root at: {spp_root}') + + if not spp_root.exists(): + _printinfo('SCons++ does not yet exist, downloading it.') + _install_spp() + + spp_script = spp_root / 'SConscript' + if not spp_script.exists(): + _printerr(f'SCons++ main script not found at {spp_script}!') + sys.exit(1) + return SConscript(spp_script, exports=['config']) + +def _get_default_spp_root() -> Path: + if os.name == 'posix': + # follow XDG specification -> first try $XDG_DATA_HOME, then $HOME/.local/share + data_home = os.environ.get('XDG_DATA_HOME') + if data_home is not None: + return Path(data_home, _SPP_FOLDER_NAME) + home = os.environ.get('HOME') + if home is not None: + return Path(home, '.local', 'share', _SPP_FOLDER_NAME) + elif os.name == 'nt': + # just use LocalAppData, which should always be set on Windows + return Path(os.environ['LocalAppData'], _SPP_FOLDER_NAME) + _printinfo(f'Could not detect SCons++ root directory, falling back to ./{_SPP_FOLDER_NAME}.') + return Path(_SPP_FOLDER_NAME) + +def _install_spp() -> None: + git_exe = shutil.which('git') + if git_exe is None: + _printerr('No git executable found, cannot install SCons++.') + sys.exit(1) + _exec_checked((git_exe, 'clone', '-b', spp_branch, '--progress', spp_repository, spp_root)) + +def _exec_checked(args: Sequence[str], **kwargs) -> None: + subprocess.run(args, stdout=sys.stdout, stderr=sys.stderr, check=True, **kwargs) + +if not GetOption('silent'): + _printinfo = print +else: + def _printinfo(*args): ... +def _printerr(*args) -> None: + print(*args, file=sys.stderr) + +env = _main() +Return('env')