mirror of
https://github.com/Relintai/pandemonium_engine.git
synced 2024-11-21 16:37:20 +01:00
Backported: [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.
- Faless
951a1016d3
This commit is contained in:
parent
4732493761
commit
91fe9ed8ca
17
SConstruct
17
SConstruct
@ -94,6 +94,7 @@ env_base.__class__.add_library = methods.add_library
|
||||
env_base.__class__.add_program = methods.add_program
|
||||
env_base.__class__.CommandNoCache = methods.CommandNoCache
|
||||
env_base.__class__.disable_warnings = methods.disable_warnings
|
||||
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
|
||||
@ -567,6 +568,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 = {}
|
||||
|
||||
@ -578,6 +580,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:
|
||||
@ -601,7 +607,13 @@ if selected_platform in platform_list:
|
||||
sys.path.remove(path)
|
||||
sys.modules.pop("config")
|
||||
|
||||
#TODO hack, the editor should be a module aswell
|
||||
if env["tools"] and not env["module_freetype_enabled"]:
|
||||
print("The editor (tools=yes) can't be built if freetype is disabled! Stopping.")
|
||||
sys.exit(255)
|
||||
|
||||
env.module_list = modules_enabled
|
||||
methods.sort_module_list(env)
|
||||
|
||||
methods.update_version(env.module_version_string)
|
||||
|
||||
@ -647,11 +659,6 @@ if selected_platform in platform_list:
|
||||
if env["minizip"]:
|
||||
env.Append(CPPDEFINES=["MINIZIP_ENABLED"])
|
||||
|
||||
editor_module_list = ["freetype"]
|
||||
if env["tools"] and not env.module_check_dependencies("tools", editor_module_list):
|
||||
print("The editor (tools=yes) can't be built if it's dependencies are not satisfied! Stopping.")
|
||||
sys.exit(255)
|
||||
|
||||
if not env["verbose"]:
|
||||
methods.no_verbose(sys, env)
|
||||
|
||||
|
34
methods.py
34
methods.py
@ -306,7 +306,19 @@ def convert_custom_modules_path(path):
|
||||
def disable_module(self):
|
||||
self.disabled_modules.append(self.current_module)
|
||||
|
||||
def module_check_dependencies(self, module, dependencies):
|
||||
def module_add_dependencies(self, module, dependencies, optional=False):
|
||||
"""
|
||||
Adds dependencies for a given module.
|
||||
Meant to be used in module `can_build` methods.
|
||||
"""
|
||||
if module not in self.module_dependencies:
|
||||
self.module_dependencies[module] = [[], []]
|
||||
if optional:
|
||||
self.module_dependencies[module][1].extend(dependencies)
|
||||
else:
|
||||
self.module_dependencies[module][0].extend(dependencies)
|
||||
|
||||
def module_check_dependencies(self, module):
|
||||
"""
|
||||
Checks if module dependencies are enabled for a given module,
|
||||
and prints a warning if they aren't.
|
||||
@ -314,7 +326,8 @@ def module_check_dependencies(self, module, dependencies):
|
||||
Returns a boolean (True if dependencies are satisfied).
|
||||
"""
|
||||
missing_deps = []
|
||||
for dep in dependencies:
|
||||
required_deps = self.module_dependencies[module][0] if module in self.module_dependencies else []
|
||||
for dep in required_deps:
|
||||
opt = "module_{}_enabled".format(dep)
|
||||
if not opt in self or not self[opt]:
|
||||
missing_deps.append(dep)
|
||||
@ -329,6 +342,23 @@ def module_check_dependencies(self, module, dependencies):
|
||||
else:
|
||||
return True
|
||||
|
||||
def sort_module_list(env):
|
||||
out = OrderedDict()
|
||||
deps = {k: v[0] + list(filter(lambda x: x in env.module_list, v[1])) for k, v in env.module_dependencies.items()}
|
||||
|
||||
frontier = list(env.module_list.keys())
|
||||
explored = []
|
||||
while len(frontier):
|
||||
cur = frontier.pop()
|
||||
deps_list = deps[cur] if cur in deps else []
|
||||
if len(deps_list) and any([d not in explored for d in deps_list]):
|
||||
# Will explore later, after its dependencies
|
||||
frontier.insert(0, cur)
|
||||
continue
|
||||
explored.append(cur)
|
||||
for k in explored:
|
||||
env.module_list.move_to_end(k)
|
||||
|
||||
def use_windows_spawn_fix(self, platform=None):
|
||||
|
||||
if os.name != "nt":
|
||||
|
@ -1,7 +1,8 @@
|
||||
|
||||
|
||||
def can_build(env, platform):
|
||||
return env.module_check_dependencies("opus", ["ogg"])
|
||||
env.module_add_dependencies("opus", ["ogg"])
|
||||
return True
|
||||
|
||||
|
||||
def configure(env):
|
||||
|
@ -1,6 +1,7 @@
|
||||
|
||||
def can_build(env, platform):
|
||||
return env.module_check_dependencies("theora", ["ogg", "vorbis"])
|
||||
env.module_add_dependencies("theora", ["ogg", "vorbis"])
|
||||
return True
|
||||
|
||||
|
||||
def configure(env):
|
||||
|
@ -1,6 +1,7 @@
|
||||
|
||||
def can_build(env, platform):
|
||||
return env.module_check_dependencies("vorbis", ["ogg"])
|
||||
env.module_add_dependencies("vorbis", ["ogg"])
|
||||
return True
|
||||
|
||||
|
||||
def configure(env):
|
||||
|
Loading…
Reference in New Issue
Block a user