Skip to content

Commit

Permalink
SCons: Add only selected platform's opts to env
Browse files Browse the repository at this point in the history
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 godotengine#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.
  • Loading branch information
akien-mga committed Dec 16, 2020
1 parent c514cc5 commit 0f84d8d
Show file tree
Hide file tree
Showing 7 changed files with 13 additions and 29 deletions.
24 changes: 11 additions & 13 deletions SConstruct
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import glsl_builders
# Scan possible build platforms

platform_list = [] # list of platforms
platform_opts = {} # options for each platform
platform_flags = {} # flags for each platform

active_platforms = []
Expand All @@ -44,7 +43,6 @@ for x in sorted(glob.glob("platform/*")):
x = x.replace("platform/", "") # rest of world
x = x.replace("platform\\", "") # win32
platform_list += [x]
platform_opts[x] = detect.get_opts()
platform_flags[x] = detect.get_flags()
sys.path.remove(tmppath)
sys.modules.pop("detect")
Expand Down Expand Up @@ -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("tests", "Build the unit tests", 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
opts.Add(BoolVariable("deprecated", "Enable deprecated features", True))
Expand All @@ -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("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(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_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("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
# 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_certs", "Use the built-in SSL certificates bundles", True))
opts.Add(BoolVariable("builtin_enet", "Use the built-in ENet library", True))
Expand Down Expand Up @@ -176,13 +172,6 @@ opts.Add("CFLAGS", "Custom flags for the C compiler")
opts.Add("CXXFLAGS", "Custom flags for the C++ compiler")
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
# defined in a file rather than specified via the command line.
opts.Update(env_base)
Expand Down Expand Up @@ -225,7 +214,6 @@ methods.write_modules(modules_detected)

# Update the environment again after all the module options are added.
opts.Update(env_base)
Help(opts.GenerateHelpText(env_base))

# add default include paths

Expand Down Expand Up @@ -301,6 +289,12 @@ if selected_platform in platform_list:
sys.path.insert(0, tmppath)
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):
env = detect.create(env_base)
else:
Expand Down Expand Up @@ -670,6 +664,10 @@ elif selected_platform != "":
else:
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.
if "env" in locals():
methods.show_progress(env)
Expand Down
3 changes: 0 additions & 3 deletions platform/iphone/detect.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ def get_name():


def can_build():

if sys.platform == "darwin" or ("OSXCROSS_IOS" in os.environ):
return True

Expand Down Expand Up @@ -41,14 +40,12 @@ def get_opts():


def get_flags():

return [
("tools", False),
]


def configure(env):

## Build type

if env["target"].startswith("release"):
Expand Down
3 changes: 0 additions & 3 deletions platform/linuxbsd/detect.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ def get_name():


def can_build():

if os.name != "posix" or sys.platform == "darwin":
return False

Expand Down Expand Up @@ -81,12 +80,10 @@ def get_opts():


def get_flags():

return []


def configure(env):

## Build type

if env["target"] == "release":
Expand Down
4 changes: 1 addition & 3 deletions platform/osx/detect.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ def get_name():


def can_build():

if sys.platform == "darwin" or ("OSXCROSS_ROOT" in os.environ):
return True

Expand All @@ -31,6 +30,7 @@ def get_opts():
" validation layers)",
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")),
BoolVariable("separate_debug_symbols", "Create a separate file containing debugging symbols", False),
BoolVariable("use_ubsan", "Use LLVM/GCC compiler undefined behavior sanitizer (UBSAN)", False),
Expand All @@ -40,12 +40,10 @@ def get_opts():


def get_flags():

return []


def configure(env):

## Build type

if env["target"] == "release":
Expand Down
2 changes: 0 additions & 2 deletions platform/server/detect.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ def get_program_suffix():


def can_build():

if os.name != "posix":
return False

Expand All @@ -46,7 +45,6 @@ def get_opts():


def get_flags():

return []


Expand Down
2 changes: 0 additions & 2 deletions platform/uwp/detect.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ def get_opts():


def get_flags():

return [
("tools", False),
("xaudio2", True),
Expand All @@ -39,7 +38,6 @@ def get_flags():


def configure(env):

env.msvc = True

if env["bits"] != "default":
Expand Down
4 changes: 1 addition & 3 deletions platform/windows/detect.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,20 +68,18 @@ def get_opts():
EnumVariable("windows_subsystem", "Windows subsystem", "default", ("default", "console", "gui")),
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),
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_thinlto", "Use ThinLTO", False),
BoolVariable("use_static_cpp", "Link MinGW/MSVC C++ runtime libraries statically", True),
]


def get_flags():

return []


def build_res_file(target, source, env):

if env["bits"] == "32":
cmdbase = env["mingw_prefix_32"]
else:
Expand Down

0 comments on commit 0f84d8d

Please sign in to comment.