#!/usr/bin/env python Import("env") import os, json from platform_methods import architectures, lipo, get_build_version import platform_macos_builders import subprocess import shutil def generate_bundle(target, source, env): bin_dir = Dir("#bin").abspath if env.editor_build: # Editor bundle. prefix = "godot." + env["platform"] + "." + env["target"] if env.dev_build: prefix += ".dev" if env["precision"] == "double": prefix += ".double" # Lipo editor executable. target_bin = lipo(bin_dir + "/" + prefix, env.extra_suffix) # Assemble .app bundle and update version info. app_dir = Dir("#bin/" + (prefix + env.extra_suffix).replace(".", "_") + ".app").abspath templ = Dir("#misc/dist/macos_tools.app").abspath if os.path.exists(app_dir): shutil.rmtree(app_dir) shutil.copytree(templ, app_dir, ignore=shutil.ignore_patterns("Contents/Info.plist")) if not os.path.isdir(app_dir + "/Contents/MacOS"): os.mkdir(app_dir + "/Contents/MacOS") if target_bin != "": shutil.copy(target_bin, app_dir + "/Contents/MacOS/Godot") version = get_build_version(False) short_version = get_build_version(True) with open(Dir("#misc/dist/macos").abspath + "/editor_info_plist.template", "rt") as fin: with open(app_dir + "/Contents/Info.plist", "wt", encoding="utf-8", newline="\n") as fout: for line in fin: line = line.replace("$version", version) line = line.replace("$short_version", short_version) fout.write(line) # Sign .app bundle. if env["bundle_sign_identity"] != "": sign_command = [ "codesign", "-s", env["bundle_sign_identity"], "--deep", "--force", "--options=runtime", "--entitlements", ] if env.dev_build: sign_command += [Dir("#misc/dist/macos").abspath + "/editor_debug.entitlements"] else: sign_command += [Dir("#misc/dist/macos").abspath + "/editor.entitlements"] sign_command += [app_dir] subprocess.run(sign_command) else: # Template bundle. app_prefix = "godot." + env["platform"] rel_prefix = "godot." + env["platform"] + "." + "template_release" dbg_prefix = "godot." + env["platform"] + "." + "template_debug" if env.dev_build: app_prefix += ".dev" rel_prefix += ".dev" dbg_prefix += ".dev" if env["precision"] == "double": app_prefix += ".double" rel_prefix += ".double" dbg_prefix += ".double" # Lipo template executables. rel_target_bin = lipo(bin_dir + "/" + rel_prefix, env.extra_suffix) dbg_target_bin = lipo(bin_dir + "/" + dbg_prefix, env.extra_suffix) # Assemble .app bundle. app_dir = Dir("#bin/macos_template.app").abspath templ = Dir("#misc/dist/macos_template.app").abspath if os.path.exists(app_dir): shutil.rmtree(app_dir) shutil.copytree(templ, app_dir) if not os.path.isdir(app_dir + "/Contents/MacOS"): os.mkdir(app_dir + "/Contents/MacOS") if rel_target_bin != "": shutil.copy(rel_target_bin, app_dir + "/Contents/MacOS/godot_macos_release.universal") if dbg_target_bin != "": shutil.copy(dbg_target_bin, app_dir + "/Contents/MacOS/godot_macos_debug.universal") # ZIP .app bundle. zip_dir = Dir("#bin/" + (app_prefix + env.extra_suffix).replace(".", "_")).abspath shutil.make_archive(zip_dir, "zip", root_dir=bin_dir, base_dir="macos_template.app") shutil.rmtree(app_dir) files = [ "os_macos.mm", "godot_application.mm", "godot_application_delegate.mm", "crash_handler_macos.mm", "macos_terminal_logger.mm", "display_server_macos.mm", "godot_button_view.mm", "godot_content_view.mm", "godot_status_item.mm", "godot_window_delegate.mm", "godot_window.mm", "key_mapping_macos.mm", "godot_main_macos.mm", "godot_menu_delegate.mm", "godot_menu_item.mm", "godot_open_save_delegate.mm", "native_menu_macos.mm", "dir_access_macos.mm", "tts_macos.mm", "joypad_macos.mm", "rendering_context_driver_vulkan_macos.mm", "gl_manager_macos_angle.mm", "gl_manager_macos_legacy.mm", ] prog = env.add_program("#bin/godot", files) if env["debug_symbols"] and env["separate_debug_symbols"]: env.AddPostAction(prog, env.Run(platform_macos_builders.make_debug_macos)) if env["generate_bundle"]: generate_bundle_command = env.Command("generate_bundle", [], generate_bundle) command = env.AlwaysBuild(generate_bundle_command) env.Depends(command, [prog])