Skip to content

Commit

Permalink
Merge pull request #1601 from Ivorforce/lto
Browse files Browse the repository at this point in the history
Add lto scons option
  • Loading branch information
dsnopek authored Nov 12, 2024
2 parents f298ddd + 5f7cf05 commit c20a84e
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 @@ -52,4 +52,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 @@ -198,4 +198,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 c20a84e

Please sign in to comment.