@@ -22,6 +22,10 @@ def exists(env):
2222
2323
2424def generate (env ):
25+ assert env ["lto" ] in ["thin" , "full" , "none" ], "Unrecognized lto: {}" .format (env ["lto" ])
26+ if env ["lto" ] != "none" :
27+ print ("Using LTO: " + env ["lto" ])
28+
2529 # Require C++17
2630 if env .get ("is_msvc" , False ):
2731 env .Append (CXXFLAGS = ["/std:c++17" ])
@@ -64,6 +68,22 @@ def generate(env):
6468 env .Append (LINKFLAGS = ["/OPT:REF" ])
6569 elif env ["optimize" ] == "debug" or env ["optimize" ] == "none" :
6670 env .Append (CCFLAGS = ["/Od" ])
71+
72+ if env ["lto" ] == "thin" :
73+ if not env ["use_llvm" ]:
74+ print ("ThinLTO is only compatible with LLVM, use `use_llvm=yes` or `lto=full`." )
75+ env .Exit (255 )
76+
77+ env .Append (CCFLAGS = ["-flto=thin" ])
78+ env .Append (LINKFLAGS = ["-flto=thin" ])
79+ elif env ["lto" ] == "full" :
80+ if env ["use_llvm" ]:
81+ env .Append (CCFLAGS = ["-flto" ])
82+ env .Append (LINKFLAGS = ["-flto" ])
83+ else :
84+ env .AppendUnique (CCFLAGS = ["/GL" ])
85+ env .AppendUnique (ARFLAGS = ["/LTCG" ])
86+ env .AppendUnique (LINKFLAGS = ["/LTCG" ])
6787 else :
6888 if env ["debug_symbols" ]:
6989 # Adding dwarf-4 explicitly makes stacktraces work with clang builds,
@@ -91,3 +111,13 @@ def generate(env):
91111 env .Append (CCFLAGS = ["-Og" ])
92112 elif env ["optimize" ] == "none" :
93113 env .Append (CCFLAGS = ["-O0" ])
114+
115+ if env ["lto" ] == "thin" :
116+ if (env ["platform" ] == "windows" or env ["platform" ] == "linux" ) and not env ["use_llvm" ]:
117+ print ("ThinLTO is only compatible with LLVM, use `use_llvm=yes` or `lto=full`." )
118+ env .Exit (255 )
119+ env .Append (CCFLAGS = ["-flto=thin" ])
120+ env .Append (LINKFLAGS = ["-flto=thin" ])
121+ elif env ["lto" ] == "full" :
122+ env .Append (CCFLAGS = ["-flto" ])
123+ env .Append (LINKFLAGS = ["-flto" ])
0 commit comments