Skip to content

Commit 1442ac5

Browse files
committed
Fix Windows MSVC build
Update the CMake tool so it respects the use_static_cpp godot-cpp option compiling with the proper CRT. Fix inclusion of secur32 in git2 tool.
1 parent 3ab9d03 commit 1442ac5

2 files changed

Lines changed: 73 additions & 29 deletions

File tree

tools/cmake.py

Lines changed: 71 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
1-
import os, sys
1+
import os
2+
import shlex
3+
import sys
24

3-
import SCons.Util
4-
import SCons.Builder
55
import SCons.Action
6+
import SCons.Builder
7+
import SCons.Util
8+
9+
10+
# This must be kept in sync with the value in https://github.com/godotengine/godot/blob/master/platform/android/detect.py#L58.
11+
def get_ndk_version():
12+
return "23.2.8568313"
613

714

815
def cmake_default_flags(env):
916
if env.get("cmake_default_flags", ""):
10-
return SCons.Util.CLVar(env["cmake_default_flags"])
17+
return shlex.split(env["cmake_default_flags"])
1118

1219
config = {}
1320

@@ -28,15 +35,16 @@ def cmake_default_flags(env):
2835
config["CMAKE_SYSTEM_VERSION"] = api
2936
config["CMAKE_ANDROID_ARCH_ABI"] = abi
3037
config["ANDROID_ABI"] = abi
31-
config["CMAKE_TOOLCHAIN_FILE"] = "%s/build/cmake/android.toolchain.cmake" % env.get(
32-
"ANDROID_NDK_ROOT", os.environ.get("ANDROID_NDK_ROOT", "")
33-
)
38+
ndk_root = os.environ.get("ANDROID_NDK_ROOT", env.get("ANDROID_HOME", "") + "/ndk/" + get_ndk_version())
39+
config["CMAKE_TOOLCHAIN_FILE"] = "%s/build/cmake/android.toolchain.cmake" % ndk_root
3440
config["CMAKE_ANDROID_STL_TYPE"] = "c++_static"
3541

3642
elif env["platform"] == "linux":
3743
linux_flags = {
3844
"x86_64": "-m64",
3945
"x86_32": "-m32",
46+
"arm32": "-march=armv7-a",
47+
"arm64": "-march=armv8-a",
4048
}.get(env["arch"], "")
4149
if linux_flags:
4250
config["CMAKE_C_FLAGS"] = linux_flags
@@ -47,10 +55,9 @@ def cmake_default_flags(env):
4755
config["CMAKE_OSX_ARCHITECTURES"] = '"x86_64;arm64"'
4856
else:
4957
config["CMAKE_OSX_ARCHITECTURES"] = env["arch"]
50-
if env["macos_deployment_target"] != "default":
58+
if env.get("macos_deployment_target", "default") != "default":
5159
config["CMAKE_OSX_DEPLOYMENT_TARGET"] = env["macos_deployment_target"]
52-
53-
if env["platform"] == "macos" and sys.platform != "darwin" and "OSXCROSS_ROOT" in os.environ:
60+
if sys.platform != "darwin" and "OSXCROSS_ROOT" in os.environ:
5461
config["CMAKE_AR"] = env["AR"]
5562
config["CMAKE_RANLIB"] = env["RANLIB"]
5663
if env["arch"] == "universal":
@@ -74,18 +81,17 @@ def cmake_default_flags(env):
7481

7582
elif env["platform"] == "windows":
7683
config["CMAKE_SYSTEM_NAME"] = "Windows"
77-
78-
flags = ["-D%s=%s" % it for it in config.items()]
79-
if env["CMAKEGENERATOR"]:
80-
flags.extend(["-G", env["CMAKEGENERATOR"]])
81-
elif env["platform"] == "windows":
8284
if env.get("is_msvc", False):
83-
flags.extend(["-G", "NMake Makefiles"])
84-
elif sys.platform in ["win32", "msys", "cygwin"]:
85-
flags.extend(["-G", "Ninja"])
86-
else:
87-
flags.extend(["-G", "Unix Makefiles"])
88-
return flags
85+
config["CMAKE_POLICY_DEFAULT_CMP0091"] = "NEW"
86+
if env.get("debug_crt", False):
87+
config["CMAKE_MSVC_RUNTIME_LIBRARY"] = "MultiThreadedDebugDLL"
88+
else:
89+
if env.get("use_static_cpp", False):
90+
config["CMAKE_MSVC_RUNTIME_LIBRARY"] = "MultiThreaded"
91+
else:
92+
config["CMAKE_MSVC_RUNTIME_LIBRARY"] = "MultiThreadedDLL"
93+
94+
return ["-D%s=%s" % it for it in config.items()]
8995

9096

