diff --git a/SConstruct b/SConstruct index 925ad15c5..34a1232c3 100644 --- a/SConstruct +++ b/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) diff --git a/methods.py b/methods.py index 39d02f844..5a46e9f1a 100644 --- a/methods.py +++ b/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": diff --git a/modules/opus/config.py b/modules/opus/config.py index aaf2131fb..3960c865f 100644 --- a/modules/opus/config.py +++ b/modules/opus/config.py @@ -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): diff --git a/modules/theora/config.py b/modules/theora/config.py index 05a1426ae..7f1b501ea 100644 --- a/modules/theora/config.py +++ b/modules/theora/config.py @@ -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): diff --git a/modules/vorbis/config.py b/modules/vorbis/config.py index 5799d96e4..c1458657c 100644 --- a/modules/vorbis/config.py +++ b/modules/vorbis/config.py @@ -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):