Skip to content

Commit e387689

Browse files
authoredAug 7, 2022
Merge pull request godotengine#63919 from Faless/scons/4.x_easy_deps
2 parents 446fdc5 + 951a101 commit e387689

File tree

8 files changed

+57
-23
lines changed

8 files changed

+57
-23
lines changed
 

‎SConstruct

+7-9
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ env_base.__class__.CommandNoCache = methods.CommandNoCache
138138
env_base.__class__.Run = methods.Run
139139
env_base.__class__.disable_warnings = methods.disable_warnings
140140
env_base.__class__.force_optimization_on_debug = methods.force_optimization_on_debug
141+
env_base.__class__.module_add_dependencies = methods.module_add_dependencies
141142
env_base.__class__.module_check_dependencies = methods.module_check_dependencies
142143

143144
env_base["x86_libtheora_opt_gcc"] = False
@@ -705,6 +706,7 @@ if selected_platform in platform_list:
705706
sys.modules.pop("detect")
706707

707708
modules_enabled = OrderedDict()
709+
env.module_dependencies = {}
708710
env.module_icons_paths = []
709711
env.doc_class_path = {}
710712

@@ -716,6 +718,10 @@ if selected_platform in platform_list:
716718
import config
717719

718720
if config.can_build(env, selected_platform):
721+
# Disable it if a required dependency is missing.
722+
if not env.module_check_dependencies(name):
723+
continue
724+
719725
config.configure(env)
720726
# Get doc classes paths (if present)
721727
try:
@@ -738,6 +744,7 @@ if selected_platform in platform_list:
738744
sys.modules.pop("config")
739745

740746
env.module_list = modules_enabled
747+
methods.sort_module_list(env)
741748

742749
methods.update_version(env.module_version_string)
743750

@@ -800,15 +807,6 @@ if selected_platform in platform_list:
800807
if env["minizip"]:
801808
env.Append(CPPDEFINES=["MINIZIP_ENABLED"])
802809

803-
editor_module_list = []
804-
if env["tools"] and not env.module_check_dependencies("tools", editor_module_list):
805-
print(
806-
"Build option 'module_"
807-
+ x
808-
+ "_enabled=no' cannot be used with 'tools=yes' (editor), only with 'tools=no' (export template)."
809-
)
810-
Exit(255)
811-
812810
if not env["verbose"]:
813811
methods.no_verbose(sys, env)
814812

‎methods.py

+39-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import os
22
import re
3+
import sys
34
import glob
45
import subprocess
56
from collections import OrderedDict
@@ -336,31 +337,62 @@ def disable_module(self):
336337
self.disabled_modules.append(self.current_module)
337338

338339

339-
def module_check_dependencies(self, module, dependencies, silent=False):
340+
def module_add_dependencies(self, module, dependencies, optional=False):
341+
"""
342+
Adds dependencies for a given module.
343+
Meant to be used in module `can_build` methods.
344+
"""
345+
if module not in self.module_dependencies:
346+
self.module_dependencies[module] = [[], []]
347+
if optional:
348+
self.module_dependencies[module][1].extend(dependencies)
349+
else:
350+
self.module_dependencies[module][0].extend(dependencies)
351+
352+
353+
def module_check_dependencies(self, module):
340354
"""
341355
Checks if module dependencies are enabled for a given module,
342356
and prints a warning if they aren't.
343357
Meant to be used in module `can_build` methods.
344358
Returns a boolean (True if dependencies are satisfied).
345359
"""
346360
missing_deps = []
347-
for dep in dependencies:
361+
required_deps = self.module_dependencies[module][0] if module in self.module_dependencies else []
362+
for dep in required_deps:
348363
opt = "module_{}_enabled".format(dep)
349364
if not opt in self or not self[opt]:
350365
missing_deps.append(dep)
351366

352367
if missing_deps != []:
353-
if not silent:
354-
print(
355-
"Disabling '{}' module as the following dependencies are not satisfied: {}".format(
356-
module, ", ".join(missing_deps)
357-
)
368+
print(
369+
"Disabling '{}' module as the following dependencies are not satisfied: {}".format(
370+
module, ", ".join(missing_deps)
358371
)
372+
)
359373
return False
360374
else:
361375
return True
362376

363377

378+
def sort_module_list(env):
379+
out = OrderedDict()
380+
deps = {k: v[0] + list(filter(lambda x: x in env.module_list, v[1])) for k, v in env.module_dependencies.items()}
381+
382+
frontier = list(env.module_list.keys())
383+
explored = []
384+
while len(frontier):
385+
cur = frontier.pop()
386+
deps_list = deps[cur] if cur in deps else []
387+
if len(deps_list) and any([d not in explored for d in deps_list]):
388+
# Will explore later, after its dependencies
389+
frontier.insert(0, cur)
390+
continue
391+
explored.append(cur)
392+
for k in explored:
393+
env.module_list.move_to_end(k)
394+
395+
364396
def use_windows_spawn_fix(self, platform=None):
365397

366398
if os.name != "nt":

‎modules/gdscript/config.py

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
def can_build(env, platform):
2+
env.module_add_dependencies("gdscript", ["jsonrpc", "websocket"], True)
23
return True
34

45

‎modules/msdfgen/config.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
def can_build(env, platform):
2-
return env.module_check_dependencies("msdfgen", ["freetype"])
2+
env.module_add_dependencies("msdfgen", ["freetype"])
3+
return True
34

45

56
def configure(env):

‎modules/text_server_adv/SCsub

+2-2
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ def make_icu_data(target, source, env):
3636
# Thirdparty source files
3737

3838
thirdparty_obj = []
39-
freetype_enabled = env.module_check_dependencies("text_server_adv", ["freetype"], True)
40-
msdfgen_enabled = env.module_check_dependencies("text_server_adv", ["msdfgen"], True)
39+
freetype_enabled = "freetype" in env.module_list
40+
msdfgen_enabled = "msdfgen" in env.module_list
4141

4242
if env["builtin_harfbuzz"]:
4343
env_harfbuzz = env_modules.Clone()

‎modules/text_server_fb/SCsub

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
Import("env")
44
Import("env_modules")
55

6-
freetype_enabled = env.module_check_dependencies("text_server_fb", ["freetype"], True)
7-
msdfgen_enabled = env.module_check_dependencies("text_server_fb", ["msdfgen"], True)
6+
freetype_enabled = "freetype" in env.module_list
7+
msdfgen_enabled = "msdfgen" in env.module_list
88

99
env_text_server_fb = env_modules.Clone()
1010

‎modules/theora/config.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
def can_build(env, platform):
22
if env["arch"].startswith("rv"):
33
return False
4-
return env.module_check_dependencies("theora", ["ogg", "vorbis"])
4+
env.module_add_dependencies("theora", ["ogg", "vorbis"])
5+
return True
56

67

78
def configure(env):

‎modules/vorbis/config.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
def can_build(env, platform):
2-
return env.module_check_dependencies("vorbis", ["ogg"])
2+
env.module_add_dependencies("vorbis", ["ogg"])
3+
return True
34

45

56
def configure(env):

0 commit comments

Comments
 (0)
Please sign in to comment.