diff options
Diffstat (limited to 'tools/godotcpp.py')
-rw-r--r-- | tools/godotcpp.py | 100 |
1 files changed, 67 insertions, 33 deletions
diff --git a/tools/godotcpp.py b/tools/godotcpp.py index b5bf37c..5ba2742 100644 --- a/tools/godotcpp.py +++ b/tools/godotcpp.py @@ -1,9 +1,12 @@ import os, sys, platform from SCons.Variables import EnumVariable, PathVariable, BoolVariable +from SCons.Variables.BoolVariable import _text2bool from SCons.Tool import Tool from SCons.Builder import Builder from SCons.Errors import UserError +from SCons.Script import ARGUMENTS + from binding_generator import scons_generate_bindings, scons_emit_files @@ -14,6 +17,17 @@ def add_sources(sources, dir, extension): sources.append(dir + "/" + f) +def get_cmdline_bool(option, default): + """We use `ARGUMENTS.get()` to check if options were manually overridden on the command line, + and SCons' _text2bool helper to convert them to booleans, otherwise they're handled as strings. + """ + cmdline_val = ARGUMENTS.get(option) + if cmdline_val is not None: + return _text2bool(cmdline_val) + else: + return default + + def normalize_path(val, env): return val if os.path.isabs(val) else os.path.join(env.Dir("#").abspath, val) @@ -230,16 +244,23 @@ def options(opts, env): ) ) + opts.Add( + EnumVariable( + "optimize", + "The desired optimization flags", + "speed_trace", + ("none", "custom", "debug", "speed", "speed_trace", "size"), + ) + ) + opts.Add(BoolVariable("debug_symbols", "Build with debugging symbols", True)) + opts.Add(BoolVariable("dev_build", "Developer build with dev-only debugging code (DEV_ENABLED)", False)) + # Add platform options (custom tools can override platforms) for pl in sorted(set(platforms + custom_platforms)): tool = Tool(pl, toolpath=get_platform_tools_paths(env)) if hasattr(tool, "options"): tool.options(opts) - # Targets flags tool (optimizations, debug symbols) - target_tool = Tool("targets", toolpath=["tools"]) - target_tool.options(opts) - def generate(env): # Default num_jobs to local cpu count if not user specified. @@ -286,10 +307,21 @@ def generate(env): print("Building for architecture " + env["arch"] + " on platform " + env["platform"]) - if env.get("use_hot_reload") is None: - env["use_hot_reload"] = env["target"] != "template_release" - if env["use_hot_reload"]: - env.Append(CPPDEFINES=["HOT_RELOAD_ENABLED"]) + # These defaults may be needed by platform tools + env.use_hot_reload = env.get("use_hot_reload", env["target"] != "template_release") + env.editor_build = env["target"] == "editor" + env.dev_build = env["dev_build"] + env.debug_features = env["target"] in ["editor", "template_debug"] + + if env.dev_build: + opt_level = "none" + elif env.debug_features: + opt_level = "speed_trace" + else: # Release + opt_level = "speed" + + env["optimize"] = ARGUMENTS.get("optimize", opt_level) + env["debug_symbols"] = get_cmdline_bool("debug_symbols", env.dev_build) tool = Tool(env["platform"], toolpath=get_platform_tools_paths(env)) @@ -297,32 +329,34 @@ def generate(env): raise ValueError("Required toolchain not found for platform " + env["platform"]) tool.generate(env) - target_tool = Tool("targets", toolpath=["tools"]) - target_tool.generate(env) - - # Disable exception handling. Godot doesn't use exceptions anywhere, and this - # saves around 20% of binary size and very significant build time. - if env["disable_exceptions"]: - if env.get("is_msvc", False): - env.Append(CPPDEFINES=[("_HAS_EXCEPTIONS", 0)]) - else: - env.Append(CXXFLAGS=["-fno-exceptions"]) - elif env.get("is_msvc", False): - env.Append(CXXFLAGS=["/EHsc"]) - - if not env.get("is_msvc", False): - if env["symbols_visibility"] == "visible": - env.Append(CCFLAGS=["-fvisibility=default"]) - env.Append(LINKFLAGS=["-fvisibility=default"]) - elif env["symbols_visibility"] == "hidden": - env.Append(CCFLAGS=["-fvisibility=hidden"]) - env.Append(LINKFLAGS=["-fvisibility=hidden"]) - - # Require C++17 - if env.get("is_msvc", False): - env.Append(CXXFLAGS=["/std:c++17"]) + + if env.use_hot_reload: + env.Append(CPPDEFINES=["HOT_RELOAD_ENABLED"]) + + if env.editor_build: + env.Append(CPPDEFINES=["TOOLS_ENABLED"]) + + # 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 + # Keep this configuration in sync with SConstruct in upstream Godot. + if env.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.Append(CPPDEFINES=["DEBUG_ENABLED"]) + # In upstream Godot this is added in typedefs.h when DEBUG_ENABLED is set. + env.Append(CPPDEFINES=["DEBUG_METHODS_ENABLED"]) + + if env.dev_build: + # DEV_ENABLED enables *engine developer* code which should only be compiled for those + # working on the engine itself. + env.Append(CPPDEFINES=["DEV_ENABLED"]) else: - env.Append(CXXFLAGS=["-std=c++17"]) + # Disable assert() for production targets (only used in thirdparty code). + env.Append(CPPDEFINES=["NDEBUG"]) if env["precision"] == "double": env.Append(CPPDEFINES=["REAL_T_IS_DOUBLE"]) |