9197
def cmake_emitter(target, source, env):
@@ -95,41 +101,77 @@ def cmake_emitter(target, source, env):
95101
def cmake_generator(target, source, env, for_signature):
96102
# Strip the -j option for signature to avoid rebuilding when num_jobs changes.
97103
build = env["CMAKEBUILDCOM"].replace("-j$CMAKEBUILDJOBS", "") if for_signature else env["CMAKEBUILDCOM"]
98-
return [
104+
actions = [
99105
SCons.Action.Action("$CMAKECONFCOM", "$CMAKECONFCOMSTR"),
100106
SCons.Action.Action(build, "$CMAKEBUILDCOMSTR"),
101107
]
108+
if env["CMAKE_INSTALL"]:
109+
actions.append(
110+
SCons.Action.Action("$CMAKEINSTALLCOM", "$CMAKEINSTALLCOMSTR"),
111+
)
112+
return actions
102113

103114

104-
def cmake_build(env, target_dir, source_dir, cmake_outputs=[], cmake_targets=[], cmake_options=[], dependencies=[]):
115+
def cmake_build(
116+
env, target_dir, source_dir, cmake_outputs=[], cmake_targets=[], cmake_options=[], dependencies=[], install=False
117+
):
105118
cmake_env = env.Clone()
106119
target = env.Dir("{}/{}/{}".format(target_dir, env["platform"], env["arch"]))
107120
source = env.Dir(source_dir)
108121
builder_targets = [target] + [str(target) + "/" + f for f in cmake_outputs]
109122
builder_sources = [source] + dependencies
110-
cmake_env.Append(CMAKECONFFLAGS=["-D%s=%s" % it for it in cmake_options.items()])
123+
default_flags = cmake_default_flags(env)
124+
125+
# Merge flags
126+
flags = []
127+
for df in default_flags:
128+
if not df.startswith("-D"):
129+
flags.append(df)
130+
else:
131+
f = df[2:].split("=")[0]
132+
if f in cmake_options:
133+
df += " " + cmake_options[f]
134+
cmake_options.pop(f)
135+
flags.append(df)
136+
for opt in cmake_options:
137+
flags.append("-D%s=%s" % (opt, cmake_options[opt]))
138+
139+
# Select generator
140+
if env["cmake_generator"]:
141+
flags.extend(["-G", env["cmake_generator"]])
142+
elif env["platform"] == "windows":
143+
if env.get("is_msvc", False):
144+
flags.extend(["-G", "NMake Makefiles"])
145+
elif sys.platform in ["win32", "msys", "cygwin"]:
146+
flags.extend(["-G", "Ninja"])
147+
else:
148+
flags.extend(["-G", "Unix Makefiles"])
149+
150+
cmake_env.Append(CMAKECONFFLAGS=flags)
111151
if len(cmake_targets) > 0:
112152
cmake_env.Append(CMAKEBUILDFLAGS=["-t"] + [t for t in cmake_targets])
153+
cmake_env["CMAKE_INSTALL"] = install
113154
return cmake_env.CMake(builder_targets, builder_sources)
114155

115156

116157
def options(opts):
117158
opts.Add("cmake_default_flags", "Default CMake platform flags override, will be autodetected if not specified.", "")
159+
opts.Add("cmake_generator", "CMake generator override, will be autodetected from platform if not specified.", "")
160+
opts.Add("cmake", "CMake binary to use", "cmake")
118161

119162

120163
def exists(env):
121164
return True
122165

123166

124167
def generate(env):
125-
env["CMAKE"] = "cmake"
126-
env["_cmake_default_flags"] = cmake_default_flags
127-
env["CMAKEDEFAULTFLAGS"] = "${_cmake_default_flags(__env__)}"
128-
env["CMAKEGENERATOR"] = ""
168+
env["CMAKE"] = env["cmake"]
129169
env["CMAKECONFFLAGS"] = SCons.Util.CLVar("")
130-
env["CMAKECONFCOM"] = "$CMAKE -B ${TARGET.dir} $CMAKEDEFAULTFLAGS $CMAKECONFFLAGS ${SOURCE.dir}"
170+
env["CMAKECONFCOM"] = "$CMAKE -B ${TARGET.dir} $CMAKECONFFLAGS ${SOURCE.dir}"
131171
env["CMAKEBUILDJOBS"] = "${__env__.GetOption('num_jobs')}"
132172
env["CMAKEBUILDFLAGS"] = SCons.Util.CLVar("")
173+
env["CMAKEINSTALLFLAGS"] = SCons.Util.CLVar("")
133174
env["CMAKEBUILDCOM"] = "$CMAKE --build ${TARGET.dir} $CMAKEBUILDFLAGS -j$CMAKEBUILDJOBS"
175+
env["CMAKEINSTALLCOM"] = "$CMAKE --install ${TARGET.dir} $CMAKEINSTALLFLAGS"
134176
env["BUILDERS"]["CMake"] = SCons.Builder.Builder(generator=cmake_generator, emitter=cmake_emitter)
135177
env.AddMethod(cmake_build, "CMakeBuild")

tools/git2.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ def build_library(env, deps):
5353

5454
env.Append(CPPPATH=["#thirdparty/git2/libgit2/include"])
5555
env.Prepend(LIBS=git2[1:])
56+
if env["platform"] == "windows":
57+
env.PrependUnique(LIBS=["secur32"])
5658

5759
return git2
5860

0 commit comments

Comments
 (0)