Statically link mingw/msvc runtime libraries on Windows

Co-authored-by: David Snopek <dsnopek@gmail.com>
(cherry picked from commit a745c2ac47)
pull/1205/head
Feiyun Wang 2023-04-02 22:46:40 +08:00 committed by David Snopek
parent 6fa6b8b178
commit 4fb9af7fb2
2 changed files with 34 additions and 16 deletions

View File

@ -60,17 +60,17 @@ def generate(env):
env.Append(CCFLAGS=["/Zi", "/FS"]) env.Append(CCFLAGS=["/Zi", "/FS"])
env.Append(LINKFLAGS=["/DEBUG:FULL"]) env.Append(LINKFLAGS=["/DEBUG:FULL"])
if env["optimize"] == "speed" or env["optimize"] == "speed_trace": if env["optimize"] == "speed":
env.Append(CCFLAGS=["/O2"]) env.Append(CCFLAGS=["/O2"])
env.Append(LINKFLAGS=["/OPT:REF"]) env.Append(LINKFLAGS=["/OPT:REF"])
elif env["optimize"] == "speed_trace":
env.Append(CCFLAGS=["/O2"])
env.Append(LINKFLAGS=["/OPT:REF", "/OPT:NOICF"])
elif env["optimize"] == "size": elif env["optimize"] == "size":
env.Append(CCFLAGS=["/O1"]) env.Append(CCFLAGS=["/O1"])
env.Append(LINKFLAGS=["/OPT:REF"]) env.Append(LINKFLAGS=["/OPT:REF"])
elif env["optimize"] == "debug" or env["optimize"] == "none":
if env["optimize"] == "debug" or env["optimize"] == "none": env.Append(CCFLAGS=["/Od"])
env.Append(CCFLAGS=["/MDd", "/Od"])
else:
env.Append(CCFLAGS=["/MD"])
else: else:
if env["debug_symbols"]: if env["debug_symbols"]:

View File

@ -9,6 +9,7 @@ from SCons.Variables import *
def options(opts): def options(opts):
opts.Add(BoolVariable("use_mingw", "Use the MinGW compiler instead of MSVC - only effective on Windows", False)) opts.Add(BoolVariable("use_mingw", "Use the MinGW compiler instead of MSVC - only effective on Windows", False))
opts.Add(BoolVariable("use_clang_cl", "Use the clang driver instead of MSVC - only effective on Windows", False)) opts.Add(BoolVariable("use_clang_cl", "Use the clang driver instead of MSVC - only effective on Windows", False))
opts.Add(BoolVariable("use_static_cpp", "Link MinGW/MSVC C++ runtime libraries statically", True))
def exists(env): def exists(env):
@ -37,6 +38,11 @@ def generate(env):
env["CC"] = "clang-cl" env["CC"] = "clang-cl"
env["CXX"] = "clang-cl" env["CXX"] = "clang-cl"
if env["use_static_cpp"]:
env.Append(CCFLAGS=["/MT"])
else:
env.Append(CCFLAGS=["/MD"])
elif sys.platform == "win32" or sys.platform == "msys": elif sys.platform == "win32" or sys.platform == "msys":
env["use_mingw"] = True env["use_mingw"] = True
mingw.generate(env) mingw.generate(env)
@ -45,6 +51,18 @@ def generate(env):
env["SHLIBPREFIX"] = "" env["SHLIBPREFIX"] = ""
# Want dll suffix # Want dll suffix
env["SHLIBSUFFIX"] = ".dll" env["SHLIBSUFFIX"] = ".dll"
env.Append(CCFLAGS=["-Wwrite-strings"])
env.Append(LINKFLAGS=["-Wl,--no-undefined"])
if env["use_static_cpp"]:
env.Append(
LINKFLAGS=[
"-static",
"-static-libgcc",
"-static-libstdc++",
]
)
# Long line hack. Use custom spawn, quick AR append (to avoid files with the same names to override each other). # Long line hack. Use custom spawn, quick AR append (to avoid files with the same names to override each other).
my_spawn.configure(env) my_spawn.configure(env)
@ -60,15 +78,15 @@ def generate(env):
# Want dll suffix # Want dll suffix
env["SHLIBSUFFIX"] = ".dll" env["SHLIBSUFFIX"] = ".dll"
# These options are for a release build even using target=debug env.Append(CCFLAGS=["-Wwrite-strings"])
env.Append(CCFLAGS=["-O3", "-Wwrite-strings"]) env.Append(LINKFLAGS=["-Wl,--no-undefined"])
env.Append( if env["use_static_cpp"]:
LINKFLAGS=[ env.Append(
"--static", LINKFLAGS=[
"-Wl,--no-undefined", "-static",
"-static-libgcc", "-static-libgcc",
"-static-libstdc++", "-static-libstdc++",
] ]
) )
env.Append(CPPDEFINES=["WINDOWS_ENABLED"]) env.Append(CPPDEFINES=["WINDOWS_ENABLED"])