From 817b89767aa31b3b2847203b27151044f5d323f6 Mon Sep 17 00:00:00 2001 From: Mary-nyan <mary@mary.zone> Date: Thu, 1 Dec 2022 14:08:43 +0100 Subject: [PATCH] infra: Add distribution files for macOS (#3934) This upstream macOS packing and distribution files --- distribution/macos/Info.plist | 46 ++ distribution/macos/Ryujinx.icns | Bin 0 -> 108982 bytes distribution/macos/bundle_fix_up.py | 609 ++++++++++++++++++ .../macos/construct_universal_dylib.py | 95 +++ distribution/macos/create_app_bundle.sh | 51 ++ distribution/macos/create_macos_release.sh | 105 +++ distribution/macos/entitlements.xml | 23 + distribution/misc/add_tar_exec.py | 24 + 8 files changed, 953 insertions(+) create mode 100644 distribution/macos/Info.plist create mode 100644 distribution/macos/Ryujinx.icns create mode 100644 distribution/macos/bundle_fix_up.py create mode 100644 distribution/macos/construct_universal_dylib.py create mode 100755 distribution/macos/create_app_bundle.sh create mode 100755 distribution/macos/create_macos_release.sh create mode 100644 distribution/macos/entitlements.xml create mode 100644 distribution/misc/add_tar_exec.py diff --git a/distribution/macos/Info.plist b/distribution/macos/Info.plist new file mode 100644 index 000000000..c3e1e08e4 --- /dev/null +++ b/distribution/macos/Info.plist @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>Ryujinx</string> + <key>CFBundleGetInfoString</key> + <string>Ryujinx</string> + <key>CFBundleIconFile</key> + <string>Ryujinx.icns</string> + <key>CFBundleTypeExtensions</key> + <array> + <string>nca</string> + <string>nro</string> + <string>nso</string> + <string>nsp</string> + <string>xci</string> + </array> + <key>CFBundleIdentifier</key> + <string>org.ryujinx.Ryujinx</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleLongVersionString</key> + <string>%%RYUJINX_BUILD_VERSION%%-%%RYUJINX_BUILD_GIT_HASH%%"</string> + <key>CFBundleName</key> + <string>Ryujinx</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string>1.1</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1.1.0</string> + <key>NSHighResolutionCapable</key> + <true/> + <key>CSResourcesFileMapped</key> + <true/> + <key>NSHumanReadableCopyright</key> + <string>Copyright © 2018 - 2022 Ryujinx Team and Contributors.</string> + <key>LSMinimumSystemVersion</key> + <string>11.0</string> +</dict> +</plist> diff --git a/distribution/macos/Ryujinx.icns b/distribution/macos/Ryujinx.icns new file mode 100644 index 0000000000000000000000000000000000000000..f54a9aeb7e4780b09c1bddb1ad8b7fcf4f9a0d3c GIT binary patch literal 108982 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 PL?iU)FyYtM-!uOYqBDDJ literal 0 HcmV?d00001 diff --git a/distribution/macos/bundle_fix_up.py b/distribution/macos/bundle_fix_up.py new file mode 100644 index 000000000..a8e3ac760 --- /dev/null +++ b/distribution/macos/bundle_fix_up.py @@ -0,0 +1,609 @@ +import argparse +import hashlib +import os +from pathlib import Path +import platform +import shutil +import struct +import subprocess +from typing import List, Optional, Tuple + +parser = argparse.ArgumentParser(description="Fixup for MacOS application bundle") +parser.add_argument("input_directory", help="Input directory (Application path)") +parser.add_argument("executable_sub_path", help="Main executable sub path") + +# Use Apple LLVM on Darwin, otherwise standard LLVM. +if platform.system() == "Darwin": + OTOOL = "otool" + INSTALL_NAME_TOOL = "install_name_tool" +else: + OTOOL = shutil.which("llvm-otool") + if OTOOL is None: + for llvm_ver in [15, 14, 13]: + otool_path = shutil.which(f"llvm-otool-{llvm_ver}") + if otool_path is not None: + OTOOL = otool_path + INSTALL_NAME_TOOL = shutil.which(f"llvm-install-name-tool-{llvm_ver}") + break + else: + INSTALL_NAME_TOOL = shutil.which("llvm-install-name-tool") + + +args = parser.parse_args() + + +def get_dylib_id(dylib_path: Path) -> str: + res = subprocess.check_output([OTOOL, "-D", str(dylib_path.absolute())]).decode( + "utf-8" + ) + + return res.split("\n")[1] + + +def get_dylib_dependencies(dylib_path: Path) -> List[str]: + output = ( + subprocess.check_output([OTOOL, "-L", str(dylib_path.absolute())]) + .decode("utf-8") + .split("\n")[1:] + ) + + res = [] + + for line in output: + line = line.strip() + index = line.find(" (compatibility version ") + if index == -1: + continue + + line = line[:index] + + res.append(line) + + return res + + +def replace_dylib_id(dylib_path: Path, new_id: str): + subprocess.check_call( + [INSTALL_NAME_TOOL, "-id", new_id, str(dylib_path.absolute())] + ) + + +def change_dylib_link(dylib_path: Path, old: str, new: str): + subprocess.check_call( + [INSTALL_NAME_TOOL, "-change", old, new, str(dylib_path.absolute())] + ) + + +def add_dylib_rpath(dylib_path: Path, rpath: str): + subprocess.check_call( + [INSTALL_NAME_TOOL, "-add_rpath", rpath, str(dylib_path.absolute())] + ) + + +def fixup_dylib( + dylib_path: Path, + replacement_path: str, + search_path: List[str], + content_directory: Path, +): + dylib_id = get_dylib_id(dylib_path) + new_dylib_id = replacement_path + "/" + os.path.basename(dylib_id) + replace_dylib_id(dylib_path, new_dylib_id) + + dylib_dependencies = get_dylib_dependencies(dylib_path) + dylib_new_mapping = {} + + for dylib_dependency in dylib_dependencies: + if ( + not dylib_dependency.startswith("@executable_path") + and not dylib_dependency.startswith("/usr/lib") + and not dylib_dependency.startswith("/System/Library") + ): + dylib_dependency_name = os.path.basename(dylib_dependency) + library_found = False + for library_base_path in search_path: + lib_path = Path(os.path.join(library_base_path, dylib_dependency_name)) + + if lib_path.exists(): + target_replacement_path = get_path_related_to_target_exec( + content_directory, lib_path + ) + + dylib_new_mapping[dylib_dependency] = ( + target_replacement_path + + "/" + + os.path.basename(dylib_dependency) + ) + library_found = True + + if not library_found: + raise Exception( + f"{dylib_id}: Cannot find dependency {dylib_dependency_name} for fixup" + ) + + for key in dylib_new_mapping: + change_dylib_link(dylib_path, key, dylib_new_mapping[key]) + + +FILE_TYPE_ASSEMBLY = 1 + +ALIGN_REQUIREMENTS = 4096 + + +def parse_embedded_string(data: bytes) -> Tuple[bytes, str]: + first_byte = data[0] + + if (first_byte & 0x80) == 0: + size = first_byte + data = data[1:] + else: + second_byte = data[1] + + assert (second_byte & 0x80) == 0 + + size = (second_byte << 7) | (first_byte & 0x7F) + + data = data[2:] + + res = data[:size].decode("utf-8") + data = data[size:] + + return (data, res) + + +def write_embedded_string(file, string: str): + raw_str = string.encode("utf-8") + raw_str_len = len(raw_str) + + assert raw_str_len < 0x7FFF + + if raw_str_len > 0x7F: + file.write(struct.pack("b", raw_str_len & 0x7F | 0x80)) + file.write(struct.pack("b", raw_str_len >> 7)) + else: + file.write(struct.pack("b", raw_str_len)) + + file.write(raw_str) + + +class BundleFileEntry(object): + offset: int + size: int + compressed_size: int + file_type: int + relative_path: str + data: bytes + + def __init__( + self, + offset: int, + size: int, + compressed_size: int, + file_type: int, + relative_path: str, + data: bytes, + ) -> None: + self.offset = offset + self.size = size + self.compressed_size = compressed_size + self.file_type = file_type + self.relative_path = relative_path + self.data = data + + def write(self, file): + self.offset = file.tell() + + if ( + self.file_type == FILE_TYPE_ASSEMBLY + and (self.offset % ALIGN_REQUIREMENTS) != 0 + ): + padding_size = ALIGN_REQUIREMENTS - (self.offset % ALIGN_REQUIREMENTS) + file.write(b"\0" * padding_size) + self.offset += padding_size + + file.write(self.data) + + def write_header(self, file): + file.write( + struct.pack( + "QQQb", self.offset, self.size, self.compressed_size, self.file_type + ) + ) + write_embedded_string(file, self.relative_path) + + +class BundleManifest(object): + major: int + minor: int + bundle_id: str + deps_json: BundleFileEntry + runtimeconfig_json: BundleFileEntry + flags: int + files: List[BundleFileEntry] + + def __init__( + self, + major: int, + minor: int, + bundle_id: str, + deps_json: BundleFileEntry, + runtimeconfig_json: BundleFileEntry, + flags: int, + files: List[BundleFileEntry], + ) -> None: + self.major = major + self.minor = minor + self.bundle_id = bundle_id + self.deps_json = deps_json + self.runtimeconfig_json = runtimeconfig_json + self.flags = flags + self.files = files + + def write(self, file) -> int: + for bundle_file in self.files: + bundle_file.write(file) + + bundle_header_offset = file.tell() + file.write(struct.pack("iiI", self.major, self.minor, len(self.files))) + write_embedded_string(file, self.bundle_id) + + if self.deps_json is not None: + deps_json_location_offset = self.deps_json.offset + deps_json_location_size = self.deps_json.size + else: + deps_json_location_offset = 0 + deps_json_location_size = 0 + + if self.runtimeconfig_json is not None: + runtimeconfig_json_location_offset = self.runtimeconfig_json.offset + runtimeconfig_json_location_size = self.runtimeconfig_json.size + else: + runtimeconfig_json_location_offset = 0 + runtimeconfig_json_location_size = 0 + + file.write( + struct.pack("qq", deps_json_location_offset, deps_json_location_size) + ) + file.write( + struct.pack( + "qq", + runtimeconfig_json_location_offset, + runtimeconfig_json_location_size, + ) + ) + file.write(struct.pack("q", self.flags)) + + for bundle_file in self.files: + bundle_file.write_header(file) + + return bundle_header_offset + + +def read_file_entry( + raw_data: bytes, header_bytes: bytes +) -> Tuple[bytes, BundleFileEntry]: + ( + offset, + size, + compressed_size, + file_type, + ) = struct.unpack("QQQb", header_bytes[:0x19]) + (header_bytes, relative_path) = parse_embedded_string(header_bytes[0x19:]) + + target_size = compressed_size + + if target_size == 0: + target_size = size + + return ( + header_bytes, + BundleFileEntry( + offset, + size, + compressed_size, + file_type, + relative_path, + raw_data[offset : offset + target_size], + ), + ) + + +def get_dotnet_bundle_data(data: bytes) -> Optional[Tuple[int, int, BundleManifest]]: + offset = data.find(hashlib.sha256(b".net core bundle\n").digest()) + + if offset == -1: + return None + + raw_header_offset = data[offset - 8 : offset] + (header_offset,) = struct.unpack("q", raw_header_offset) + header_bytes = data[header_offset:] + + ( + major, + minor, + files_count, + ) = struct.unpack("iiI", header_bytes[:0xC]) + header_bytes = header_bytes[0xC:] + + (header_bytes, bundle_id) = parse_embedded_string(header_bytes) + + # v2 header + ( + deps_json_location_offset, + deps_json_location_size, + ) = struct.unpack("qq", header_bytes[:0x10]) + ( + runtimeconfig_json_location_offset, + runtimeconfig_json_location_size, + ) = struct.unpack("qq", header_bytes[0x10:0x20]) + (flags,) = struct.unpack("q", header_bytes[0x20:0x28]) + header_bytes = header_bytes[0x28:] + + files = [] + + deps_json = None + runtimeconfig_json = None + + for _ in range(files_count): + (header_bytes, file_entry) = read_file_entry(data, header_bytes) + + files.append(file_entry) + + if file_entry.offset == deps_json_location_offset: + deps_json = file_entry + elif file_entry.offset == runtimeconfig_json_location_offset: + runtimeconfig_json = file_entry + + file_entry = files[0] + + return ( + file_entry.offset, + header_offset, + BundleManifest( + major, minor, bundle_id, deps_json, runtimeconfig_json, flags, files + ), + ) + + +LC_SYMTAB = 0x2 +LC_SEGMENT_64 = 0x19 +LC_CODE_SIGNATURE = 0x1D + + +def fixup_linkedit(file, data: bytes, new_size: int): + offset = 0 + + ( + macho_magic, + macho_cputype, + macho_cpusubtype, + macho_filetype, + macho_ncmds, + macho_sizeofcmds, + macho_flags, + macho_reserved, + ) = struct.unpack("IiiIIIII", data[offset : offset + 0x20]) + + offset += 0x20 + + linkedit_offset = None + symtab_offset = None + codesign_offset = None + + for _ in range(macho_ncmds): + (cmd, cmdsize) = struct.unpack("II", data[offset : offset + 8]) + + if cmd == LC_SEGMENT_64: + ( + cmd, + cmdsize, + segname_raw, + vmaddr, + vmsize, + fileoff, + filesize, + maxprot, + initprot, + nsects, + flags, + ) = struct.unpack("II16sQQQQiiII", data[offset : offset + 72]) + segname = segname_raw.decode("utf-8").split("\0")[0] + + if segname == "__LINKEDIT": + linkedit_offset = offset + elif cmd == LC_SYMTAB: + symtab_offset = offset + elif cmd == LC_CODE_SIGNATURE: + codesign_offset = offset + + offset += cmdsize + pass + + assert linkedit_offset is not None and symtab_offset is not None + + # If there is a codesign section, clean it up. + if codesign_offset is not None: + ( + codesign_cmd, + codesign_cmdsize, + codesign_dataoff, + codesign_datasize, + ) = struct.unpack("IIII", data[codesign_offset : codesign_offset + 16]) + file.seek(codesign_offset) + file.write(b"\0" * codesign_cmdsize) + + macho_ncmds -= 1 + macho_sizeofcmds -= codesign_cmdsize + file.seek(0) + file.write( + struct.pack( + "IiiIIIII", + macho_magic, + macho_cputype, + macho_cpusubtype, + macho_filetype, + macho_ncmds, + macho_sizeofcmds, + macho_flags, + macho_reserved, + ) + ) + + file.seek(codesign_dataoff) + file.write(b"\0" * codesign_datasize) + + ( + symtab_cmd, + symtab_cmdsize, + symtab_symoff, + symtab_nsyms, + symtab_stroff, + symtab_strsize, + ) = struct.unpack("IIIIII", data[symtab_offset : symtab_offset + 24]) + + symtab_strsize = new_size - symtab_stroff + + new_symtab = struct.pack( + "IIIIII", + symtab_cmd, + symtab_cmdsize, + symtab_symoff, + symtab_nsyms, + symtab_stroff, + symtab_strsize, + ) + + file.seek(symtab_offset) + file.write(new_symtab) + + ( + linkedit_cmd, + linkedit_cmdsize, + linkedit_segname_raw, + linkedit_vmaddr, + linkedit_vmsize, + linkedit_fileoff, + linkedit_filesize, + linkedit_maxprot, + linkedit_initprot, + linkedit_nsects, + linkedit_flags, + ) = struct.unpack("II16sQQQQiiII", data[linkedit_offset : linkedit_offset + 72]) + + linkedit_filesize = new_size - linkedit_fileoff + linkedit_vmsize = linkedit_filesize + + new_linkedit = struct.pack( + "II16sQQQQiiII", + linkedit_cmd, + linkedit_cmdsize, + linkedit_segname_raw, + linkedit_vmaddr, + linkedit_vmsize, + linkedit_fileoff, + linkedit_filesize, + linkedit_maxprot, + linkedit_initprot, + linkedit_nsects, + linkedit_flags, + ) + file.seek(linkedit_offset) + file.write(new_linkedit) + + +def write_bundle_data( + output, + old_bundle_base_offset: int, + new_bundle_base_offset: int, + bundle: BundleManifest, +) -> int: + # Write bundle data + bundle_header_offset = bundle.write(output) + total_size = output.tell() + + # Patch the header position + offset = file_data.find(hashlib.sha256(b".net core bundle\n").digest()) + output.seek(offset - 8) + output.write(struct.pack("q", bundle_header_offset)) + + return total_size - new_bundle_base_offset + + +input_directory: Path = Path(args.input_directory) +content_directory: Path = Path(os.path.join(args.input_directory, "Contents")) +executable_path: Path = Path(os.path.join(content_directory, args.executable_sub_path)) + + +def get_path_related_to_other_path(a: Path, b: Path) -> str: + temp = b + + parts = [] + + while temp != a: + temp = temp.parent + parts.append(temp.name) + + parts.remove(parts[-1]) + parts.reverse() + + return "/".join(parts) + + +def get_path_related_to_target_exec(input_directory: Path, path: Path): + return "@executable_path/../" + get_path_related_to_other_path( + input_directory, path + ) + + +search_path = [ + Path(os.path.join(content_directory, "Frameworks")), + Path(os.path.join(content_directory, "Resources/lib")), +] + + +for path in content_directory.rglob("**/*.dylib"): + current_search_path = [path.parent] + current_search_path.extend(search_path) + + fixup_dylib( + path, + get_path_related_to_target_exec(content_directory, path), + current_search_path, + content_directory, + ) + +for path in content_directory.rglob("**/*.so"): + current_search_path = [path.parent] + current_search_path.extend(search_path) + + fixup_dylib( + path, + get_path_related_to_target_exec(content_directory, path), + current_search_path, + content_directory, + ) + + +with open(executable_path, "rb") as input: + file_data = input.read() + + +(bundle_base_offset, bundle_header_offset, bundle) = get_dotnet_bundle_data(file_data) + +add_dylib_rpath(executable_path, "@executable_path/../Frameworks/") + +# Recent "vanilla" version of LLVM (LLVM 13 and upper) seems to really dislike how .NET package its assemblies. +# As a result, after execution of install_name_tool it will have "fixed" the symtab resulting in a missing .NET bundle... +# To mitigate that, we check if the bundle offset inside the binary is valid after install_name_tool and readd .NET bundle if not. +output_file_size = os.stat(executable_path).st_size +if output_file_size < bundle_header_offset: + print("LLVM broke the .NET bundle, readding bundle data...") + with open(executable_path, "r+b") as output: + file_data = output.read() + bundle_data_size = write_bundle_data( + output, bundle_base_offset, output_file_size, bundle + ) + + # Now patch the __LINKEDIT section + new_size = output_file_size + bundle_data_size + fixup_linkedit(output, file_data, new_size) diff --git a/distribution/macos/construct_universal_dylib.py b/distribution/macos/construct_universal_dylib.py new file mode 100644 index 000000000..b6c3770c6 --- /dev/null +++ b/distribution/macos/construct_universal_dylib.py @@ -0,0 +1,95 @@ +import argparse +import os +from pathlib import Path +import platform +import shutil +import subprocess + +parser = argparse.ArgumentParser( + description="Construct Universal dylibs for nuget package" +) +parser.add_argument( + "arm64_input_directory", help="ARM64 Input directory containing dylibs" +) +parser.add_argument( + "x86_64_input_directory", help="x86_64 Input directory containing dylibs" +) +parser.add_argument("output_directory", help="Output directory") +parser.add_argument("rglob", help="rglob") + +args = parser.parse_args() + +# Use Apple LLVM on Darwin, otherwise standard LLVM. +if platform.system() == "Darwin": + LIPO = "lipo" +else: + LIPO = shutil.which("llvm-lipo") + + if LIPO is None: + for llvm_ver in [15, 14, 13]: + lipo_path = shutil.which(f"llvm-lipo-{llvm_ver}") + if lipo_path is not None: + LIPO = lipo_path + break + +if LIPO is None: + raise Exception("Cannot find a valid location for LLVM lipo!") + +arm64_input_directory: Path = Path(args.arm64_input_directory) +x86_64_input_directory: Path = Path(args.x86_64_input_directory) +output_directory: Path = Path(args.output_directory) +rglob = args.rglob + + +def get_new_name( + input_directory: Path, output_directory: str, input_dylib_path: Path +) -> Path: + input_component = str(input_dylib_path).replace(str(input_directory), "")[1:] + return Path(os.path.join(output_directory, input_component)) + + +def is_fat_file(dylib_path: Path) -> str: + res = subprocess.check_output([LIPO, "-info", str(dylib_path.absolute())]).decode( + "utf-8" + ) + + return not res.split("\n")[0].startswith("Non-fat file") + + +def construct_universal_dylib( + arm64_input_dylib_path: Path, x86_64_input_dylib_path: Path, output_dylib_path: Path +): + if output_dylib_path.exists() or output_dylib_path.is_symlink(): + os.remove(output_dylib_path) + + os.makedirs(output_dylib_path.parent, exist_ok=True) + + if arm64_input_dylib_path.is_symlink(): + os.symlink( + os.path.basename(arm64_input_dylib_path.resolve()), output_dylib_path + ) + else: + if is_fat_file(arm64_input_dylib_path) or not x86_64_input_dylib_path.exists(): + with open(output_dylib_path, "wb") as dst: + with open(arm64_input_dylib_path, "rb") as src: + dst.write(src.read()) + else: + subprocess.check_call( + [ + LIPO, + str(arm64_input_dylib_path.absolute()), + str(x86_64_input_dylib_path.absolute()), + "-output", + str(output_dylib_path.absolute()), + "-create", + ] + ) + + +print(rglob) +for path in arm64_input_directory.rglob("**/*.dylib"): + construct_universal_dylib( + path, + get_new_name(arm64_input_directory, x86_64_input_directory, path), + get_new_name(arm64_input_directory, output_directory, path), + ) diff --git a/distribution/macos/create_app_bundle.sh b/distribution/macos/create_app_bundle.sh new file mode 100755 index 000000000..8076303cb --- /dev/null +++ b/distribution/macos/create_app_bundle.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +set -e + +PUBLISH_DIRECTORY=$1 +OUTPUT_DIRECTORY=$2 +ENTITLEMENTS_FILE_PATH=$3 + +APP_BUNDLE_DIRECTORY=$OUTPUT_DIRECTORY/Ryujinx.app + +rm -rf $APP_BUNDLE_DIRECTORY +mkdir -p $APP_BUNDLE_DIRECTORY/Contents +mkdir $APP_BUNDLE_DIRECTORY/Contents/Frameworks +mkdir $APP_BUNDLE_DIRECTORY/Contents/MacOS +mkdir $APP_BUNDLE_DIRECTORY/Contents/Resources + +# Copy executables first +cp $PUBLISH_DIRECTORY/Ryujinx.Ava $APP_BUNDLE_DIRECTORY/Contents/MacOS/Ryujinx +chmod u+x $APP_BUNDLE_DIRECTORY/Contents/MacOS/Ryujinx + +# Then all libraries +cp $PUBLISH_DIRECTORY/*.dylib $APP_BUNDLE_DIRECTORY/Contents/Frameworks + +# Then resources +cp Info.plist $APP_BUNDLE_DIRECTORY/Contents +cp Ryujinx.icns $APP_BUNDLE_DIRECTORY/Contents/Resources/Ryujinx.icns +cp -r $PUBLISH_DIRECTORY/THIRDPARTY.md $APP_BUNDLE_DIRECTORY/Contents/Resources + +echo -n "APPL????" > $APP_BUNDLE_DIRECTORY/Contents/PkgInfo + +# Fixup libraries and executable +python3 bundle_fix_up.py $APP_BUNDLE_DIRECTORY MacOS/Ryujinx + +# Now sign it +if ! [ -x "$(command -v codesign)" ]; +then + if ! [ -x "$(command -v rcodesign)" ]; + then + echo "Cannot find rcodesign on your system, please install rcodesign." + exit 1 + fi + + # NOTE: Currently require https://github.com/indygreg/apple-platform-rs/pull/44 to work on other OSes. + # cargo install --git "https://github.com/marysaka/apple-platform-rs" --branch "fix/adhoc-app-bundle" apple-codesign --bin "rcodesign" + echo "Usign rcodesign for ad-hoc signing" + rcodesign sign --entitlements-xml-path $ENTITLEMENTS_FILE_PATH $APP_BUNDLE_DIRECTORY +else + echo "Usign codesign for ad-hoc signing" + codesign --entitlements $ENTITLEMENTS_FILE_PATH -f --deep -s - $APP_BUNDLE_DIRECTORY +fi + diff --git a/distribution/macos/create_macos_release.sh b/distribution/macos/create_macos_release.sh new file mode 100755 index 000000000..545baf20e --- /dev/null +++ b/distribution/macos/create_macos_release.sh @@ -0,0 +1,105 @@ +#!/bin/bash + +set -e + +if [ "$#" -ne 6 ]; then + echo "usage <BASE_DIR> <TEMP_DIRECTORY> <OUTPUT_DIRECTORY> <ENTITLEMENTS_FILE_PATH> <VERSION> <SOURCE_REVISION_ID>" + exit 1 +fi + +mkdir -p $1 +mkdir -p $2 +mkdir -p $3 + +BASE_DIR=$(readlink -f $1) +TEMP_DIRECTORY=$(readlink -f $2) +OUTPUT_DIRECTORY=$(readlink -f $3) +ENTITLEMENTS_FILE_PATH=$(readlink -f $4) +VERSION=$5 +SOURCE_REVISION_ID=$6 + +RELEASE_TAR_FILE_NAME=Ryujinx-$VERSION-macos_universal.app.tar +ARM64_APP_BUNDLE=$TEMP_DIRECTORY/output_arm64/Ryujinx.app +X64_APP_BUNDLE=$TEMP_DIRECTORY/output_x64/Ryujinx.app +UNIVERSAL_APP_BUNDLE=$OUTPUT_DIRECTORY/Ryujinx.app +EXECUTABLE_SUB_PATH=Contents/MacOS/Ryujinx + +rm -rf $TEMP_DIRECTORY +mkdir -p $TEMP_DIRECTORY + +DOTNET_COMMON_ARGS="-p:DebugType=embedded -p:Version=$VERSION -p:SourceRevisionId=$SOURCE_REVISION_ID -p:ExtraDefineConstants=DISABLE_UPDATER --self-contained true" + +dotnet restore +dotnet build -c Release Ryujinx.Ava +dotnet publish -c Release -r osx-arm64 -o $TEMP_DIRECTORY/publish_arm64 $DOTNET_COMMON_ARGS Ryujinx.Ava +dotnet publish -c Release -r osx-x64 -o $TEMP_DIRECTORY/publish_x64 $DOTNET_COMMON_ARGS Ryujinx.Ava + +# Get ride of the support library for ARMeilleur for x64 (that's only for arm64) +rm -rf $TEMP_DIRECTORY/publish_x64/libarmeilleure-jitsupport.dylib + +# Get ride of libsoundio from arm64 builds as we don't have a arm64 variant +# TODO: remove this once done +rm -rf $TEMP_DIRECTORY/publish_arm64/libsoundio.dylib + +pushd $BASE_DIR/distribution/macos +./create_app_bundle.sh $TEMP_DIRECTORY/publish_x64 $TEMP_DIRECTORY/output_x64 $ENTITLEMENTS_FILE_PATH +./create_app_bundle.sh $TEMP_DIRECTORY/publish_arm64 $TEMP_DIRECTORY/output_arm64 $ENTITLEMENTS_FILE_PATH +popd + +rm -rf $UNIVERSAL_APP_BUNDLE +mkdir -p $OUTPUT_DIRECTORY + +# Let's copy one of the two different app bundle and remove the executable +cp -R $ARM64_APP_BUNDLE $UNIVERSAL_APP_BUNDLE +rm $UNIVERSAL_APP_BUNDLE/$EXECUTABLE_SUB_PATH + +# Make it libraries universal +python3 $BASE_DIR/distribution/macos/construct_universal_dylib.py $ARM64_APP_BUNDLE $X64_APP_BUNDLE $UNIVERSAL_APP_BUNDLE "**/*.dylib" + +if ! [ -x "$(command -v lipo)" ]; +then + if ! [ -x "$(command -v llvm-lipo-14)" ]; + then + LIPO=llvm-lipo + else + LIPO=llvm-lipo-14 + fi +else + LIPO=lipo +fi + +# Make it the executable universal +$LIPO $ARM64_APP_BUNDLE/$EXECUTABLE_SUB_PATH $X64_APP_BUNDLE/$EXECUTABLE_SUB_PATH -output $UNIVERSAL_APP_BUNDLE/$EXECUTABLE_SUB_PATH -create + +# Patch up the Info.plist to have appropriate version +sed -r -i.bck "s/\%\%RYUJINX_BUILD_VERSION\%\%/$VERSION/g;" $UNIVERSAL_APP_BUNDLE/Contents/Info.plist +sed -r -i.bck "s/\%\%RYUJINX_BUILD_GIT_HASH\%\%/$SOURCE_REVISION_ID/g;" $UNIVERSAL_APP_BUNDLE/Contents/Info.plist +rm $UNIVERSAL_APP_BUNDLE/Contents/Info.plist.bck + +# Now sign it +if ! [ -x "$(command -v codesign)" ]; +then + if ! [ -x "$(command -v rcodesign)" ]; + then + echo "Cannot find rcodesign on your system, please install rcodesign." + exit 1 + fi + + # NOTE: Currently require https://github.com/indygreg/apple-platform-rs/pull/44 to work on other OSes. + # cargo install --git "https://github.com/marysaka/apple-platform-rs" --branch "fix/adhoc-app-bundle" apple-codesign --bin "rcodesign" + echo "Usign rcodesign for ad-hoc signing" + rcodesign sign --entitlements-xml-path $ENTITLEMENTS_FILE_PATH $UNIVERSAL_APP_BUNDLE +else + echo "Usign codesign for ad-hoc signing" + codesign --entitlements $ENTITLEMENTS_FILE_PATH -f --deep -s - $UNIVERSAL_APP_BUNDLE +fi + +echo "Creating archive" +pushd $OUTPUT_DIRECTORY +tar --exclude "Ryujinx.app/Contents/MacOS/Ryujinx" -cvf $RELEASE_TAR_FILE_NAME Ryujinx.app 1> /dev/null +python3 $BASE_DIR/distribution/misc/add_tar_exec.py $RELEASE_TAR_FILE_NAME "Ryujinx.app/Contents/MacOS/Ryujinx" "Ryujinx.app/Contents/MacOS/Ryujinx" +gzip -9 < $RELEASE_TAR_FILE_NAME > $RELEASE_TAR_FILE_NAME.gz +rm $RELEASE_TAR_FILE_NAME +popd + +echo "Done" diff --git a/distribution/macos/entitlements.xml b/distribution/macos/entitlements.xml new file mode 100644 index 000000000..bf3185071 --- /dev/null +++ b/distribution/macos/entitlements.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" +"http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>com.apple.security.cs.allow-jit</key> + <true/> + <key>com.apple.security.cs.allow-unsigned-executable-memory</key> + <true/> + <key>com.apple.security.cs.allow-dyld-environment-variables</key> + <true/> + <key>com.apple.security.cs.disable-library-validation</key> + <true/> + <key>com.apple.security.cs.disable-executable-page-protection</key> + <true/> + <key>com.apple.security.cs.debugger</key> + <true/> + <key>com.apple.security.get-task-allow</key> + <true/> + <key>com.apple.security.hypervisor</key> + <true/> +</dict> +</plist> diff --git a/distribution/misc/add_tar_exec.py b/distribution/misc/add_tar_exec.py new file mode 100644 index 000000000..fe659c161 --- /dev/null +++ b/distribution/misc/add_tar_exec.py @@ -0,0 +1,24 @@ +import argparse +from io import BytesIO +import tarfile + +parser = argparse.ArgumentParser( + description="Add the main binary to a tar and force it to be executable" +) +parser.add_argument("input_tar_file", help="input tar file") +parser.add_argument("main_binary_path", help="Main executable path") +parser.add_argument("main_binary_tar_path", help="Main executable tar path") + +args = parser.parse_args() +input_tar_file = args.input_tar_file +main_binary_path = args.main_binary_path +main_binary_tar_path = args.main_binary_tar_path + +with open(main_binary_path, "rb") as f: + with tarfile.open(input_tar_file, "a") as tar: + data = f.read() + tar_info = tarfile.TarInfo(main_binary_tar_path) + tar_info.mode = 0o755 + tar_info.size = len(data) + + tar.addfile(tar_info, BytesIO(data))