[Scons] Implement module dependency sorting.

Modules can now call:

env.module_add_dependencies(name: str, deps: list, optional: bool)

To add required or optional dependencies during the "can_build" step.

Required dependencies will be checked and the module will be not be
enabled when they are missing, printing a warning to notify the user.
This commit is contained in:
Fabio Alessandrelli
2022-08-04 19:11:01 +02:00
parent bed2482ce2
commit 951a1016d3
8 changed files with 57 additions and 23 deletions

View File

@ -138,6 +138,7 @@ env_base.__class__.CommandNoCache = methods.CommandNoCache
env_base.__class__.Run = methods.Run
env_base.__class__.disable_warnings = methods.disable_warnings
env_base.__class__.force_optimization_on_debug = methods.force_optimization_on_debug
env_base.__class__.module_add_dependencies = methods.module_add_dependencies
env_base.__class__.module_check_dependencies = methods.module_check_dependencies
env_base["x86_libtheora_opt_gcc"] = False
@ -699,6 +700,7 @@ if selected_platform in platform_list:
sys.modules.pop("detect")
modules_enabled = OrderedDict()
env.module_dependencies = {}
env.module_icons_paths = []
env.doc_class_path = {}
@ -710,6 +712,10 @@ if selected_platform in platform_list:
import config
if config.can_build(env, selected_platform):
# Disable it if a required dependency is missing.
if not env.module_check_dependencies(name):
continue
config.configure(env)
# Get doc classes paths (if present)
try:
@ -732,6 +738,7 @@ if selected_platform in platform_list:
sys.modules.pop("config")
env.module_list = modules_enabled
methods.sort_module_list(env)
methods.update_version(env.module_version_string)
@ -794,15 +801,6 @@ if selected_platform in platform_list:
if env["minizip"]:
env.Append(CPPDEFINES=["MINIZIP_ENABLED"])
editor_module_list = []
if env["tools"] and not env.module_check_dependencies("tools", editor_module_list):
print(
"Build option 'module_"
+ x
+ "_enabled=no' cannot be used with 'tools=yes' (editor), only with 'tools=no' (export template)."
)
Exit(255)
if not env["verbose"]:
methods.no_verbose(sys, env)