From 67b65f60bc6b1967a99d8f744ec557e599e115e5 Mon Sep 17 00:00:00 2001 From: GreemDev Date: Wed, 19 Nov 2025 02:53:23 -0600 Subject: [PATCH 1/2] Intel Mac Ryubing will be self-compile only, so remove the warning on startup. --- src/Ryujinx/UI/Windows/MainWindow.axaml.cs | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs index e7934f38a..1ba324c29 100644 --- a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs @@ -138,7 +138,6 @@ namespace Ryujinx.Ava.UI.Windows Executor.ExecuteBackgroundAsync(async () => { - await ShowIntelMacWarningAsync(); if (CommandLineState.FirmwareToInstallPathArg.TryGet(out FilePath fwPath)) { if (fwPath is { ExistsAsFile: true, Extension: "xci" or "zip" } || fwPath.ExistsAsDirectory) @@ -757,20 +756,6 @@ namespace Ryujinx.Ava.UI.Windows }); } - private static bool _intelMacWarningShown = !RunningPlatform.IsIntelMac; - - public static async Task ShowIntelMacWarningAsync() - { - if (_intelMacWarningShown) - return; - - await Dispatcher.UIThread.InvokeAsync(async () => await ContentDialogHelper.CreateWarningDialog( - "Intel Mac Warning", - "Intel Macs are not supported and will not work properly.\nIf you continue, do not come to our Discord asking for support;\nand do not report bugs on the GitHub. They will be closed.")); - - _intelMacWarningShown = true; - } - private void AppWindow_OnGotFocus(object sender, GotFocusEventArgs e) { if (ViewModel.AppHost is null) From e1bf42257988932b400cb30d705d08a6ff098ed5 Mon Sep 17 00:00:00 2001 From: GreemDev Date: Wed, 19 Nov 2025 02:54:28 -0600 Subject: [PATCH 2/2] 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"