| 
									
										
										
										
											2017-06-30 19:21:38 +02:00
										 |  |  | import methods | 
					
						
							| 
									
										
										
										
											2015-10-01 16:25:36 -03:00
										 |  |  | import os | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  | import subprocess | 
					
						
							|  |  |  | import sys | 
					
						
							| 
									
										
										
										
											2021-12-15 17:38:10 -08:00
										 |  |  | from platform_methods import detect_arch | 
					
						
							| 
									
										
										
										
											2015-10-01 16:25:36 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-23 22:21:46 +09:00
										 |  |  | from typing import TYPE_CHECKING | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if TYPE_CHECKING: | 
					
						
							|  |  |  |     from SCons import Environment | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-17 18:17:41 +01:00
										 |  |  | # To match other platforms | 
					
						
							|  |  |  | STACK_SIZE = 8388608 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-30 19:05:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-01 16:25:36 -03:00
										 |  |  | def is_active(): | 
					
						
							| 
									
										
										
										
											2016-10-30 18:44:57 +01:00
										 |  |  |     return True | 
					
						
							| 
									
										
										
										
											2016-04-02 20:26:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-30 19:05:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-01 16:25:36 -03:00
										 |  |  | def get_name(): | 
					
						
							| 
									
										
										
										
											2016-10-30 18:44:57 +01:00
										 |  |  |     return "Windows" | 
					
						
							| 
									
										
										
										
											2015-10-01 16:25:36 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-30 19:05:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  | def try_cmd(test, prefix, arch): | 
					
						
							|  |  |  |     if arch: | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             out = subprocess.Popen( | 
					
						
							|  |  |  |                 get_mingw_bin_prefix(prefix, arch) + test, | 
					
						
							|  |  |  |                 shell=True, | 
					
						
							|  |  |  |                 stderr=subprocess.PIPE, | 
					
						
							|  |  |  |                 stdout=subprocess.PIPE, | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             out.communicate() | 
					
						
							|  |  |  |             if out.returncode == 0: | 
					
						
							|  |  |  |                 return True | 
					
						
							|  |  |  |         except Exception: | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         for a in ["x86_64", "x86_32", "arm64", "arm32"]: | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 out = subprocess.Popen( | 
					
						
							|  |  |  |                     get_mingw_bin_prefix(prefix, a) + test, | 
					
						
							|  |  |  |                     shell=True, | 
					
						
							|  |  |  |                     stderr=subprocess.PIPE, | 
					
						
							|  |  |  |                     stdout=subprocess.PIPE, | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |                 out.communicate() | 
					
						
							|  |  |  |                 if out.returncode == 0: | 
					
						
							|  |  |  |                     return True | 
					
						
							|  |  |  |             except Exception: | 
					
						
							|  |  |  |                 pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-01 16:25:36 -03:00
										 |  |  | def can_build(): | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |     if os.name == "nt": | 
					
						
							| 
									
										
										
										
											2017-08-18 21:45:52 +02:00
										 |  |  |         # Building natively on Windows | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  |         # If VCINSTALLDIR is set in the OS environ, use traditional Godot logic to set up MSVC | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |         if os.getenv("VCINSTALLDIR"):  # MSVC, manual setup | 
					
						
							| 
									
										
										
										
											2016-10-30 18:44:57 +01:00
										 |  |  |             return True | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |         # Otherwise, let SCons find MSVC if installed, or else MinGW. | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  |         # Since we're just returning True here, if there's no compiler | 
					
						
							|  |  |  |         # installed, we'll get errors when it tries to build with the | 
					
						
							|  |  |  |         # null compiler. | 
					
						
							|  |  |  |         return True | 
					
						
							| 
									
										
										
										
											2016-10-30 18:44:57 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |     if os.name == "posix": | 
					
						
							| 
									
										
										
										
											2017-08-18 21:45:52 +02:00
										 |  |  |         # Cross-compiling with MinGW-w64 (old MinGW32 is not supported) | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |         prefix = os.getenv("MINGW_PREFIX", "") | 
					
						
							| 
									
										
										
										
											2016-10-30 18:44:57 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |         if try_cmd("gcc --version", prefix, "") or try_cmd("clang --version", prefix, ""): | 
					
						
							| 
									
										
										
										
											2016-10-30 18:44:57 +01:00
										 |  |  |             return True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return False | 
					
						
							| 
									
										
										
										
											2016-04-02 20:26:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-30 19:05:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  | def get_mingw_bin_prefix(prefix, arch): | 
					
						
							|  |  |  |     if not prefix: | 
					
						
							|  |  |  |         mingw_bin_prefix = "" | 
					
						
							|  |  |  |     elif prefix[-1] != "/": | 
					
						
							|  |  |  |         mingw_bin_prefix = prefix + "/bin/" | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         mingw_bin_prefix = prefix + "bin/" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if arch == "x86_64": | 
					
						
							|  |  |  |         mingw_bin_prefix += "x86_64-w64-mingw32-" | 
					
						
							|  |  |  |     elif arch == "x86_32": | 
					
						
							|  |  |  |         mingw_bin_prefix += "i686-w64-mingw32-" | 
					
						
							|  |  |  |     elif arch == "arm32": | 
					
						
							|  |  |  |         mingw_bin_prefix += "armv7-w64-mingw32-" | 
					
						
							|  |  |  |     elif arch == "arm64": | 
					
						
							|  |  |  |         mingw_bin_prefix += "aarch64-w64-mingw32-" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return mingw_bin_prefix | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def detect_build_env_arch(): | 
					
						
							|  |  |  |     msvc_target_aliases = { | 
					
						
							|  |  |  |         "amd64": "x86_64", | 
					
						
							|  |  |  |         "i386": "x86_32", | 
					
						
							|  |  |  |         "i486": "x86_32", | 
					
						
							|  |  |  |         "i586": "x86_32", | 
					
						
							|  |  |  |         "i686": "x86_32", | 
					
						
							|  |  |  |         "x86": "x86_32", | 
					
						
							|  |  |  |         "x64": "x86_64", | 
					
						
							|  |  |  |         "x86_64": "x86_64", | 
					
						
							|  |  |  |         "arm": "arm32", | 
					
						
							|  |  |  |         "arm64": "arm64", | 
					
						
							|  |  |  |         "aarch64": "arm64", | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if os.getenv("VCINSTALLDIR") or os.getenv("VCTOOLSINSTALLDIR"): | 
					
						
							|  |  |  |         if os.getenv("Platform"): | 
					
						
							|  |  |  |             msvc_arch = os.getenv("Platform").lower() | 
					
						
							|  |  |  |             if msvc_arch in msvc_target_aliases.keys(): | 
					
						
							|  |  |  |                 return msvc_target_aliases[msvc_arch] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if os.getenv("VSCMD_ARG_TGT_ARCH"): | 
					
						
							|  |  |  |             msvc_arch = os.getenv("VSCMD_ARG_TGT_ARCH").lower() | 
					
						
							|  |  |  |             if msvc_arch in msvc_target_aliases.keys(): | 
					
						
							|  |  |  |                 return msvc_target_aliases[msvc_arch] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Pre VS 2017 checks. | 
					
						
							|  |  |  |         if os.getenv("VCINSTALLDIR"): | 
					
						
							|  |  |  |             PATH = os.getenv("PATH").upper() | 
					
						
							|  |  |  |             VCINSTALLDIR = os.getenv("VCINSTALLDIR").upper() | 
					
						
							|  |  |  |             path_arch = { | 
					
						
							|  |  |  |                 "BIN\\x86_ARM;": "arm32", | 
					
						
							|  |  |  |                 "BIN\\amd64_ARM;": "arm32", | 
					
						
							|  |  |  |                 "BIN\\x86_ARM64;": "arm64", | 
					
						
							|  |  |  |                 "BIN\\amd64_ARM64;": "arm64", | 
					
						
							|  |  |  |                 "BIN\\x86_amd64;": "a86_64", | 
					
						
							|  |  |  |                 "BIN\\amd64;": "x86_64", | 
					
						
							|  |  |  |                 "BIN\\amd64_x86;": "x86_32", | 
					
						
							|  |  |  |                 "BIN;": "x86_32", | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             for path, arch in path_arch.items(): | 
					
						
							|  |  |  |                 final_path = VCINSTALLDIR + path | 
					
						
							|  |  |  |                 if final_path in PATH: | 
					
						
							|  |  |  |                     return arch | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # VS 2017 and newer. | 
					
						
							|  |  |  |         if os.getenv("VCTOOLSINSTALLDIR"): | 
					
						
							|  |  |  |             host_path_index = os.getenv("PATH").upper().find(os.getenv("VCTOOLSINSTALLDIR").upper() + "BIN\\HOST") | 
					
						
							|  |  |  |             if host_path_index > -1: | 
					
						
							|  |  |  |                 first_path_arch = os.getenv("PATH").split(";")[0].rsplit("\\", 1)[-1].lower() | 
					
						
							|  |  |  |                 return msvc_target_aliases[first_path_arch] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     msys_target_aliases = { | 
					
						
							|  |  |  |         "mingw32": "x86_32", | 
					
						
							|  |  |  |         "mingw64": "x86_64", | 
					
						
							|  |  |  |         "ucrt64": "x86_64", | 
					
						
							|  |  |  |         "clang64": "x86_64", | 
					
						
							|  |  |  |         "clang32": "x86_32", | 
					
						
							|  |  |  |         "clangarm64": "arm64", | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if os.getenv("MSYSTEM"): | 
					
						
							|  |  |  |         msys_arch = os.getenv("MSYSTEM").lower() | 
					
						
							|  |  |  |         if msys_arch in msys_target_aliases.keys(): | 
					
						
							|  |  |  |             return msys_target_aliases[msys_arch] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return "" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-01 16:25:36 -03:00
										 |  |  | def get_opts(): | 
					
						
							| 
									
										
										
										
											2017-09-25 00:37:17 -04:00
										 |  |  |     from SCons.Variables import BoolVariable, EnumVariable | 
					
						
							| 
									
										
										
										
											2015-10-01 16:25:36 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |     mingw = os.getenv("MINGW_PREFIX", "") | 
					
						
							| 
									
										
										
										
											2015-10-01 16:25:36 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-30 18:44:57 +01:00
										 |  |  |     return [ | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |         ("mingw_prefix", "MinGW prefix", mingw), | 
					
						
							| 
									
										
										
										
											2017-12-01 21:15:56 +01:00
										 |  |  |         # Targeted Windows version: 7 (and later), minimum supported version | 
					
						
							|  |  |  |         # XP support dropped after EOL due to missing API for IPv6 and other issues | 
					
						
							|  |  |  |         # Vista support dropped after EOL due to GH-10243 | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |         ( | 
					
						
							|  |  |  |             "target_win_version", | 
					
						
							|  |  |  |             "Targeted Windows version, >= 0x0601 (Windows 7)", | 
					
						
							|  |  |  |             "0x0601", | 
					
						
							|  |  |  |         ), | 
					
						
							| 
									
										
										
										
											2021-12-16 15:00:55 +02:00
										 |  |  |         EnumVariable("windows_subsystem", "Windows subsystem", "gui", ("gui", "console")), | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |         ( | 
					
						
							|  |  |  |             "msvc_version", | 
					
						
							|  |  |  |             "MSVC version to use. Ignored if VCINSTALLDIR is set in shell env.", | 
					
						
							|  |  |  |             None, | 
					
						
							|  |  |  |         ), | 
					
						
							| 
									
										
										
										
											2020-12-16 16:29:32 +01:00
										 |  |  |         BoolVariable("use_mingw", "Use the Mingw compiler, even if MSVC is installed.", False), | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |         BoolVariable("use_llvm", "Use the LLVM compiler", False), | 
					
						
							| 
									
										
										
										
											2020-11-26 23:19:23 +02:00
										 |  |  |         BoolVariable("use_static_cpp", "Link MinGW/MSVC C++ runtime libraries statically", True), | 
					
						
							| 
									
										
										
										
											2021-03-12 18:44:06 +02:00
										 |  |  |         BoolVariable("use_asan", "Use address sanitizer (ASAN)", False), | 
					
						
							| 
									
										
										
										
											2022-12-05 15:56:04 +01:00
										 |  |  |         BoolVariable("debug_crt", "Compile with MSVC's debug CRT (/MDd)", False), | 
					
						
							| 
									
										
										
										
											2016-10-30 18:44:57 +01:00
										 |  |  |     ] | 
					
						
							| 
									
										
										
										
											2016-04-02 20:26:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-30 19:05:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-01 16:25:36 -03:00
										 |  |  | def get_flags(): | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |     arch = detect_build_env_arch() or detect_arch() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-15 17:38:10 -08:00
										 |  |  |     return [ | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |         ("arch", arch), | 
					
						
							| 
									
										
										
										
											2021-12-15 17:38:10 -08:00
										 |  |  |     ] | 
					
						
							| 
									
										
										
										
											2016-04-02 20:26:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-30 19:05:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-30 18:57:40 +01:00
										 |  |  | def build_res_file(target, source, env): | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |     arch_aliases = { | 
					
						
							|  |  |  |         "x86_32": "pe-i386", | 
					
						
							|  |  |  |         "x86_64": "pe-x86-64", | 
					
						
							|  |  |  |         "arm32": "armv7-w64-mingw32", | 
					
						
							|  |  |  |         "arm64": "aarch64-w64-mingw32", | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     cmdbase = "windres --include-dir . --target=" + arch_aliases[env["arch"]] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     mingw_bin_prefix = get_mingw_bin_prefix(env["mingw_prefix"], env["arch"]) | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-30 18:44:57 +01:00
										 |  |  |     for x in range(len(source)): | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |         ok = True | 
					
						
							|  |  |  |         # Try prefixed executable (MinGW on Linux). | 
					
						
							|  |  |  |         cmd = mingw_bin_prefix + cmdbase + " -i " + str(source[x]) + " -o " + str(target[x]) | 
					
						
							| 
									
										
										
										
											2016-10-30 18:44:57 +01:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2016-10-30 18:57:40 +01:00
										 |  |  |             out = subprocess.Popen(cmd, shell=True, stderr=subprocess.PIPE).communicate() | 
					
						
							| 
									
										
										
										
											2016-10-30 18:44:57 +01:00
										 |  |  |             if len(out[1]): | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |                 ok = False | 
					
						
							| 
									
										
										
										
											2020-12-12 10:05:42 +00:00
										 |  |  |         except Exception: | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |             ok = False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Try generic executable (MSYS2). | 
					
						
							|  |  |  |         if not ok: | 
					
						
							|  |  |  |             cmd = cmdbase + " -i " + str(source[x]) + " -o " + str(target[x]) | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 out = subprocess.Popen(cmd, shell=True, stderr=subprocess.PIPE).communicate() | 
					
						
							|  |  |  |                 if len(out[1]): | 
					
						
							|  |  |  |                     return -1 | 
					
						
							|  |  |  |             except Exception: | 
					
						
							|  |  |  |                 return -1 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-30 18:44:57 +01:00
										 |  |  |     return 0 | 
					
						
							| 
									
										
										
										
											2015-10-01 16:25:36 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-30 19:05:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  | def setup_msvc_manual(env): | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |     """Running from VCVARS environment""" | 
					
						
							| 
									
										
										
										
											2021-12-15 17:38:10 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |     env_arch = detect_build_env_arch() | 
					
						
							|  |  |  |     if env["arch"] != env_arch: | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |         print( | 
					
						
							|  |  |  |             """
 | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |             Arch argument (%s) is not matching Native/Cross Compile Tools Prompt/Developer Console (or Visual Studio settings) that is being used to run SCons (%s). | 
					
						
							|  |  |  |             Run SCons again without arch argument (example: scons p=windows) and SCons will attempt to detect what MSVC compiler will be executed and inform you. | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |             """
 | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |             % (env["arch"], env_arch) | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |         sys.exit(200) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     print("Found MSVC, arch %s" % (env_arch)) | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | def setup_msvc_auto(env): | 
					
						
							|  |  |  |     """Set up MSVC using SCons's auto-detection logic""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # If MSVC_VERSION is set by SCons, we know MSVC is installed. | 
					
						
							|  |  |  |     # But we may want a different version or target arch. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-15 17:38:10 -08:00
										 |  |  |     # Valid architectures for MSVC's TARGET_ARCH: | 
					
						
							|  |  |  |     # ['amd64', 'emt64', 'i386', 'i486', 'i586', 'i686', 'ia64', 'itanium', 'x86', 'x86_64', 'arm', 'arm64', 'aarch64'] | 
					
						
							|  |  |  |     # Our x86_64 and arm64 are the same, and we need to map the 32-bit | 
					
						
							|  |  |  |     # architectures to other names since MSVC isn't as explicit. | 
					
						
							|  |  |  |     # The rest we don't need to worry about because they are | 
					
						
							|  |  |  |     # aliases or aren't supported by Godot (itanium & ia64). | 
					
						
							|  |  |  |     msvc_arch_aliases = {"x86_32": "x86", "arm32": "arm"} | 
					
						
							|  |  |  |     if env["arch"] in msvc_arch_aliases.keys(): | 
					
						
							|  |  |  |         env["TARGET_ARCH"] = msvc_arch_aliases[env["arch"]] | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         env["TARGET_ARCH"] = env["arch"] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  |     # The env may have already been set up with default MSVC tools, so | 
					
						
							|  |  |  |     # reset a few things so we can set it up with the tools we want. | 
					
						
							|  |  |  |     # (Ideally we'd decide on the tool config before configuring any | 
					
						
							|  |  |  |     # environment, and just set the env up once, but this function runs | 
					
						
							|  |  |  |     # on an existing env so this is the simplest way.) | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |     env["MSVC_SETUP_RUN"] = False  # Need to set this to re-run the tool | 
					
						
							|  |  |  |     env["MSVS_VERSION"] = None | 
					
						
							|  |  |  |     env["MSVC_VERSION"] = None | 
					
						
							| 
									
										
										
										
											2021-12-15 17:38:10 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-01 10:08:20 +02:00
										 |  |  |     if "msvc_version" in env: | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |         env["MSVC_VERSION"] = env["msvc_version"] | 
					
						
							|  |  |  |     env.Tool("msvc") | 
					
						
							|  |  |  |     env.Tool("mssdk")  # we want the MS SDK | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  |     # Note: actual compiler version can be found in env['MSVC_VERSION'], e.g. "14.1" for VS2015 | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |     print("Found MSVC version %s, arch %s" % (env["MSVC_VERSION"], env["arch"])) | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  | def setup_mingw(env): | 
					
						
							|  |  |  |     """Set up env for use with mingw""" | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |     env_arch = detect_build_env_arch() | 
					
						
							|  |  |  |     if os.getenv("MSYSTEM") == "MSYS": | 
					
						
							|  |  |  |         print( | 
					
						
							|  |  |  |             """
 | 
					
						
							|  |  |  |             Running from base MSYS2 console/environment, use target specific environment instead (e.g., mingw32, mingw64, clang32, clang64). | 
					
						
							|  |  |  |             """
 | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         sys.exit(201) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if env_arch != "" and env["arch"] != env_arch: | 
					
						
							|  |  |  |         print( | 
					
						
							|  |  |  |             """
 | 
					
						
							|  |  |  |             Arch argument (%s) is not matching MSYS2 console/environment that is being used to run SCons (%s). | 
					
						
							|  |  |  |             Run SCons again without arch argument (example: scons p=windows) and SCons will attempt to detect what MSYS2 compiler will be executed and inform you. | 
					
						
							|  |  |  |             """
 | 
					
						
							|  |  |  |             % (env["arch"], env_arch) | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         sys.exit(202) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if not try_cmd("gcc --version", env["mingw_prefix"], env["arch"]) and not try_cmd( | 
					
						
							|  |  |  |         "clang --version", env["mingw_prefix"], env["arch"] | 
					
						
							|  |  |  |     ): | 
					
						
							|  |  |  |         print( | 
					
						
							|  |  |  |             """
 | 
					
						
							|  |  |  |             No valid compilers found, use MINGW_PREFIX environment variable to set MinGW path. | 
					
						
							|  |  |  |             """
 | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         sys.exit(202) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     print("Using MinGW, arch %s" % (env["arch"])) | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  | def configure_msvc(env, vcvars_msvc_config): | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  |     """Configure env to work with MSVC""" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												SCons: Unify tools/target build type configuration
Implements https://github.com/godotengine/godot-proposals/issues/3371.
New `target` presets
====================
The `tools` option is removed and `target` changes to use three new presets,
which match the builds users are familiar with. These targets control the
default optimization level and enable editor-specific and debugging code:
- `editor`: Replaces `tools=yes target=release_debug`.
  * Defines: `TOOLS_ENABLED`, `DEBUG_ENABLED`, `-O2`/`/O2`
- `template_debug`: Replaces `tools=no target=release_debug`.
  * Defines: `DEBUG_ENABLED`, `-O2`/`/O2`
- `template_release`: Replaces `tools=no target=release`.
  * Defines: `-O3`/`/O2`
New `dev_build` option
======================
The previous `target=debug` is now replaced by a separate `dev_build=yes`
option, which can be used in combination with either of the three targets,
and changes the following:
- `dev_build`: Defines `DEV_ENABLED`, disables optimization (`-O0`/`/0d`),
  enables generating debug symbols, does not define `NDEBUG` so `assert()`
  works in thirdparty libraries, adds a `.dev` suffix to the binary name.
Note: Unlike previously, `dev_build` defaults to off so that users who
compile Godot from source get an optimized and small build by default.
Engine contributors should now set `dev_build=yes` in their build scripts or
IDE configuration manually.
Changed binary names
====================
The name of generated binaries and object files are changed too, to follow
this format:
`godot.<platform>.<target>[.dev][.double].<arch>[.<extra_suffix>][.<ext>]`
For example:
- `godot.linuxbsd.editor.dev.arm64`
- `godot.windows.template_release.double.x86_64.mono.exe`
Be sure to update your links/scripts/IDE config accordingly.
More flexible `optimize` and `debug_symbols` options
====================================================
The optimization level and whether to generate debug symbols can be further
specified with the `optimize` and `debug_symbols` options. So the default
values listed above for the various `target` and `dev_build` combinations
are indicative and can be replaced when compiling, e.g.:
`scons p=linuxbsd target=template_debug dev_build=yes optimize=debug`
will make a "debug" export template with dev-only code enabled, `-Og`
optimization level for GCC/Clang, and debug symbols. Perfect for debugging
complex crashes at runtime in an exported project.
											
										 
											2022-09-22 08:28:55 +02:00
										 |  |  |     ## Build type | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
											  
											
												SCons: Unify tools/target build type configuration
Implements https://github.com/godotengine/godot-proposals/issues/3371.
New `target` presets
====================
The `tools` option is removed and `target` changes to use three new presets,
which match the builds users are familiar with. These targets control the
default optimization level and enable editor-specific and debugging code:
- `editor`: Replaces `tools=yes target=release_debug`.
  * Defines: `TOOLS_ENABLED`, `DEBUG_ENABLED`, `-O2`/`/O2`
- `template_debug`: Replaces `tools=no target=release_debug`.
  * Defines: `DEBUG_ENABLED`, `-O2`/`/O2`
- `template_release`: Replaces `tools=no target=release`.
  * Defines: `-O3`/`/O2`
New `dev_build` option
======================
The previous `target=debug` is now replaced by a separate `dev_build=yes`
option, which can be used in combination with either of the three targets,
and changes the following:
- `dev_build`: Defines `DEV_ENABLED`, disables optimization (`-O0`/`/0d`),
  enables generating debug symbols, does not define `NDEBUG` so `assert()`
  works in thirdparty libraries, adds a `.dev` suffix to the binary name.
Note: Unlike previously, `dev_build` defaults to off so that users who
compile Godot from source get an optimized and small build by default.
Engine contributors should now set `dev_build=yes` in their build scripts or
IDE configuration manually.
Changed binary names
====================
The name of generated binaries and object files are changed too, to follow
this format:
`godot.<platform>.<target>[.dev][.double].<arch>[.<extra_suffix>][.<ext>]`
For example:
- `godot.linuxbsd.editor.dev.arm64`
- `godot.windows.template_release.double.x86_64.mono.exe`
Be sure to update your links/scripts/IDE config accordingly.
More flexible `optimize` and `debug_symbols` options
====================================================
The optimization level and whether to generate debug symbols can be further
specified with the `optimize` and `debug_symbols` options. So the default
values listed above for the various `target` and `dev_build` combinations
are indicative and can be replaced when compiling, e.g.:
`scons p=linuxbsd target=template_debug dev_build=yes optimize=debug`
will make a "debug" export template with dev-only code enabled, `-Og`
optimization level for GCC/Clang, and debug symbols. Perfect for debugging
complex crashes at runtime in an exported project.
											
										 
											2022-09-22 08:28:55 +02:00
										 |  |  |     # TODO: Re-evaluate the need for this / streamline with common config. | 
					
						
							|  |  |  |     if env["target"] == "template_release": | 
					
						
							|  |  |  |         env.Append(LINKFLAGS=["/ENTRY:mainCRTStartup"]) | 
					
						
							| 
									
										
										
										
											2018-08-19 01:37:53 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-17 19:07:12 +03:00
										 |  |  |     if env["windows_subsystem"] == "gui": | 
					
						
							|  |  |  |         env.Append(LINKFLAGS=["/SUBSYSTEM:WINDOWS"]) | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         env.Append(LINKFLAGS=["/SUBSYSTEM:CONSOLE"]) | 
					
						
							| 
									
										
										
										
											2020-09-14 19:56:41 +02:00
										 |  |  |         env.AppendUnique(CPPDEFINES=["WINDOWS_SUBSYSTEM_CONSOLE"]) | 
					
						
							| 
									
										
										
										
											2020-08-17 19:07:12 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  |     ## Compile/link flags | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-05 15:56:04 +01:00
										 |  |  |     if env["debug_crt"]: | 
					
						
							| 
									
										
										
										
											2022-11-28 12:51:11 +01:00
										 |  |  |         # Always use dynamic runtime, static debug CRT breaks thread_local. | 
					
						
							|  |  |  |         env.AppendUnique(CCFLAGS=["/MDd"]) | 
					
						
							| 
									
										
										
										
											2020-11-26 23:19:23 +02:00
										 |  |  |     else: | 
					
						
							| 
									
										
										
										
											2022-11-28 12:51:11 +01:00
										 |  |  |         if env["use_static_cpp"]: | 
					
						
							|  |  |  |             env.AppendUnique(CCFLAGS=["/MT"]) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             env.AppendUnique(CCFLAGS=["/MD"]) | 
					
						
							| 
									
										
										
										
											2021-02-09 00:20:42 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |     if env["arch"] == "x86_32": | 
					
						
							|  |  |  |         env["x86_libtheora_opt_vc"] = True | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-26 23:19:23 +02:00
										 |  |  |     env.AppendUnique(CCFLAGS=["/Gd", "/GR", "/nologo"]) | 
					
						
							| 
									
										
										
										
											2021-11-10 16:02:02 +01:00
										 |  |  |     env.AppendUnique(CCFLAGS=["/utf-8"])  # Force to use Unicode encoding. | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |     env.AppendUnique(CXXFLAGS=["/TP"])  # assume all sources are C++ | 
					
						
							| 
									
										
										
										
											2022-07-25 20:10:20 +01:00
										 |  |  |     # Once it was thought that only debug builds would be too large, | 
					
						
							|  |  |  |     # but this has recently stopped being true. See the mingw function | 
					
						
							|  |  |  |     # for notes on why this shouldn't be enabled for gcc | 
					
						
							|  |  |  |     env.AppendUnique(CCFLAGS=["/bigobj"]) | 
					
						
							| 
									
										
										
										
											2021-11-10 16:02:02 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |     if vcvars_msvc_config:  # should be automatic if SCons found it | 
					
						
							| 
									
										
										
										
											2018-05-07 00:42:12 +02:00
										 |  |  |         if os.getenv("WindowsSdkDir") is not None: | 
					
						
							| 
									
										
										
										
											2019-04-30 13:12:02 +02:00
										 |  |  |             env.Prepend(CPPPATH=[os.getenv("WindowsSdkDir") + "/Include"]) | 
					
						
							| 
									
										
										
										
											2018-05-07 00:42:12 +02:00
										 |  |  |         else: | 
					
						
							|  |  |  |             print("Missing environment variable: WindowsSdkDir") | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |     env.AppendUnique( | 
					
						
							|  |  |  |         CPPDEFINES=[ | 
					
						
							|  |  |  |             "WINDOWS_ENABLED", | 
					
						
							|  |  |  |             "WASAPI_ENABLED", | 
					
						
							|  |  |  |             "WINMIDI_ENABLED", | 
					
						
							|  |  |  |             "TYPED_METHOD_BIND", | 
					
						
							|  |  |  |             "WIN32", | 
					
						
							|  |  |  |             "MSVC", | 
					
						
							|  |  |  |             "WINVER=%s" % env["target_win_version"], | 
					
						
							|  |  |  |             "_WIN32_WINNT=%s" % env["target_win_version"], | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     env.AppendUnique(CPPDEFINES=["NOMINMAX"])  # disable bogus min/max WinDef.h macros | 
					
						
							| 
									
										
										
										
											2021-12-15 17:38:10 -08:00
										 |  |  |     if env["arch"] == "x86_64": | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |         env.AppendUnique(CPPDEFINES=["_WIN64"]) | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ## Libs | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |     LIBS = [ | 
					
						
							|  |  |  |         "winmm", | 
					
						
							|  |  |  |         "dsound", | 
					
						
							|  |  |  |         "kernel32", | 
					
						
							|  |  |  |         "ole32", | 
					
						
							|  |  |  |         "oleaut32", | 
					
						
							| 
									
										
										
										
											2021-11-04 14:33:37 +02:00
										 |  |  |         "sapi", | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |         "user32", | 
					
						
							|  |  |  |         "gdi32", | 
					
						
							|  |  |  |         "IPHLPAPI", | 
					
						
							|  |  |  |         "Shlwapi", | 
					
						
							|  |  |  |         "wsock32", | 
					
						
							|  |  |  |         "Ws2_32", | 
					
						
							|  |  |  |         "shell32", | 
					
						
							|  |  |  |         "advapi32", | 
					
						
							|  |  |  |         "dinput8", | 
					
						
							|  |  |  |         "dxguid", | 
					
						
							|  |  |  |         "imm32", | 
					
						
							|  |  |  |         "bcrypt", | 
					
						
							|  |  |  |         "Avrt", | 
					
						
							|  |  |  |         "dwmapi", | 
					
						
							| 
									
										
										
										
											2022-07-08 15:38:30 +03:00
										 |  |  |         "dwrite", | 
					
						
							| 
									
										
										
										
											2022-10-11 12:39:41 +02:00
										 |  |  |         "wbemuuid", | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |     ] | 
					
						
							| 
									
										
										
										
											2019-06-22 19:34:26 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-08 19:25:49 -04:00
										 |  |  |     if env["vulkan"]: | 
					
						
							|  |  |  |         env.AppendUnique(CPPDEFINES=["VULKAN_ENABLED"]) | 
					
						
							|  |  |  |         if not env["use_volk"]: | 
					
						
							|  |  |  |             LIBS += ["vulkan"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if env["opengl3"]: | 
					
						
							|  |  |  |         env.AppendUnique(CPPDEFINES=["GLES3_ENABLED"]) | 
					
						
							|  |  |  |         LIBS += ["opengl32"] | 
					
						
							| 
									
										
										
										
											2019-06-22 19:34:26 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  |     env.Append(LINKFLAGS=[p + env["LIBSUFFIX"] for p in LIBS]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |     if vcvars_msvc_config: | 
					
						
							| 
									
										
										
										
											2018-05-07 00:42:12 +02:00
										 |  |  |         if os.getenv("WindowsSdkDir") is not None: | 
					
						
							|  |  |  |             env.Append(LIBPATH=[os.getenv("WindowsSdkDir") + "/Lib"]) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             print("Missing environment variable: WindowsSdkDir") | 
					
						
							| 
									
										
										
										
											2017-06-30 19:21:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  |     ## LTO | 
					
						
							| 
									
										
										
										
											2017-06-30 19:21:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-13 17:01:47 +02:00
										 |  |  |     if env["lto"] == "auto":  # No LTO by default for MSVC, doesn't help. | 
					
						
							|  |  |  |         env["lto"] = "none" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-21 15:15:54 +02:00
										 |  |  |     if env["lto"] != "none": | 
					
						
							|  |  |  |         if env["lto"] == "thin": | 
					
						
							|  |  |  |             print("ThinLTO is only compatible with LLVM, use `use_llvm=yes` or `lto=full`.") | 
					
						
							|  |  |  |             sys.exit(255) | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |         env.AppendUnique(CCFLAGS=["/GL"]) | 
					
						
							|  |  |  |         env.AppendUnique(ARFLAGS=["/LTCG"]) | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  |         if env["progress"]: | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |             env.AppendUnique(LINKFLAGS=["/LTCG:STATUS"]) | 
					
						
							| 
									
										
										
										
											2017-06-30 19:21:38 +02:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |             env.AppendUnique(LINKFLAGS=["/LTCG"]) | 
					
						
							| 
									
										
										
										
											2017-06-30 19:21:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |     if vcvars_msvc_config: | 
					
						
							| 
									
										
										
										
											2019-04-30 13:12:02 +02:00
										 |  |  |         env.Prepend(CPPPATH=[p for p in os.getenv("INCLUDE").split(";")]) | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  |         env.Append(LIBPATH=[p for p in os.getenv("LIB").split(";")]) | 
					
						
							| 
									
										
										
										
											2017-06-30 19:21:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-12 18:44:06 +02:00
										 |  |  |     # Sanitizers | 
					
						
							|  |  |  |     if env["use_asan"]: | 
					
						
							| 
									
										
										
										
											2021-12-10 10:10:47 -06:00
										 |  |  |         env.extra_suffix += ".san" | 
					
						
							| 
									
										
										
										
											2021-03-12 18:44:06 +02:00
										 |  |  |         env.Append(LINKFLAGS=["/INFERASANLIBS"]) | 
					
						
							|  |  |  |         env.Append(CCFLAGS=["/fsanitize=address"]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  |     # Incremental linking fix | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |     env["BUILDERS"]["ProgramOriginal"] = env["BUILDERS"]["Program"] | 
					
						
							|  |  |  |     env["BUILDERS"]["Program"] = methods.precious_program | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     env.AppendUnique(LINKFLAGS=["/STACK:" + str(STACK_SIZE)]) | 
					
						
							| 
									
										
										
										
											2017-06-30 19:21:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-17 18:17:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  | def configure_mingw(env): | 
					
						
							|  |  |  |     # Workaround for MinGW. See: | 
					
						
							| 
									
										
										
										
											2021-08-21 20:56:25 -05:00
										 |  |  |     # https://www.scons.org/wiki/LongCmdLinesOnWin32 | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  |     env.use_windows_spawn_fix() | 
					
						
							| 
									
										
										
										
											2016-10-30 18:44:57 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  |     ## Build type | 
					
						
							| 
									
										
										
										
											2016-10-30 18:44:57 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |     if not env["use_llvm"] and not try_cmd("gcc --version", env["mingw_prefix"], env["arch"]): | 
					
						
							|  |  |  |         env["use_llvm"] = True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if env["use_llvm"] and not try_cmd("clang --version", env["mingw_prefix"], env["arch"]): | 
					
						
							|  |  |  |         env["use_llvm"] = False | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												SCons: Unify tools/target build type configuration
Implements https://github.com/godotengine/godot-proposals/issues/3371.
New `target` presets
====================
The `tools` option is removed and `target` changes to use three new presets,
which match the builds users are familiar with. These targets control the
default optimization level and enable editor-specific and debugging code:
- `editor`: Replaces `tools=yes target=release_debug`.
  * Defines: `TOOLS_ENABLED`, `DEBUG_ENABLED`, `-O2`/`/O2`
- `template_debug`: Replaces `tools=no target=release_debug`.
  * Defines: `DEBUG_ENABLED`, `-O2`/`/O2`
- `template_release`: Replaces `tools=no target=release`.
  * Defines: `-O3`/`/O2`
New `dev_build` option
======================
The previous `target=debug` is now replaced by a separate `dev_build=yes`
option, which can be used in combination with either of the three targets,
and changes the following:
- `dev_build`: Defines `DEV_ENABLED`, disables optimization (`-O0`/`/0d`),
  enables generating debug symbols, does not define `NDEBUG` so `assert()`
  works in thirdparty libraries, adds a `.dev` suffix to the binary name.
Note: Unlike previously, `dev_build` defaults to off so that users who
compile Godot from source get an optimized and small build by default.
Engine contributors should now set `dev_build=yes` in their build scripts or
IDE configuration manually.
Changed binary names
====================
The name of generated binaries and object files are changed too, to follow
this format:
`godot.<platform>.<target>[.dev][.double].<arch>[.<extra_suffix>][.<ext>]`
For example:
- `godot.linuxbsd.editor.dev.arm64`
- `godot.windows.template_release.double.x86_64.mono.exe`
Be sure to update your links/scripts/IDE config accordingly.
More flexible `optimize` and `debug_symbols` options
====================================================
The optimization level and whether to generate debug symbols can be further
specified with the `optimize` and `debug_symbols` options. So the default
values listed above for the various `target` and `dev_build` combinations
are indicative and can be replaced when compiling, e.g.:
`scons p=linuxbsd target=template_debug dev_build=yes optimize=debug`
will make a "debug" export template with dev-only code enabled, `-Og`
optimization level for GCC/Clang, and debug symbols. Perfect for debugging
complex crashes at runtime in an exported project.
											
										 
											2022-09-22 08:28:55 +02:00
										 |  |  |     # TODO: Re-evaluate the need for this / streamline with common config. | 
					
						
							|  |  |  |     if env["target"] == "template_release": | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |         env.Append(CCFLAGS=["-msse2"]) | 
					
						
							| 
									
										
											  
											
												SCons: Unify tools/target build type configuration
Implements https://github.com/godotengine/godot-proposals/issues/3371.
New `target` presets
====================
The `tools` option is removed and `target` changes to use three new presets,
which match the builds users are familiar with. These targets control the
default optimization level and enable editor-specific and debugging code:
- `editor`: Replaces `tools=yes target=release_debug`.
  * Defines: `TOOLS_ENABLED`, `DEBUG_ENABLED`, `-O2`/`/O2`
- `template_debug`: Replaces `tools=no target=release_debug`.
  * Defines: `DEBUG_ENABLED`, `-O2`/`/O2`
- `template_release`: Replaces `tools=no target=release`.
  * Defines: `-O3`/`/O2`
New `dev_build` option
======================
The previous `target=debug` is now replaced by a separate `dev_build=yes`
option, which can be used in combination with either of the three targets,
and changes the following:
- `dev_build`: Defines `DEV_ENABLED`, disables optimization (`-O0`/`/0d`),
  enables generating debug symbols, does not define `NDEBUG` so `assert()`
  works in thirdparty libraries, adds a `.dev` suffix to the binary name.
Note: Unlike previously, `dev_build` defaults to off so that users who
compile Godot from source get an optimized and small build by default.
Engine contributors should now set `dev_build=yes` in their build scripts or
IDE configuration manually.
Changed binary names
====================
The name of generated binaries and object files are changed too, to follow
this format:
`godot.<platform>.<target>[.dev][.double].<arch>[.<extra_suffix>][.<ext>]`
For example:
- `godot.linuxbsd.editor.dev.arm64`
- `godot.windows.template_release.double.x86_64.mono.exe`
Be sure to update your links/scripts/IDE config accordingly.
More flexible `optimize` and `debug_symbols` options
====================================================
The optimization level and whether to generate debug symbols can be further
specified with the `optimize` and `debug_symbols` options. So the default
values listed above for the various `target` and `dev_build` combinations
are indicative and can be replaced when compiling, e.g.:
`scons p=linuxbsd target=template_debug dev_build=yes optimize=debug`
will make a "debug" export template with dev-only code enabled, `-Og`
optimization level for GCC/Clang, and debug symbols. Perfect for debugging
complex crashes at runtime in an exported project.
											
										 
											2022-09-22 08:28:55 +02:00
										 |  |  |     elif env.dev_build: | 
					
						
							| 
									
										
										
										
											2021-11-18 10:38:28 +01:00
										 |  |  |         # Allow big objects. It's supposed not to have drawbacks but seems to break | 
					
						
							|  |  |  |         # GCC LTO, so enabling for debug builds only (which are not built with LTO | 
					
						
							|  |  |  |         # and are the only ones with too big objects). | 
					
						
							|  |  |  |         env.Append(CCFLAGS=["-Wa,-mbig-obj"]) | 
					
						
							| 
									
										
										
										
											2017-06-30 19:21:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-17 19:07:12 +03:00
										 |  |  |     if env["windows_subsystem"] == "gui": | 
					
						
							|  |  |  |         env.Append(LINKFLAGS=["-Wl,--subsystem,windows"]) | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         env.Append(LINKFLAGS=["-Wl,--subsystem,console"]) | 
					
						
							| 
									
										
										
										
											2020-09-14 19:56:41 +02:00
										 |  |  |         env.AppendUnique(CPPDEFINES=["WINDOWS_SUBSYSTEM_CONSOLE"]) | 
					
						
							| 
									
										
										
										
											2020-08-17 19:07:12 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  |     ## Compiler configuration | 
					
						
							| 
									
										
										
										
											2017-06-30 19:21:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-07 10:41:45 +01:00
										 |  |  |     if os.name != "nt": | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  |         env["PROGSUFFIX"] = env["PROGSUFFIX"] + ".exe"  # for linux cross-compilation | 
					
						
							| 
									
										
										
										
											2017-09-13 19:32:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-15 17:38:10 -08:00
										 |  |  |     if env["arch"] == "x86_32": | 
					
						
							| 
									
										
										
										
											2020-11-26 23:19:23 +02:00
										 |  |  |         if env["use_static_cpp"]: | 
					
						
							|  |  |  |             env.Append(LINKFLAGS=["-static"]) | 
					
						
							|  |  |  |             env.Append(LINKFLAGS=["-static-libgcc"]) | 
					
						
							|  |  |  |             env.Append(LINKFLAGS=["-static-libstdc++"]) | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  |     else: | 
					
						
							| 
									
										
										
										
											2020-11-26 23:19:23 +02:00
										 |  |  |         if env["use_static_cpp"]: | 
					
						
							|  |  |  |             env.Append(LINKFLAGS=["-static"]) | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if env["arch"] in ["x86_32", "x86_64"]: | 
					
						
							|  |  |  |         env["x86_libtheora_opt_gcc"] = True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     mingw_bin_prefix = get_mingw_bin_prefix(env["mingw_prefix"], env["arch"]) | 
					
						
							| 
									
										
										
										
											2017-06-30 19:21:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |     if env["use_llvm"]: | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |         env["CC"] = mingw_bin_prefix + "clang" | 
					
						
							|  |  |  |         env["CXX"] = mingw_bin_prefix + "clang++" | 
					
						
							|  |  |  |         if try_cmd("as --version", env["mingw_prefix"], env["arch"]): | 
					
						
							|  |  |  |             env["AS"] = mingw_bin_prefix + "as" | 
					
						
							|  |  |  |         if try_cmd("ar --version", env["mingw_prefix"], env["arch"]): | 
					
						
							|  |  |  |             env["AR"] = mingw_bin_prefix + "ar" | 
					
						
							|  |  |  |         if try_cmd("ranlib --version", env["mingw_prefix"], env["arch"]): | 
					
						
							|  |  |  |             env["RANLIB"] = mingw_bin_prefix + "ranlib" | 
					
						
							|  |  |  |         env.extra_suffix = ".llvm" + env.extra_suffix | 
					
						
							| 
									
										
										
										
											2019-10-22 12:47:12 +03:00
										 |  |  |     else: | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |         env["CC"] = mingw_bin_prefix + "gcc" | 
					
						
							|  |  |  |         env["CXX"] = mingw_bin_prefix + "g++" | 
					
						
							|  |  |  |         if try_cmd("as --version", env["mingw_prefix"], env["arch"]): | 
					
						
							|  |  |  |             env["AS"] = mingw_bin_prefix + "as" | 
					
						
							|  |  |  |         if try_cmd("gcc-ar --version", env["mingw_prefix"], env["arch"]): | 
					
						
							|  |  |  |             env["AR"] = mingw_bin_prefix + "gcc-ar" | 
					
						
							|  |  |  |         if try_cmd("gcc-ranlib --version", env["mingw_prefix"], env["arch"]): | 
					
						
							|  |  |  |             env["RANLIB"] = mingw_bin_prefix + "gcc-ranlib" | 
					
						
							| 
									
										
										
										
											2015-10-01 16:25:36 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-13 17:01:47 +02:00
										 |  |  |     ## LTO | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if env["lto"] == "auto":  # Full LTO for production with MinGW. | 
					
						
							|  |  |  |         env["lto"] = "full" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-21 15:15:54 +02:00
										 |  |  |     if env["lto"] != "none": | 
					
						
							|  |  |  |         if env["lto"] == "thin": | 
					
						
							|  |  |  |             if not env["use_llvm"]: | 
					
						
							|  |  |  |                 print("ThinLTO is only compatible with LLVM, use `use_llvm=yes` or `lto=full`.") | 
					
						
							|  |  |  |                 sys.exit(255) | 
					
						
							|  |  |  |             env.Append(CCFLAGS=["-flto=thin"]) | 
					
						
							|  |  |  |             env.Append(LINKFLAGS=["-flto=thin"]) | 
					
						
							|  |  |  |         elif not env["use_llvm"] and env.GetOption("num_jobs") > 1: | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |             env.Append(CCFLAGS=["-flto"]) | 
					
						
							|  |  |  |             env.Append(LINKFLAGS=["-flto=" + str(env.GetOption("num_jobs"))]) | 
					
						
							| 
									
										
										
										
											2019-10-22 12:47:12 +03:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2022-07-21 15:15:54 +02:00
										 |  |  |             env.Append(CCFLAGS=["-flto"]) | 
					
						
							|  |  |  |             env.Append(LINKFLAGS=["-flto"]) | 
					
						
							| 
									
										
										
										
											2017-09-13 22:36:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |     env.Append(LINKFLAGS=["-Wl,--stack," + str(STACK_SIZE)]) | 
					
						
							| 
									
										
										
										
											2015-10-01 16:25:36 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  |     ## Compile flags | 
					
						
							| 
									
										
										
										
											2015-10-01 16:25:36 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |     if not env["use_llvm"]: | 
					
						
							|  |  |  |         env.Append(CCFLAGS=["-mwindows"]) | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     env.Append(CPPDEFINES=["WINDOWS_ENABLED", "WASAPI_ENABLED", "WINMIDI_ENABLED"]) | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |     env.Append( | 
					
						
							|  |  |  |         CPPDEFINES=[ | 
					
						
							|  |  |  |             ("WINVER", env["target_win_version"]), | 
					
						
							|  |  |  |             ("_WIN32_WINNT", env["target_win_version"]), | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |     env.Append( | 
					
						
							|  |  |  |         LIBS=[ | 
					
						
							|  |  |  |             "mingw32", | 
					
						
							|  |  |  |             "dsound", | 
					
						
							|  |  |  |             "ole32", | 
					
						
							|  |  |  |             "d3d9", | 
					
						
							|  |  |  |             "winmm", | 
					
						
							|  |  |  |             "gdi32", | 
					
						
							|  |  |  |             "iphlpapi", | 
					
						
							|  |  |  |             "shlwapi", | 
					
						
							|  |  |  |             "wsock32", | 
					
						
							|  |  |  |             "ws2_32", | 
					
						
							|  |  |  |             "kernel32", | 
					
						
							|  |  |  |             "oleaut32", | 
					
						
							| 
									
										
										
										
											2021-11-04 14:33:37 +02:00
										 |  |  |             "sapi", | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |             "dinput8", | 
					
						
							|  |  |  |             "dxguid", | 
					
						
							|  |  |  |             "ksuser", | 
					
						
							|  |  |  |             "imm32", | 
					
						
							|  |  |  |             "bcrypt", | 
					
						
							|  |  |  |             "avrt", | 
					
						
							|  |  |  |             "uuid", | 
					
						
							|  |  |  |             "dwmapi", | 
					
						
							| 
									
										
										
										
											2022-07-08 15:38:30 +03:00
										 |  |  |             "dwrite", | 
					
						
							| 
									
										
										
										
											2022-10-11 12:39:41 +02:00
										 |  |  |             "wbemuuid", | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |         ] | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-25 22:20:54 +03:00
										 |  |  |     if env["vulkan"]: | 
					
						
							|  |  |  |         env.Append(CPPDEFINES=["VULKAN_ENABLED"]) | 
					
						
							|  |  |  |         if not env["use_volk"]: | 
					
						
							|  |  |  |             env.Append(LIBS=["vulkan"]) | 
					
						
							| 
									
										
										
										
											2019-08-05 11:48:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-25 22:20:54 +03:00
										 |  |  |     if env["opengl3"]: | 
					
						
							|  |  |  |         env.Append(CPPDEFINES=["GLES3_ENABLED"]) | 
					
						
							|  |  |  |         env.Append(LIBS=["opengl32"]) | 
					
						
							| 
									
										
										
										
											2015-10-01 16:25:36 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |     env.Append(CPPDEFINES=["MINGW_ENABLED", ("MINGW_HAS_SECURE_API", 1)]) | 
					
						
							| 
									
										
										
										
											2017-09-23 22:55:26 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  |     # resrc | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |     env.Append(BUILDERS={"RES": env.Builder(action=build_res_file, suffix=".o", src_suffix=".rc")}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-14 08:59:46 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-23 22:21:46 +09:00
										 |  |  | def configure(env: "Environment"): | 
					
						
							| 
									
										
										
										
											2021-12-15 17:38:10 -08:00
										 |  |  |     # Validate arch. | 
					
						
							|  |  |  |     supported_arches = ["x86_32", "x86_64", "arm32", "arm64"] | 
					
						
							|  |  |  |     if env["arch"] not in supported_arches: | 
					
						
							|  |  |  |         print( | 
					
						
							|  |  |  |             'Unsupported CPU architecture "%s" for Windows. Supported architectures are: %s.' | 
					
						
							|  |  |  |             % (env["arch"], ", ".join(supported_arches)) | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         sys.exit() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  |     # At this point the env has been set up with basic tools/compilers. | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |     env.Prepend(CPPPATH=["#platform/windows"]) | 
					
						
							| 
									
										
										
										
											2015-10-01 16:25:36 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |     if os.name == "nt": | 
					
						
							|  |  |  |         env["ENV"] = os.environ  # this makes build less repeatable, but simplifies some things | 
					
						
							|  |  |  |         env["ENV"]["TMP"] = os.environ["TMP"] | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # First figure out which compiler, version, and target arch we're using | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |     if os.getenv("VCINSTALLDIR") and detect_build_env_arch() and not env["use_mingw"]: | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  |         setup_msvc_manual(env) | 
					
						
							|  |  |  |         env.msvc = True | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |         vcvars_msvc_config = True | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |     elif env.get("MSVC_VERSION", "") and not env["use_mingw"]: | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  |         setup_msvc_auto(env) | 
					
						
							|  |  |  |         env.msvc = True | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |         vcvars_msvc_config = False | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  |     else: | 
					
						
							|  |  |  |         setup_mingw(env) | 
					
						
							|  |  |  |         env.msvc = False | 
					
						
							| 
									
										
										
										
											2015-10-01 16:25:36 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  |     # Now set compiler/linker flags | 
					
						
							|  |  |  |     if env.msvc: | 
					
						
							| 
									
										
										
										
											2022-08-26 12:55:23 +03:00
										 |  |  |         configure_msvc(env, vcvars_msvc_config) | 
					
						
							| 
									
										
										
										
											2015-10-01 16:25:36 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |     else:  # MinGW | 
					
						
							| 
									
										
										
										
											2018-03-02 14:51:29 -05:00
										 |  |  |         configure_mingw(env) |