SCons: Add only selected platform's opts to env

Otherwise we can get situations where platform-specific opts with the same name
can override each other depending on the order at which platforms are parsed,
as was the case with `use_static_cpp` in Linux/Windows.

Fixes #44304.

This also has the added benefit that the `scons --help` output will now only
include the options which are relevant for the selected (or detected) platform.
This commit is contained in:
Rémi Verschelde 2020-12-16 16:29:32 +01:00
parent c514cc5822
commit 0f84d8dc49
No known key found for this signature in database
GPG key ID: C3336907360768E1
7 changed files with 13 additions and 29 deletions

View file

@ -17,7 +17,6 @@ import glsl_builders
# Scan possible build platforms # Scan possible build platforms
platform_list = [] # list of platforms platform_list = [] # list of platforms
platform_opts = {} # options for each platform
platform_flags = {} # flags for each platform platform_flags = {} # flags for each platform
active_platforms = [] active_platforms = []
@ -44,7 +43,6 @@ for x in sorted(glob.glob("platform/*")):
x = x.replace("platform/", "") # rest of world x = x.replace("platform/", "") # rest of world
x = x.replace("platform\\", "") # win32 x = x.replace("platform\\", "") # win32
platform_list += [x] platform_list += [x]
platform_opts[x] = detect.get_opts()
platform_flags[x] = detect.get_flags() platform_flags[x] = detect.get_flags()
sys.path.remove(tmppath) sys.path.remove(tmppath)
sys.modules.pop("detect") sys.modules.pop("detect")
@ -115,7 +113,6 @@ opts.Add(EnumVariable("optimize", "Optimization type", "speed", ("speed", "size"
opts.Add(BoolVariable("tools", "Build the tools (a.k.a. the Godot editor)", True)) opts.Add(BoolVariable("tools", "Build the tools (a.k.a. the Godot editor)", True))
opts.Add(BoolVariable("tests", "Build the unit tests", False)) opts.Add(BoolVariable("tests", "Build the unit tests", False))
opts.Add(BoolVariable("use_lto", "Use link-time optimization", False)) opts.Add(BoolVariable("use_lto", "Use link-time optimization", False))
opts.Add(BoolVariable("use_precise_math_checks", "Math checks use very precise epsilon (debug option)", False))
# Components # Components
opts.Add(BoolVariable("deprecated", "Enable deprecated features", True)) opts.Add(BoolVariable("deprecated", "Enable deprecated features", True))
@ -131,14 +128,13 @@ opts.Add(BoolVariable("werror", "Treat compiler warnings as errors", False))
opts.Add(BoolVariable("dev", "If yes, alias for verbose=yes warnings=extra werror=yes", False)) opts.Add(BoolVariable("dev", "If yes, alias for verbose=yes warnings=extra werror=yes", False))
opts.Add("extra_suffix", "Custom extra suffix added to the base filename of all generated binary files", "") opts.Add("extra_suffix", "Custom extra suffix added to the base filename of all generated binary files", "")
opts.Add(BoolVariable("vsproj", "Generate a Visual Studio solution", False)) opts.Add(BoolVariable("vsproj", "Generate a Visual Studio solution", False))
opts.Add(EnumVariable("macports_clang", "Build using Clang from MacPorts", "no", ("no", "5.0", "devel")))
opts.Add(BoolVariable("disable_3d", "Disable 3D nodes for a smaller executable", False)) opts.Add(BoolVariable("disable_3d", "Disable 3D nodes for a smaller executable", False))
opts.Add(BoolVariable("disable_advanced_gui", "Disable advanced GUI nodes and behaviors", False)) opts.Add(BoolVariable("disable_advanced_gui", "Disable advanced GUI nodes and behaviors", False))
opts.Add(BoolVariable("no_editor_splash", "Don't use the custom splash screen for the editor", False)) opts.Add(BoolVariable("no_editor_splash", "Don't use the custom splash screen for the editor", False))
opts.Add("system_certs_path", "Use this path as SSL certificates default for editor (for package maintainers)", "") opts.Add("system_certs_path", "Use this path as SSL certificates default for editor (for package maintainers)", "")
opts.Add(BoolVariable("use_precise_math_checks", "Math checks use very precise epsilon (debug option)", False))
# Thirdparty libraries # Thirdparty libraries
# opts.Add(BoolVariable('builtin_assimp', "Use the built-in Assimp library", True))
opts.Add(BoolVariable("builtin_bullet", "Use the built-in Bullet library", True)) opts.Add(BoolVariable("builtin_bullet", "Use the built-in Bullet library", True))
opts.Add(BoolVariable("builtin_certs", "Use the built-in SSL certificates bundles", True)) opts.Add(BoolVariable("builtin_certs", "Use the built-in SSL certificates bundles", True))
opts.Add(BoolVariable("builtin_enet", "Use the built-in ENet library", True)) opts.Add(BoolVariable("builtin_enet", "Use the built-in ENet library", True))
@ -176,13 +172,6 @@ opts.Add("CFLAGS", "Custom flags for the C compiler")
opts.Add("CXXFLAGS", "Custom flags for the C++ compiler") opts.Add("CXXFLAGS", "Custom flags for the C++ compiler")
opts.Add("LINKFLAGS", "Custom flags for the linker") opts.Add("LINKFLAGS", "Custom flags for the linker")
# add platform specific options
for k in platform_opts.keys():
opt_list = platform_opts[k]
for o in opt_list:
opts.Add(o)
# Update the environment now as the "custom_modules" option may be # Update the environment now as the "custom_modules" option may be
# defined in a file rather than specified via the command line. # defined in a file rather than specified via the command line.
opts.Update(env_base) opts.Update(env_base)
@ -225,7 +214,6 @@ methods.write_modules(modules_detected)
# Update the environment again after all the module options are added. # Update the environment again after all the module options are added.
opts.Update(env_base) opts.Update(env_base)
Help(opts.GenerateHelpText(env_base))
# add default include paths # add default include paths
@ -301,6 +289,12 @@ if selected_platform in platform_list:
sys.path.insert(0, tmppath) sys.path.insert(0, tmppath)
import detect import detect
# Add platform-specific options.
for opt in detect.get_opts():
opts.Add(opt)
opts.Update(env_base)
Help(opts.GenerateHelpText(env_base))
if "create" in dir(detect): if "create" in dir(detect):
env = detect.create(env_base) env = detect.create(env_base)
else: else:
@ -670,6 +664,10 @@ elif selected_platform != "":
else: else:
Exit(255) Exit(255)
else:
# Update help to include options.
Help(opts.GenerateHelpText(env_base))
# The following only makes sense when the 'env' is defined, and assumes it is. # The following only makes sense when the 'env' is defined, and assumes it is.
if "env" in locals(): if "env" in locals():
methods.show_progress(env) methods.show_progress(env)

View file

@ -12,7 +12,6 @@ def get_name():
def can_build(): def can_build():
if sys.platform == "darwin" or ("OSXCROSS_IOS" in os.environ): if sys.platform == "darwin" or ("OSXCROSS_IOS" in os.environ):
return True return True
@ -41,14 +40,12 @@ def get_opts():
def get_flags(): def get_flags():
return [ return [
("tools", False), ("tools", False),
] ]
def configure(env): def configure(env):
## Build type ## Build type
if env["target"].startswith("release"): if env["target"].startswith("release"):

View file

@ -12,7 +12,6 @@ def get_name():
def can_build(): def can_build():
if os.name != "posix" or sys.platform == "darwin": if os.name != "posix" or sys.platform == "darwin":
return False return False
@ -81,12 +80,10 @@ def get_opts():
def get_flags(): def get_flags():
return [] return []
def configure(env): def configure(env):
## Build type ## Build type
if env["target"] == "release": if env["target"] == "release":

View file

@ -12,7 +12,6 @@ def get_name():
def can_build(): def can_build():
if sys.platform == "darwin" or ("OSXCROSS_ROOT" in os.environ): if sys.platform == "darwin" or ("OSXCROSS_ROOT" in os.environ):
return True return True
@ -31,6 +30,7 @@ def get_opts():
" validation layers)", " validation layers)",
False, False,
), ),
EnumVariable("macports_clang", "Build using Clang from MacPorts", "no", ("no", "5.0", "devel")),
EnumVariable("debug_symbols", "Add debugging symbols to release/release_debug builds", "yes", ("yes", "no")), EnumVariable("debug_symbols", "Add debugging symbols to release/release_debug builds", "yes", ("yes", "no")),
BoolVariable("separate_debug_symbols", "Create a separate file containing debugging symbols", False), BoolVariable("separate_debug_symbols", "Create a separate file containing debugging symbols", False),
BoolVariable("use_ubsan", "Use LLVM/GCC compiler undefined behavior sanitizer (UBSAN)", False), BoolVariable("use_ubsan", "Use LLVM/GCC compiler undefined behavior sanitizer (UBSAN)", False),
@ -40,12 +40,10 @@ def get_opts():
def get_flags(): def get_flags():
return [] return []
def configure(env): def configure(env):
## Build type ## Build type
if env["target"] == "release": if env["target"] == "release":

View file

@ -21,7 +21,6 @@ def get_program_suffix():
def can_build(): def can_build():
if os.name != "posix": if os.name != "posix":
return False return False
@ -46,7 +45,6 @@ def get_opts():
def get_flags(): def get_flags():
return [] return []

View file

@ -30,7 +30,6 @@ def get_opts():
def get_flags(): def get_flags():
return [ return [
("tools", False), ("tools", False),
("xaudio2", True), ("xaudio2", True),
@ -39,7 +38,6 @@ def get_flags():
def configure(env): def configure(env):
env.msvc = True env.msvc = True
if env["bits"] != "default": if env["bits"] != "default":

View file

@ -68,7 +68,7 @@ def get_opts():
EnumVariable("windows_subsystem", "Windows subsystem", "default", ("default", "console", "gui")), EnumVariable("windows_subsystem", "Windows subsystem", "default", ("default", "console", "gui")),
BoolVariable("separate_debug_symbols", "Create a separate file containing debugging symbols", False), BoolVariable("separate_debug_symbols", "Create a separate file containing debugging symbols", False),
("msvc_version", "MSVC version to use. Ignored if VCINSTALLDIR is set in shell env.", None), ("msvc_version", "MSVC version to use. Ignored if VCINSTALLDIR is set in shell env.", None),
BoolVariable("use_mingw", "Use the Mingw compiler, even if MSVC is installed. Only used on Windows.", False), BoolVariable("use_mingw", "Use the Mingw compiler, even if MSVC is installed.", False),
BoolVariable("use_llvm", "Use the LLVM compiler", False), BoolVariable("use_llvm", "Use the LLVM compiler", False),
BoolVariable("use_thinlto", "Use ThinLTO", False), BoolVariable("use_thinlto", "Use ThinLTO", False),
BoolVariable("use_static_cpp", "Link MinGW/MSVC C++ runtime libraries statically", True), BoolVariable("use_static_cpp", "Link MinGW/MSVC C++ runtime libraries statically", True),
@ -76,12 +76,10 @@ def get_opts():
def get_flags(): def get_flags():
return [] return []
def build_res_file(target, source, env): def build_res_file(target, source, env):
if env["bits"] == "32": if env["bits"] == "32":
cmdbase = env["mingw_prefix_32"] cmdbase = env["mingw_prefix_32"]
else: else: