Skip to content

Commit

Permalink
Add lto scons option, defaulting to "auto" ("full" in production, "no…
Browse files Browse the repository at this point in the history
…ne" in dev builds).
  • Loading branch information
Ivorforce committed Oct 5, 2024
1 parent 57bd88a commit b497381
Show file tree
Hide file tree
Showing 8 changed files with 69 additions and 0 deletions.
5 changes: 5 additions & 0 deletions tools/android.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,4 +120,9 @@ def generate(env):

env.Append(CPPDEFINES=["ANDROID_ENABLED", "UNIX_ENABLED"])

# Refer to https://github.com/godotengine/godot/blob/master/platform/android/detect.py
# LTO benefits for Android (size, performance) haven't been clearly established yet.
if env["lto"] == "auto":
env["lto"] = "none"

common_compiler_flags.generate(env)
30 changes: 30 additions & 0 deletions tools/common_compiler_flags.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@ def exists(env):


def generate(env):
assert env["lto"] in ["thin", "full", "none"], "Unrecognized lto: {}".format(env["lto"])
if env["lto"] != "none":
print("Using LTO: " + env["lto"])

# Require C++17
if env.get("is_msvc", False):
env.Append(CXXFLAGS=["/std:c++17"])
Expand Down Expand Up @@ -64,6 +68,22 @@ def generate(env):
env.Append(LINKFLAGS=["/OPT:REF"])
elif env["optimize"] == "debug" or env["optimize"] == "none":
env.Append(CCFLAGS=["/Od"])

if env["lto"] == "thin":
if not env["use_llvm"]:
print("ThinLTO is only compatible with LLVM, use `use_llvm=yes` or `lto=full`.")
env.Exit(255)

env.Append(CCFLAGS=["-flto=thin"])
env.Append(LINKFLAGS=["-flto=thin"])
elif env["lto"] == "full":
if env["use_llvm"]:
env.Append(CCFLAGS=["-flto"])
env.Append(LINKFLAGS=["-flto"])
else:
env.AppendUnique(CCFLAGS=["/GL"])
env.AppendUnique(ARFLAGS=["/LTCG"])
env.AppendUnique(LINKFLAGS=["/LTCG"])
else:
if env["debug_symbols"]:
# Adding dwarf-4 explicitly makes stacktraces work with clang builds,
Expand Down Expand Up @@ -91,3 +111,13 @@ def generate(env):
env.Append(CCFLAGS=["-Og"])
elif env["optimize"] == "none":
env.Append(CCFLAGS=["-O0"])

if env["lto"] == "thin":
if (env["platform"] == "windows" or env["platform"] == "linux") and not env["use_llvm"]:
print("ThinLTO is only compatible with LLVM, use `use_llvm=yes` or `lto=full`.")
env.Exit(255)
env.Append(CCFLAGS=["-flto=thin"])
env.Append(LINKFLAGS=["-flto=thin"])
elif env["lto"] == "full":
env.Append(CCFLAGS=["-flto"])
env.Append(LINKFLAGS=["-flto"])
8 changes: 8 additions & 0 deletions tools/godotcpp.py
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,14 @@ def options(opts, env):
("none", "custom", "debug", "speed", "speed_trace", "size"),
)
)
opts.Add(
EnumVariable(
"lto",
"Link-time optimization",
"none",
("none", "auto", "thin", "full"),
)
)
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))
opts.Add(BoolVariable("verbose", "Enable verbose output for the compilation", False))
Expand Down
5 changes: 5 additions & 0 deletions tools/ios.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,4 +97,9 @@ def generate(env):

env.Append(CPPDEFINES=["IOS_ENABLED", "UNIX_ENABLED"])

# Refer to https://github.com/godotengine/godot/blob/master/platform/ios/detect.py:
# Disable by default as it makes linking in Xcode very slow.
if env["lto"] == "auto":
env["lto"] = "none"

common_compiler_flags.generate(env)
4 changes: 4 additions & 0 deletions tools/linux.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,8 @@ def generate(env):

env.Append(CPPDEFINES=["LINUX_ENABLED", "UNIX_ENABLED"])

# Refer to https://github.com/godotengine/godot/blob/master/platform/linuxbsd/detect.py
if env["lto"] == "auto":
env["lto"] = "full"

common_compiler_flags.generate(env)
5 changes: 5 additions & 0 deletions tools/macos.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,4 +73,9 @@ def generate(env):

env.Append(CPPDEFINES=["MACOS_ENABLED", "UNIX_ENABLED"])

# Refer to https://github.com/godotengine/godot/blob/master/platform/macos/detect.py
# LTO benefits for macOS (size, performance) haven't been clearly established yet.
if env["lto"] == "auto":
env["lto"] = "none"

common_compiler_flags.generate(env)
4 changes: 4 additions & 0 deletions tools/web.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,8 @@ def generate(env):

env.Append(CPPDEFINES=["WEB_ENABLED", "UNIX_ENABLED"])

# Refer to https://github.com/godotengine/godot/blob/master/platform/web/detect.py
if env["lto"] == "auto":
env["lto"] = "full"

common_compiler_flags.generate(env)
8 changes: 8 additions & 0 deletions tools/windows.py
Original file line number Diff line number Diff line change
Expand Up @@ -199,4 +199,12 @@ def generate(env):

env.Append(CPPDEFINES=["WINDOWS_ENABLED"])

# Refer to https://github.com/godotengine/godot/blob/master/platform/windows/detect.py
if env["lto"] == "auto":
if env.get("is_msvc", False):
# No LTO by default for MSVC, doesn't help.
env["lto"] = "none"
else: # Release
env["lto"] = "full"

common_compiler_flags.generate(env)

0 comments on commit b497381

Please sign in to comment.