SCons: Add `production=yes` option to use production defaults
This is meant for users making custom builds to match the options used on optimized, official builds. This enables, on the platforms which support them: - `use_static_cpp=yes` (portable binaries for Linux and Windows) - `use_lto=yes` (link time optimizations - note: requires a lot of RAM!) - `debug_symbols=no` (no debug symbols, smaller binaries) Also abort when using MSVC with `production=yes`, as: - It cannot optimize the GDScript VM like GCC or Clang do, leading to significant performance drops. - Its LTO support is unreliable, at least used to trigger crashes last we tried it extensively. All options can still be overridden if specified, and the `dev=yes` option was changed to also support overrides.
This commit is contained in:
parent
3a3af0279b
commit
db26871210
46
SConstruct
46
SConstruct
|
@ -105,15 +105,14 @@ if profile:
|
||||||
opts = Variables(customs, ARGUMENTS)
|
opts = Variables(customs, ARGUMENTS)
|
||||||
|
|
||||||
# Target build options
|
# Target build options
|
||||||
opts.Add("arch", "Platform-dependent architecture (arm/arm64/x86/x64/mips/...)", "")
|
|
||||||
opts.Add(EnumVariable("bits", "Target platform bits", "default", ("default", "32", "64")))
|
|
||||||
opts.Add("p", "Platform (alias for 'platform')", "")
|
opts.Add("p", "Platform (alias for 'platform')", "")
|
||||||
opts.Add("platform", "Target platform (%s)" % ("|".join(platform_list),), "")
|
opts.Add("platform", "Target platform (%s)" % ("|".join(platform_list),), "")
|
||||||
opts.Add(EnumVariable("target", "Compilation target", "debug", ("debug", "release_debug", "release")))
|
|
||||||
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(EnumVariable("target", "Compilation target", "debug", ("debug", "release_debug", "release")))
|
||||||
|
opts.Add("arch", "Platform-dependent architecture (arm/arm64/x86/x64/mips/...)", "")
|
||||||
|
opts.Add(EnumVariable("bits", "Target platform bits", "default", ("default", "32", "64")))
|
||||||
|
opts.Add(EnumVariable("optimize", "Optimization type", "speed", ("speed", "size")))
|
||||||
|
opts.Add(BoolVariable("production", "Set defaults to build Godot for use in production", False))
|
||||||
opts.Add(BoolVariable("use_lto", "Use link-time optimization", False))
|
opts.Add(BoolVariable("use_lto", "Use link-time optimization", False))
|
||||||
|
|
||||||
# Components
|
# Components
|
||||||
|
@ -123,11 +122,12 @@ opts.Add(BoolVariable("xaudio2", "Enable the XAudio2 audio driver", False))
|
||||||
opts.Add("custom_modules", "A list of comma-separated directory paths containing custom modules to build.", "")
|
opts.Add("custom_modules", "A list of comma-separated directory paths containing custom modules to build.", "")
|
||||||
|
|
||||||
# Advanced options
|
# Advanced options
|
||||||
opts.Add(BoolVariable("verbose", "Enable verbose output for the compilation", False))
|
opts.Add(BoolVariable("dev", "If yes, alias for verbose=yes warnings=extra werror=yes", False))
|
||||||
opts.Add(BoolVariable("progress", "Show a progress indicator during compilation", True))
|
opts.Add(BoolVariable("progress", "Show a progress indicator during compilation", True))
|
||||||
|
opts.Add(BoolVariable("tests", "Build the unit tests", False))
|
||||||
|
opts.Add(BoolVariable("verbose", "Enable verbose output for the compilation", False))
|
||||||
opts.Add(EnumVariable("warnings", "Level of compilation warnings", "all", ("extra", "all", "moderate", "no")))
|
opts.Add(EnumVariable("warnings", "Level of compilation warnings", "all", ("extra", "all", "moderate", "no")))
|
||||||
opts.Add(BoolVariable("werror", "Treat compiler warnings as errors", False))
|
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("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(BoolVariable("disable_3d", "Disable 3D nodes for a smaller executable", False))
|
opts.Add(BoolVariable("disable_3d", "Disable 3D nodes for a smaller executable", False))
|
||||||
|
@ -317,12 +317,34 @@ if selected_platform in platform_list:
|
||||||
env.Tool("compilation_db")
|
env.Tool("compilation_db")
|
||||||
env.Alias("compiledb", env.CompilationDatabase())
|
env.Alias("compiledb", env.CompilationDatabase())
|
||||||
|
|
||||||
|
# 'dev' and 'production' are aliases to set default options if they haven't been set
|
||||||
|
# manually by the user. We use `ARGUMENTS.get()` to check if they were manually set.
|
||||||
if env["dev"]:
|
if env["dev"]:
|
||||||
env["verbose"] = True
|
env["verbose"] = ARGUMENTS.get("verbose", True)
|
||||||
env["warnings"] = "extra"
|
env["warnings"] = ARGUMENTS.get("warnings", "extra")
|
||||||
env["werror"] = True
|
env["werror"] = ARGUMENTS.get("werror", True)
|
||||||
if env["tools"]:
|
if env["tools"]:
|
||||||
env["tests"] = True
|
env["tests"] = ARGUMENTS.get("tests", True)
|
||||||
|
if env["production"]:
|
||||||
|
env["use_static_cpp"] = ARGUMENTS.get("use_static_cpp", True)
|
||||||
|
env["use_lto"] = ARGUMENTS.get("use_lto", True)
|
||||||
|
env["debug_symbols"] = ARGUMENTS.get("debug_symbols", False)
|
||||||
|
if not env["tools"] and env["target"] == "debug":
|
||||||
|
print(
|
||||||
|
"WARNING: Requested `production` build with `tools=no target=debug`, "
|
||||||
|
"this will give you a full debug template (use `target=release_debug` "
|
||||||
|
"for an optimized template with debug features)."
|
||||||
|
)
|
||||||
|
if env.msvc:
|
||||||
|
print(
|
||||||
|
"WARNING: For `production` Windows builds, you should use MinGW with GCC "
|
||||||
|
"or Clang instead of Visual Studio, as they can better optimize the "
|
||||||
|
"GDScript VM in a very significant way. MSVC LTO also doesn't work "
|
||||||
|
"reliably for our use case."
|
||||||
|
"If you want to use MSVC nevertheless for production builds, set "
|
||||||
|
"`debug_symbols=no use_lto=no` instead of the `production=yes` option."
|
||||||
|
)
|
||||||
|
Exit(255)
|
||||||
|
|
||||||
env.extra_suffix = ""
|
env.extra_suffix = ""
|
||||||
|
|
||||||
|
|
|
@ -72,7 +72,7 @@ def get_opts():
|
||||||
BoolVariable("use_tsan", "Use LLVM/GCC compiler thread sanitizer (TSAN))", False),
|
BoolVariable("use_tsan", "Use LLVM/GCC compiler thread sanitizer (TSAN))", False),
|
||||||
BoolVariable("pulseaudio", "Detect and use PulseAudio", True),
|
BoolVariable("pulseaudio", "Detect and use PulseAudio", True),
|
||||||
BoolVariable("udev", "Use udev for gamepad connection callbacks", True),
|
BoolVariable("udev", "Use udev for gamepad connection callbacks", True),
|
||||||
EnumVariable("debug_symbols", "Add debugging symbols to release/release_debug builds", "yes", ("yes", "no")),
|
BoolVariable("debug_symbols", "Add debugging symbols to release/release_debug builds", True),
|
||||||
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("touch", "Enable touch events", True),
|
BoolVariable("touch", "Enable touch events", True),
|
||||||
BoolVariable("execinfo", "Use libexecinfo on systems where glibc is not available", False),
|
BoolVariable("execinfo", "Use libexecinfo on systems where glibc is not available", False),
|
||||||
|
|
|
@ -31,7 +31,7 @@ def get_opts():
|
||||||
False,
|
False,
|
||||||
),
|
),
|
||||||
EnumVariable("macports_clang", "Build using Clang from MacPorts", "no", ("no", "5.0", "devel")),
|
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("debug_symbols", "Add debugging symbols to release/release_debug builds", True),
|
||||||
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),
|
||||||
BoolVariable("use_asan", "Use LLVM/GCC compiler address sanitizer (ASAN))", False),
|
BoolVariable("use_asan", "Use LLVM/GCC compiler address sanitizer (ASAN))", False),
|
||||||
|
|
|
@ -32,13 +32,13 @@ def get_opts():
|
||||||
|
|
||||||
return [
|
return [
|
||||||
BoolVariable("use_llvm", "Use the LLVM compiler", False),
|
BoolVariable("use_llvm", "Use the LLVM compiler", False),
|
||||||
BoolVariable("use_static_cpp", "Link libgcc and libstdc++ statically for better portability", False),
|
BoolVariable("use_static_cpp", "Link libgcc and libstdc++ statically for better portability", True),
|
||||||
BoolVariable("use_coverage", "Test Godot coverage", False),
|
BoolVariable("use_coverage", "Test Godot coverage", 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),
|
||||||
BoolVariable("use_asan", "Use LLVM/GCC compiler address sanitizer (ASAN))", False),
|
BoolVariable("use_asan", "Use LLVM/GCC compiler address sanitizer (ASAN))", False),
|
||||||
BoolVariable("use_lsan", "Use LLVM/GCC compiler leak sanitizer (LSAN))", False),
|
BoolVariable("use_lsan", "Use LLVM/GCC compiler leak sanitizer (LSAN))", False),
|
||||||
BoolVariable("use_tsan", "Use LLVM/GCC compiler thread sanitizer (TSAN))", False),
|
BoolVariable("use_tsan", "Use LLVM/GCC compiler thread sanitizer (TSAN))", False),
|
||||||
EnumVariable("debug_symbols", "Add debugging symbols to release/release_debug builds", "yes", ("yes", "no")),
|
BoolVariable("debug_symbols", "Add debugging symbols to release/release_debug builds", True),
|
||||||
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("execinfo", "Use libexecinfo on systems where glibc is not available", False),
|
BoolVariable("execinfo", "Use libexecinfo on systems where glibc is not available", False),
|
||||||
]
|
]
|
||||||
|
|
|
@ -64,7 +64,7 @@ def get_opts():
|
||||||
# XP support dropped after EOL due to missing API for IPv6 and other issues
|
# XP support dropped after EOL due to missing API for IPv6 and other issues
|
||||||
# Vista support dropped after EOL due to GH-10243
|
# Vista support dropped after EOL due to GH-10243
|
||||||
("target_win_version", "Targeted Windows version, >= 0x0601 (Windows 7)", "0x0601"),
|
("target_win_version", "Targeted Windows version, >= 0x0601 (Windows 7)", "0x0601"),
|
||||||
EnumVariable("debug_symbols", "Add debugging symbols to release/release_debug builds", "yes", ("yes", "no")),
|
BoolVariable("debug_symbols", "Add debugging symbols to release/release_debug builds", True),
|
||||||
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),
|
||||||
|
|
Loading…
Reference in New Issue