From e1bf42257988932b400cb30d705d08a6ff098ed5 Mon Sep 17 00:00:00 2001 From: GreemDev Date: Wed, 19 Nov 2025 02:54:28 -0600 Subject: [PATCH] Remove universal app bundle and instead just create an ARM64-only adhoc codesigned macOS build. --- .../macos/construct_universal_dylib.py | 95 ------------------- distribution/macos/create_app_bundle.sh | 2 +- distribution/macos/create_macos_build_ava.sh | 51 +++------- 3 files changed, 14 insertions(+), 134 deletions(-) delete mode 100644 distribution/macos/construct_universal_dylib.py diff --git a/distribution/macos/construct_universal_dylib.py b/distribution/macos/construct_universal_dylib.py deleted file mode 100644 index 5d9321860..000000000 --- a/distribution/macos/construct_universal_dylib.py +++ /dev/null @@ -1,95 +0,0 @@ -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 [17, 16, 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 index b90848334..24414e28f 100755 --- a/distribution/macos/create_app_bundle.sh +++ b/distribution/macos/create_app_bundle.sh @@ -14,7 +14,7 @@ mkdir "$APP_BUNDLE_DIRECTORY/Contents/Frameworks" mkdir "$APP_BUNDLE_DIRECTORY/Contents/MacOS" mkdir "$APP_BUNDLE_DIRECTORY/Contents/Resources" -# Copy executable and nsure executable can be executed +# Copy executable and ensure executable can be executed cp "$PUBLISH_DIRECTORY/Ryujinx" "$APP_BUNDLE_DIRECTORY/Contents/MacOS/Ryujinx" chmod u+x "$APP_BUNDLE_DIRECTORY/Contents/MacOS/Ryujinx" diff --git a/distribution/macos/create_macos_build_ava.sh b/distribution/macos/create_macos_build_ava.sh index 028486f51..fbb4f963a 100755 --- a/distribution/macos/create_macos_build_ava.sh +++ b/distribution/macos/create_macos_build_ava.sh @@ -33,69 +33,44 @@ if [[ "$(uname)" == "Darwin" ]]; then fi if [ "$CANARY" == "1" ]; then - RELEASE_TAR_FILE_NAME=ryujinx-canary-$VERSION-macos_universal.app.tar + RELEASE_TAR_FILE_NAME=ryujinx-canary-$VERSION-macos_arm64.app.tar elif [ "$VERSION" == "1.1.0" ]; then - RELEASE_TAR_FILE_NAME=ryujinx-$CONFIGURATION-$VERSION+$SOURCE_REVISION_ID-macos_universal.app.tar + RELEASE_TAR_FILE_NAME=ryujinx-$CONFIGURATION-$VERSION+$SOURCE_REVISION_ID-macos_arm64.app.tar else - RELEASE_TAR_FILE_NAME=ryujinx-$VERSION-macos_universal.app.tar + RELEASE_TAR_FILE_NAME=ryujinx-$VERSION-macos_arm64.app.tar fi 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" +OUTPUT_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" --self-contained true $EXTRA_ARGS) +DOTNET_COMMON_ARGS=(-p:DebugType=embedded -p:Version="$VERSION" -p:SourceRevisionId="$SOURCE_REVISION_ID" --self-contained $EXTRA_ARGS) dotnet restore dotnet build -c "$CONFIGURATION" src/Ryujinx dotnet publish -c "$CONFIGURATION" -r osx-arm64 -o "$TEMP_DIRECTORY/publish_arm64" "${DOTNET_COMMON_ARGS[@]}" src/Ryujinx -dotnet publish -c "$CONFIGURATION" -r osx-x64 -o "$TEMP_DIRECTORY/publish_x64" "${DOTNET_COMMON_ARGS[@]}" src/Ryujinx - -# Get rid of the support library for ARMeilleure for x64 (that's only for arm64) -rm -rf "$TEMP_DIRECTORY/publish_x64/libarmeilleure-jitsupport.dylib" # Get rid 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" +rm -rf "$OUTPUT_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 its 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-17)" ]; - then - LIPO=llvm-lipo - else - LIPO=llvm-lipo-17 - fi -else - LIPO=lipo -fi - -# Make the executable universal -$LIPO "$ARM64_APP_BUNDLE/$EXECUTABLE_SUB_PATH" "$X64_APP_BUNDLE/$EXECUTABLE_SUB_PATH" -output "$UNIVERSAL_APP_BUNDLE/$EXECUTABLE_SUB_PATH" -create +# Let's copy the app bundle to the output folder so we can package it freely +cp -R "$ARM64_APP_BUNDLE" "$OUTPUT_APP_BUNDLE" # 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" +sed -r -i.bck "s/\%\%RYUJINX_BUILD_VERSION\%\%/$VERSION/g;" "$OUTPUT_APP_BUNDLE/Contents/Info.plist" +sed -r -i.bck "s/\%\%RYUJINX_BUILD_GIT_HASH\%\%/$SOURCE_REVISION_ID/g;" "$OUTPUT_APP_BUNDLE/Contents/Info.plist" +rm "$OUTPUT_APP_BUNDLE/Contents/Info.plist.bck" # Now sign it if ! [ -x "$(command -v codesign)" ]; @@ -109,10 +84,10 @@ then # 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 "Using rcodesign for ad-hoc signing" - rcodesign sign --entitlements-xml-path "$ENTITLEMENTS_FILE_PATH" "$UNIVERSAL_APP_BUNDLE" + rcodesign sign --entitlements-xml-path "$ENTITLEMENTS_FILE_PATH" "$OUTPUT_APP_BUNDLE" else echo "Using codesign for ad-hoc signing" - codesign --entitlements "$ENTITLEMENTS_FILE_PATH" -f -s - "$UNIVERSAL_APP_BUNDLE" + codesign --entitlements "$ENTITLEMENTS_FILE_PATH" -f -s - "$OUTPUT_APP_BUNDLE" fi echo "Creating archive"