|
1 | 1 | import os
|
2 | 2 | import sys
|
| 3 | +from SCons.Script import ARGUMENTS |
3 | 4 | from SCons.Variables import *
|
| 5 | +from SCons.Variables.BoolVariable import _text2bool |
| 6 | + |
| 7 | + |
| 8 | +def get_cmdline_bool(option, default): |
| 9 | + """We use `ARGUMENTS.get()` to check if options were manually overridden on the command line, |
| 10 | + and SCons' _text2bool helper to convert them to booleans, otherwise they're handled as strings. |
| 11 | + """ |
| 12 | + cmdline_val = ARGUMENTS.get(option) |
| 13 | + if cmdline_val is not None: |
| 14 | + return _text2bool(cmdline_val) |
| 15 | + else: |
| 16 | + return default |
4 | 17 |
|
5 | 18 |
|
6 | 19 | def options(opts):
|
7 | 20 | opts.Add(
|
8 | 21 | EnumVariable(
|
9 | 22 | "optimize",
|
10 | 23 | "The desired optimization flags",
|
11 |
| - "auto", |
12 |
| - ("auto", "none", "debug", "speed", "size", "0", "1", "2", "3"), |
| 24 | + "speed_trace", |
| 25 | + ("none", "custom", "debug", "speed", "speed_trace", "size"), |
13 | 26 | )
|
14 | 27 | )
|
15 |
| - opts.Add(BoolVariable("debug_symbols", "Add debugging symbols to release builds", False)) |
| 28 | + opts.Add(BoolVariable("debug_symbols", "Build with debugging symbols", True)) |
| 29 | + opts.Add(BoolVariable("dev_build", "Developer build with dev-only debugging code (DEV_ENABLED)", False)) |
16 | 30 |
|
17 | 31 |
|
18 | 32 | def exists(env):
|
19 | 33 | return True
|
20 | 34 |
|
21 | 35 |
|
22 | 36 | def generate(env):
|
23 |
| - if env["optimize"] == "auto": |
24 |
| - env["optimize"] = "speed" if env["target"] == "release" else "debug" |
25 |
| - env["debug_symbols"] = env["debug_symbols"] or env["target"] == "debug" |
| 37 | + env.dev_build = env["dev_build"] |
| 38 | + env.debug_features = env["target"] in ["editor", "template_debug"] |
| 39 | + env.editor_build = env["target"] == "editor" |
| 40 | + |
| 41 | + if env.editor_build: |
| 42 | + env.AppendUnique(CPPDEFINES=["TOOLS_ENABLED"]) |
| 43 | + |
| 44 | + if env.debug_features: |
| 45 | + env.AppendUnique(CPPDEFINES=["DEBUG_ENABLED", "DEBUG_METHODS_ENABLED"]) |
| 46 | + |
| 47 | + if env.dev_build: |
| 48 | + opt_level = "none" |
| 49 | + env.AppendUnique(CPPDEFINES=["DEV_ENABLED"]) |
| 50 | + elif env.debug_features: |
| 51 | + opt_level = "speed_trace" |
| 52 | + else: # Release |
| 53 | + opt_level = "speed" |
| 54 | + |
| 55 | + env["optimize"] = ARGUMENTS.get("optimize", opt_level) |
| 56 | + env["debug_symbols"] = get_cmdline_bool("debug_symbols", env.dev_build) |
26 | 57 |
|
27 | 58 | if "is_msvc" in env and env["is_msvc"]:
|
28 | 59 | if env["debug_symbols"]:
|
29 |
| - env.Append(CCFLAGS=["/Z7", "/D_DEBUG"]) |
| 60 | + env.Append(CCFLAGS=["/Zi", "/FS"]) |
30 | 61 | env.Append(LINKFLAGS=["/DEBUG:FULL"])
|
31 |
| - else: |
32 |
| - env.Append(CCFLAGS=["/Z7", "/DNDEBUG"]) |
33 | 62 |
|
34 |
| - if env["optimize"] == "speed": |
| 63 | + if env["optimize"] == "speed" or env["optimize"] == "speed_trace": |
35 | 64 | env.Append(CCFLAGS=["/O2"])
|
| 65 | + env.Append(LINKFLAGS=["/OPT:REF"]) |
36 | 66 | elif env["optimize"] == "size":
|
37 |
| - env.Append(CCFLAGS=["/Os"]) |
38 |
| - elif env["optimize"] == "debug": |
39 |
| - env.Append(CCFLAGS=["/Od"]) |
40 |
| - elif env["optimize"] == "none": |
| 67 | + env.Append(CCFLAGS=["/O1"]) |
| 68 | + env.Append(LINKFLAGS=["/OPT:REF"]) |
| 69 | + elif env["optimize"] == "debug" or env["optimize"] == "none": |
41 | 70 | env.Append(CCFLAGS=["/Od"])
|
42 |
| - else: |
43 |
| - env.Append(CCFLAGS=["/O%s" % env["optimize"]]) |
44 | 71 | else:
|
45 | 72 | if env["debug_symbols"]:
|
46 |
| - env.Append(CCFLAGS=["-g"]) |
| 73 | + if env.dev_build: |
| 74 | + env.Append(CCFLAGS=["-g3"]) |
| 75 | + else: |
| 76 | + env.Append(CCFLAGS=["-g2"]) |
47 | 77 |
|
48 | 78 | if env["optimize"] == "speed":
|
49 | 79 | env.Append(CCFLAGS=["-O3"])
|
| 80 | + # `-O2` is friendlier to debuggers than `-O3`, leading to better crash backtraces. |
| 81 | + elif env["optimize"] == "speed_trace": |
| 82 | + env.Append(CCFLAGS=["-O2"]) |
50 | 83 | elif env["optimize"] == "size":
|
51 | 84 | env.Append(CCFLAGS=["-Os"])
|
52 | 85 | elif env["optimize"] == "debug":
|
53 | 86 | env.Append(CCFLAGS=["-Og"])
|
54 | 87 | elif env["optimize"] == "none":
|
55 | 88 | env.Append(CCFLAGS=["-O0"])
|
56 |
| - else: |
57 |
| - env.Append(CCFLAGS=["-O%s" % env["optimize"]]) |
|
0 commit comments