mirror of
				https://github.com/godotengine/godot.git
				synced 2025-10-31 13:41:03 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			161 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import os
 | |
| import platform
 | |
| import subprocess
 | |
| import sys
 | |
| 
 | |
| import methods
 | |
| 
 | |
| # NOTE: The multiprocessing module is not compatible with SCons due to conflict on cPickle
 | |
| 
 | |
| 
 | |
| compatibility_platform_aliases = {
 | |
|     "osx": "macos",
 | |
|     "iphone": "ios",
 | |
|     "x11": "linuxbsd",
 | |
|     "javascript": "web",
 | |
| }
 | |
| 
 | |
| # CPU architecture options.
 | |
| architectures = ["x86_32", "x86_64", "arm32", "arm64", "rv64", "ppc32", "ppc64", "wasm32"]
 | |
| architecture_aliases = {
 | |
|     "x86": "x86_32",
 | |
|     "x64": "x86_64",
 | |
|     "amd64": "x86_64",
 | |
|     "armv7": "arm32",
 | |
|     "armv8": "arm64",
 | |
|     "arm64v8": "arm64",
 | |
|     "aarch64": "arm64",
 | |
|     "rv": "rv64",
 | |
|     "riscv": "rv64",
 | |
|     "riscv64": "rv64",
 | |
|     "ppcle": "ppc32",
 | |
|     "ppc": "ppc32",
 | |
|     "ppc64le": "ppc64",
 | |
| }
 | |
| 
 | |
| 
 | |
| def detect_arch():
 | |
|     host_machine = platform.machine().lower()
 | |
|     if host_machine in architectures:
 | |
|         return host_machine
 | |
|     elif host_machine in architecture_aliases.keys():
 | |
|         return architecture_aliases[host_machine]
 | |
|     elif "86" in host_machine:
 | |
|         # Catches x86, i386, i486, i586, i686, etc.
 | |
|         return "x86_32"
 | |
|     else:
 | |
|         methods.print_warning(f'Unsupported CPU architecture: "{host_machine}". Falling back to x86_64.')
 | |
|         return "x86_64"
 | |
| 
 | |
| 
 | |
| def validate_arch(arch, platform_name, supported_arches):
 | |
|     if arch not in supported_arches:
 | |
|         methods.print_error(
 | |
|             'Unsupported CPU architecture "%s" for %s. Supported architectures are: %s.'
 | |
|             % (arch, platform_name, ", ".join(supported_arches))
 | |
|         )
 | |
|         sys.exit(255)
 | |
| 
 | |
| 
 | |
| def get_build_version(short):
 | |
|     import version
 | |
| 
 | |
|     name = "custom_build"
 | |
|     if os.getenv("BUILD_NAME") is not None:
 | |
|         name = os.getenv("BUILD_NAME")
 | |
|     v = "%d.%d" % (version.major, version.minor)
 | |
|     if version.patch > 0:
 | |
|         v += ".%d" % version.patch
 | |
|     status = version.status
 | |
|     if not short:
 | |
|         if os.getenv("GODOT_VERSION_STATUS") is not None:
 | |
|             status = str(os.getenv("GODOT_VERSION_STATUS"))
 | |
|         v += ".%s.%s" % (status, name)
 | |
|     return v
 | |
| 
 | |
| 
 | |
| def lipo(prefix, suffix):
 | |
|     from pathlib import Path
 | |
| 
 | |
|     target_bin = ""
 | |
|     lipo_command = ["lipo", "-create"]
 | |
|     arch_found = 0
 | |
| 
 | |
|     for arch in architectures:
 | |
|         bin_name = prefix + "." + arch + suffix
 | |
|         if Path(bin_name).is_file():
 | |
|             target_bin = bin_name
 | |
|             lipo_command += [bin_name]
 | |
|             arch_found += 1
 | |
| 
 | |
|     if arch_found > 1:
 | |
|         target_bin = prefix + ".fat" + suffix
 | |
|         lipo_command += ["-output", target_bin]
 | |
|         subprocess.run(lipo_command)
 | |
| 
 | |
|     return target_bin
 | |
| 
 | |
| 
 | |
| def get_mvk_sdk_path(osname):
 | |
|     def int_or_zero(i):
 | |
|         try:
 | |
|             return int(i)
 | |
|         except (TypeError, ValueError):
 | |
|             return 0
 | |
| 
 | |
|     def ver_parse(a):
 | |
|         return [int_or_zero(i) for i in a.split(".")]
 | |
| 
 | |
|     dirname = os.path.expanduser("~/VulkanSDK")
 | |
|     if not os.path.exists(dirname):
 | |
|         return ""
 | |
| 
 | |
|     ver_min = ver_parse("1.3.231.0")
 | |
|     ver_num = ver_parse("0.0.0.0")
 | |
|     files = os.listdir(dirname)
 | |
|     lib_name_out = dirname
 | |
|     for file in files:
 | |
|         if os.path.isdir(os.path.join(dirname, file)):
 | |
|             ver_comp = ver_parse(file)
 | |
|             if ver_comp > ver_num and ver_comp >= ver_min:
 | |
|                 # Try new SDK location.
 | |
|                 lib_name = os.path.join(os.path.join(dirname, file), "macOS/lib/MoltenVK.xcframework/" + osname + "/")
 | |
|                 if os.path.isfile(os.path.join(lib_name, "libMoltenVK.a")):
 | |
|                     ver_num = ver_comp
 | |
|                     lib_name_out = os.path.join(os.path.join(dirname, file), "macOS/lib/MoltenVK.xcframework")
 | |
|                 else:
 | |
|                     # Try old SDK location.
 | |
|                     lib_name = os.path.join(
 | |
|                         os.path.join(dirname, file), "MoltenVK/MoltenVK.xcframework/" + osname + "/"
 | |
|                     )
 | |
|                     if os.path.isfile(os.path.join(lib_name, "libMoltenVK.a")):
 | |
|                         ver_num = ver_comp
 | |
|                         lib_name_out = os.path.join(os.path.join(dirname, file), "MoltenVK/MoltenVK.xcframework")
 | |
| 
 | |
|     return lib_name_out
 | |
| 
 | |
| 
 | |
| def detect_mvk(env, osname):
 | |
|     mvk_list = [
 | |
|         get_mvk_sdk_path(osname),
 | |
|         "/opt/homebrew/Frameworks/MoltenVK.xcframework",
 | |
|         "/usr/local/homebrew/Frameworks/MoltenVK.xcframework",
 | |
|         "/opt/local/Frameworks/MoltenVK.xcframework",
 | |
|     ]
 | |
|     if env["vulkan_sdk_path"] != "":
 | |
|         mvk_list.insert(0, os.path.expanduser(env["vulkan_sdk_path"]))
 | |
|         mvk_list.insert(
 | |
|             0,
 | |
|             os.path.join(os.path.expanduser(env["vulkan_sdk_path"]), "macOS/lib/MoltenVK.xcframework"),
 | |
|         )
 | |
|         mvk_list.insert(
 | |
|             0,
 | |
|             os.path.join(os.path.expanduser(env["vulkan_sdk_path"]), "MoltenVK/MoltenVK.xcframework"),
 | |
|         )
 | |
| 
 | |
|     for mvk_path in mvk_list:
 | |
|         if mvk_path and os.path.isfile(os.path.join(mvk_path, f"{osname}/libMoltenVK.a")):
 | |
|             print(f"MoltenVK found at: {mvk_path}")
 | |
|             return mvk_path
 | |
| 
 | |
|     return ""
 | 
