1- import os , sys
1+ import os
2+ import shlex
3+ import sys
24
3- import SCons .Util
4- import SCons .Builder
55import 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
815def 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
9197def cmake_emitter (target , source , env ):
@@ -95,41 +101,77 @@ def cmake_emitter(target, source, env):
95101def 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
116157def 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
120163def exists (env ):
121164 return True
122165
123166
124167def 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" )
0 commit comments