diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/targets.py | 69 |
1 files changed, 50 insertions, 19 deletions
diff --git a/tools/targets.py b/tools/targets.py index f13979d..b3d1c52 100644 --- a/tools/targets.py +++ b/tools/targets.py @@ -1,6 +1,19 @@ import os import sys +from SCons.Script import ARGUMENTS from SCons.Variables import * +from SCons.Variables.BoolVariable import _text2bool + + +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 options(opts): @@ -8,11 +21,12 @@ def options(opts): EnumVariable( "optimize", "The desired optimization flags", - "auto", - ("auto", "none", "debug", "speed", "size", "0", "1", "2", "3"), + "speed_trace", + ("none", "custom", "debug", "speed", "speed_trace", "size"), ) ) - opts.Add(BoolVariable("debug_symbols", "Add debugging symbols to release builds", False)) + 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)) def exists(env): @@ -20,38 +34,55 @@ def exists(env): def generate(env): - if env["optimize"] == "auto": - env["optimize"] = "speed" if env["target"] == "release" else "debug" - env["debug_symbols"] = env["debug_symbols"] or env["target"] == "debug" + env.dev_build = env["dev_build"] + env.debug_features = env["target"] in ["editor", "template_debug"] + env.editor_build = env["target"] == "editor" + + if env.editor_build: + env.AppendUnique(CPPDEFINES=["TOOLS_ENABLED"]) + + if env.debug_features: + env.AppendUnique(CPPDEFINES=["DEBUG_ENABLED", "DEBUG_METHODS_ENABLED"]) + + if env.dev_build: + opt_level = "none" + env.AppendUnique(CPPDEFINES=["DEV_ENABLED"]) + 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) if "is_msvc" in env and env["is_msvc"]: if env["debug_symbols"]: - env.Append(CCFLAGS=["/Z7", "/D_DEBUG"]) + env.Append(CCFLAGS=["/Zi", "/FS"]) env.Append(LINKFLAGS=["/DEBUG:FULL"]) - else: - env.Append(CCFLAGS=["/Z7", "/DNDEBUG"]) - if env["optimize"] == "speed": + 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=["/Os"]) - elif env["optimize"] == "debug": - env.Append(CCFLAGS=["/Od"]) - elif env["optimize"] == "none": + env.Append(CCFLAGS=["/O1"]) + env.Append(LINKFLAGS=["/OPT:REF"]) + elif env["optimize"] == "debug" or env["optimize"] == "none": env.Append(CCFLAGS=["/Od"]) - else: - env.Append(CCFLAGS=["/O%s" % env["optimize"]]) else: if env["debug_symbols"]: - env.Append(CCFLAGS=["-g"]) + 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"]) - else: - env.Append(CCFLAGS=["-O%s" % env["optimize"]]) |