SCons: Unify tools/target build type configuration
Implements https://github.com/godotengine/godot-proposals/issues/3371. New `target` presets ==================== The `tools` option is removed and `target` changes to use three new presets, which match the builds users are familiar with. These targets control the default optimization level and enable editor-specific and debugging code: - `editor`: Replaces `tools=yes target=release_debug`. * Defines: `TOOLS_ENABLED`, `DEBUG_ENABLED`, `-O2`/`/O2` - `template_debug`: Replaces `tools=no target=release_debug`. * Defines: `DEBUG_ENABLED`, `-O2`/`/O2` - `template_release`: Replaces `tools=no target=release`. * Defines: `-O3`/`/O2` New `dev_build` option ====================== The previous `target=debug` is now replaced by a separate `dev_build=yes` option, which can be used in combination with either of the three targets, and changes the following: - `dev_build`: Defines `DEV_ENABLED`, disables optimization (`-O0`/`/0d`), enables generating debug symbols, does not define `NDEBUG` so `assert()` works in thirdparty libraries, adds a `.dev` suffix to the binary name. Note: Unlike previously, `dev_build` defaults to off so that users who compile Godot from source get an optimized and small build by default. Engine contributors should now set `dev_build=yes` in their build scripts or IDE configuration manually. Changed binary names ==================== The name of generated binaries and object files are changed too, to follow this format: `godot.<platform>.<target>[.dev][.double].<arch>[.<extra_suffix>][.<ext>]` For example: - `godot.linuxbsd.editor.dev.arm64` - `godot.windows.template_release.double.x86_64.mono.exe` Be sure to update your links/scripts/IDE config accordingly. More flexible `optimize` and `debug_symbols` options ==================================================== The optimization level and whether to generate debug symbols can be further specified with the `optimize` and `debug_symbols` options. So the default values listed above for the various `target` and `dev_build` combinations are indicative and can be replaced when compiling, e.g.: `scons p=linuxbsd target=template_debug dev_build=yes optimize=debug` will make a "debug" export template with dev-only code enabled, `-Og` optimization level for GCC/Clang, and debug symbols. Perfect for debugging complex crashes at runtime in an exported project.
This commit is contained in:
155
SConstruct
155
SConstruct
@ -57,7 +57,7 @@ import glsl_builders
|
||||
import gles3_builders
|
||||
from platform_methods import architectures, architecture_aliases
|
||||
|
||||
if methods.get_cmdline_bool("tools", True):
|
||||
if ARGUMENTS.get("target", "editor") == "editor":
|
||||
_helper_module("editor.editor_builders", "editor/editor_builders.py")
|
||||
_helper_module("editor.template_builders", "editor/template_builders.py")
|
||||
|
||||
@ -164,27 +164,33 @@ opts = Variables(customs, ARGUMENTS)
|
||||
# Target build options
|
||||
opts.Add("platform", "Target platform (%s)" % ("|".join(platform_list),), "")
|
||||
opts.Add("p", "Platform (alias for 'platform')", "")
|
||||
opts.Add(BoolVariable("tools", "Build the tools (a.k.a. the Godot editor)", True))
|
||||
opts.Add(EnumVariable("target", "Compilation target", "debug", ("debug", "release_debug", "release")))
|
||||
opts.Add(EnumVariable("target", "Compilation target", "editor", ("editor", "template_release", "template_debug")))
|
||||
opts.Add(EnumVariable("arch", "CPU architecture", "auto", ["auto"] + architectures, architecture_aliases))
|
||||
opts.Add(EnumVariable("float", "Floating-point precision", "32", ("32", "64")))
|
||||
opts.Add(EnumVariable("optimize", "Optimization type", "speed", ("speed", "size", "none")))
|
||||
opts.Add(BoolVariable("dev_build", "Developer build with dev-only debugging code (DEV_ENABLED)", False))
|
||||
opts.Add(
|
||||
EnumVariable(
|
||||
"optimize", "Optimization level", "speed_trace", ("none", "custom", "debug", "speed", "speed_trace", "size")
|
||||
)
|
||||
)
|
||||
opts.Add(BoolVariable("debug_symbols", "Build with debugging symbols", True))
|
||||
opts.Add(BoolVariable("separate_debug_symbols", "Extract debugging symbols to a separate file", False))
|
||||
opts.Add(EnumVariable("lto", "Link-time optimization (production builds)", "none", ("none", "auto", "thin", "full")))
|
||||
opts.Add(BoolVariable("production", "Set defaults to build Godot for use in production", False))
|
||||
opts.Add(EnumVariable("lto", "Link-time optimization (for production buids)", "none", ("none", "auto", "thin", "full")))
|
||||
|
||||
# Components
|
||||
opts.Add(BoolVariable("deprecated", "Enable compatibility code for deprecated and removed features", True))
|
||||
opts.Add(EnumVariable("float", "Floating-point precision", "32", ("32", "64")))
|
||||
opts.Add(BoolVariable("minizip", "Enable ZIP archive support using minizip", True))
|
||||
opts.Add(BoolVariable("xaudio2", "Enable the XAudio2 audio driver", False))
|
||||
opts.Add(BoolVariable("vulkan", "Enable the vulkan video driver", True))
|
||||
opts.Add(BoolVariable("opengl3", "Enable the OpenGL/GLES3 video driver", True))
|
||||
opts.Add(BoolVariable("openxr", "Enable the OpenXR driver", True))
|
||||
opts.Add(BoolVariable("use_volk", "Use the volk library to load the Vulkan loader dynamically", True))
|
||||
opts.Add("custom_modules", "A list of comma-separated directory paths containing custom modules to build.", "")
|
||||
opts.Add(BoolVariable("custom_modules_recursive", "Detect custom modules recursively for each specified path.", True))
|
||||
opts.Add(BoolVariable("use_volk", "Use the volk library to load the Vulkan loader dynamically", True))
|
||||
|
||||
# Advanced options
|
||||
opts.Add(BoolVariable("dev", "If yes, alias for verbose=yes warnings=extra werror=yes", False))
|
||||
opts.Add(BoolVariable("dev_mode", "Alias for dev options: verbose=yes warnings=extra werror=yes tests=yes", False))
|
||||
opts.Add(BoolVariable("tests", "Build the unit tests", False))
|
||||
opts.Add(BoolVariable("fast_unsafe", "Enable unsafe options for faster rebuilds", False))
|
||||
opts.Add(BoolVariable("compiledb", "Generate compilation DB (`compile_commands.json`) for external tools", False))
|
||||
@ -376,13 +382,36 @@ env_base.Prepend(CPPPATH=["#"])
|
||||
env_base.platform_exporters = platform_exporters
|
||||
env_base.platform_apis = platform_apis
|
||||
|
||||
# Build type defines - more platform-specific ones can be in detect.py.
|
||||
if env_base["target"] == "release_debug" or env_base["target"] == "debug":
|
||||
# Configuration of build targets:
|
||||
# - Editor or template
|
||||
# - Debug features (DEBUG_ENABLED code)
|
||||
# - Dev only code (DEV_ENABLED code)
|
||||
# - Optimization level
|
||||
# - Debug symbols for crash traces / debuggers
|
||||
|
||||
env_base.editor_build = env_base["target"] == "editor"
|
||||
env_base.dev_build = env_base["dev_build"]
|
||||
env_base.debug_features = env_base["target"] in ["editor", "template_debug"]
|
||||
|
||||
if env_base.dev_build:
|
||||
opt_level = "none"
|
||||
elif env_base.debug_features:
|
||||
opt_level = "speed_trace"
|
||||
else: # Release
|
||||
opt_level = "speed"
|
||||
|
||||
env_base["optimize"] = ARGUMENTS.get("optimize", opt_level)
|
||||
env_base["debug_symbols"] = methods.get_cmdline_bool("debug_symbols", env_base.dev_build)
|
||||
|
||||
if env_base.editor_build:
|
||||
env_base.Append(CPPDEFINES=["TOOLS_ENABLED"])
|
||||
|
||||
if env_base.debug_features:
|
||||
# DEBUG_ENABLED enables debugging *features* and debug-only code, which is intended
|
||||
# to give *users* extra debugging information for their game development.
|
||||
env_base.Append(CPPDEFINES=["DEBUG_ENABLED"])
|
||||
|
||||
if env_base["target"] == "debug":
|
||||
if env_base.dev_build:
|
||||
# DEV_ENABLED enables *engine developer* code which should only be compiled for those
|
||||
# working on the engine itself.
|
||||
env_base.Append(CPPDEFINES=["DEV_ENABLED"])
|
||||
@ -395,7 +424,7 @@ else:
|
||||
# Unsafe as they reduce the certainty of rebuilding all changed files, so it's
|
||||
# enabled by default for `debug` builds, and can be overridden from command line.
|
||||
# Ref: https://github.com/SCons/scons/wiki/GoFastButton
|
||||
if methods.get_cmdline_bool("fast_unsafe", env_base["target"] == "debug"):
|
||||
if methods.get_cmdline_bool("fast_unsafe", env_base.dev_build):
|
||||
# Renamed to `content-timestamp` in SCons >= 4.2, keeping MD5 for compat.
|
||||
env_base.Decider("MD5-timestamp")
|
||||
env_base.SetOption("implicit_cache", 1)
|
||||
@ -470,32 +499,64 @@ if selected_platform in platform_list:
|
||||
if not (f[0] in ARGUMENTS) or ARGUMENTS[f[0]] == "auto": # Allow command line to override platform flags
|
||||
env[f[0]] = f[1]
|
||||
|
||||
# 'dev' and 'production' are aliases to set default options if they haven't been
|
||||
# 'dev_mode' and 'production' are aliases to set default options if they haven't been
|
||||
# set manually by the user.
|
||||
# These need to be checked *after* platform specific flags so that different
|
||||
# default values can be set (e.g. to keep LTO off for `production` on some platforms).
|
||||
if env["dev"]:
|
||||
if env["dev_mode"]:
|
||||
env["verbose"] = methods.get_cmdline_bool("verbose", True)
|
||||
env["warnings"] = ARGUMENTS.get("warnings", "extra")
|
||||
env["werror"] = methods.get_cmdline_bool("werror", True)
|
||||
if env["tools"]:
|
||||
env["tests"] = methods.get_cmdline_bool("tests", True)
|
||||
env["tests"] = methods.get_cmdline_bool("tests", True)
|
||||
if env["production"]:
|
||||
env["use_static_cpp"] = methods.get_cmdline_bool("use_static_cpp", True)
|
||||
env["debug_symbols"] = methods.get_cmdline_bool("debug_symbols", False)
|
||||
# LTO "auto" means we handle the preferred option in each platform detect.py.
|
||||
env["lto"] = ARGUMENTS.get("lto", "auto")
|
||||
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)."
|
||||
)
|
||||
|
||||
# Must happen after the flags' definition, as configure is when most flags
|
||||
# are actually handled to change compile options, etc.
|
||||
detect.configure(env)
|
||||
|
||||
print(f'Building for platform "{selected_platform}", architecture "{env["arch"]}", target "{env["target"]}.')
|
||||
if env.dev_build:
|
||||
print("NOTE: Developer build, with debug optimization level and debug symbols (unless overridden).")
|
||||
|
||||
# Set optimize and debug_symbols flags.
|
||||
# "custom" means do nothing and let users set their own optimization flags.
|
||||
# Needs to happen after configure to have `env.msvc` defined.
|
||||
if env.msvc:
|
||||
if env["debug_symbols"]:
|
||||
env.Append(CCFLAGS=["/Zi", "/FS"])
|
||||
env.Append(LINKFLAGS=["/DEBUG:FULL"])
|
||||
|
||||
if env["optimize"] == "speed" or env["optimize"] == "speed_trace":
|
||||
env.Append(CCFLAGS=["/O2"])
|
||||
env.Append(LINKFLAGS=["/OPT:REF"])
|
||||
elif env["optimize"] == "size":
|
||||
env.Append(CCFLAGS=["/O1"])
|
||||
env.Append(LINKFLAGS=["/OPT:REF"])
|
||||
elif env["optimize"] == "debug" or env["optimize"] == "none":
|
||||
env.Append(CCFLAGS=["/Od"])
|
||||
else:
|
||||
if env["debug_symbols"]:
|
||||
if env.dev_build:
|
||||
env.Append(CCFLAGS=["-g3"])
|
||||
else:
|
||||
env.Append(CCFLAGS=["-g2"])
|
||||
|
||||
if env["optimize"] == "speed":
|
||||
env.Append(CCFLAGS=["-O3"])
|
||||
# `-O2` is friendlier to debuggers than `-O3`, leading to better crash backtraces.
|
||||
elif env["optimize"] == "speed_trace":
|
||||
env.Append(CCFLAGS=["-O2"])
|
||||
elif env["optimize"] == "size":
|
||||
env.Append(CCFLAGS=["-Os"])
|
||||
elif env["optimize"] == "debug":
|
||||
env.Append(CCFLAGS=["-Og"])
|
||||
elif env["optimize"] == "none":
|
||||
env.Append(CCFLAGS=["-O0"])
|
||||
|
||||
# Needs to happen after configure to handle "auto".
|
||||
if env["lto"] != "none":
|
||||
print("Using LTO: " + env["lto"])
|
||||
@ -514,11 +575,6 @@ if selected_platform in platform_list:
|
||||
# We apply it to CCFLAGS (both C and C++ code) in case it impacts C features.
|
||||
env.Prepend(CCFLAGS=["/std:c++17"])
|
||||
|
||||
print(
|
||||
'Building for platform "%s", architecture "%s", %s, target "%s".'
|
||||
% (selected_platform, env["arch"], "editor" if env["tools"] else "template", env["target"])
|
||||
)
|
||||
|
||||
# Enforce our minimal compiler version requirements
|
||||
cc_version = methods.get_compiler_version(env) or {
|
||||
"major": None,
|
||||
@ -663,32 +719,13 @@ if selected_platform in platform_list:
|
||||
else:
|
||||
suffix = "." + selected_platform
|
||||
|
||||
suffix += "." + env["target"]
|
||||
if env.dev_build:
|
||||
suffix += ".dev"
|
||||
|
||||
if env_base["float"] == "64":
|
||||
suffix += ".double"
|
||||
|
||||
if env["target"] == "release":
|
||||
if env["tools"]:
|
||||
print("ERROR: The editor can only be built with `target=debug` or `target=release_debug`.")
|
||||
print(" Use `tools=no target=release` to build a release export template.")
|
||||
Exit(255)
|
||||
suffix += ".opt"
|
||||
elif env["target"] == "release_debug":
|
||||
if env["tools"]:
|
||||
suffix += ".opt.tools"
|
||||
else:
|
||||
suffix += ".opt.debug"
|
||||
else:
|
||||
if env["tools"]:
|
||||
print(
|
||||
"Note: Building a debug binary (which will run slowly). Use `target=release_debug` to build an optimized release binary."
|
||||
)
|
||||
suffix += ".tools"
|
||||
else:
|
||||
print(
|
||||
"Note: Building a debug binary (which will run slowly). Use `target=release` to build an optimized release binary."
|
||||
)
|
||||
suffix += ".debug"
|
||||
|
||||
suffix += "." + env["arch"]
|
||||
suffix += env.extra_suffix
|
||||
|
||||
@ -753,9 +790,6 @@ if selected_platform in platform_list:
|
||||
env["LIBSUFFIX"] = suffix + env["LIBSUFFIX"]
|
||||
env["SHLIBSUFFIX"] = suffix + env["SHLIBSUFFIX"]
|
||||
|
||||
if env["tools"]:
|
||||
env.Append(CPPDEFINES=["TOOLS_ENABLED"])
|
||||
|
||||
disabled_classes = []
|
||||
|
||||
if env["build_feature_profile"] != "":
|
||||
@ -777,19 +811,16 @@ if selected_platform in platform_list:
|
||||
methods.write_disabled_classes(disabled_classes)
|
||||
|
||||
if env["disable_3d"]:
|
||||
if env["tools"]:
|
||||
print(
|
||||
"Build option 'disable_3d=yes' cannot be used with 'tools=yes' (editor), "
|
||||
"only with 'tools=no' (export template)."
|
||||
)
|
||||
if env.editor_build:
|
||||
print("Build option 'disable_3d=yes' cannot be used for editor builds, but only for export templates.")
|
||||
Exit(255)
|
||||
else:
|
||||
env.Append(CPPDEFINES=["_3D_DISABLED"])
|
||||
if env["disable_advanced_gui"]:
|
||||
if env["tools"]:
|
||||
if env.editor_build:
|
||||
print(
|
||||
"Build option 'disable_advanced_gui=yes' cannot be used with 'tools=yes' (editor), "
|
||||
"only with 'tools=no' (export template)."
|
||||
"Build option 'disable_advanced_gui=yes' cannot be used for editor builds, "
|
||||
"but only for export templates."
|
||||
)
|
||||
Exit(255)
|
||||
else:
|
||||
@ -847,7 +878,7 @@ if selected_platform in platform_list:
|
||||
SConscript("core/SCsub")
|
||||
SConscript("servers/SCsub")
|
||||
SConscript("scene/SCsub")
|
||||
if env["tools"]:
|
||||
if env.editor_build:
|
||||
SConscript("editor/SCsub")
|
||||
SConscript("drivers/SCsub")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user