diff --git a/distribution/linux/Ryujinx.sh b/distribution/linux/Ryujinx.sh index 30eb14399..885cb9047 100755 --- a/distribution/linux/Ryujinx.sh +++ b/distribution/linux/Ryujinx.sh @@ -2,10 +2,6 @@ SCRIPT_DIR=$(dirname "$(realpath "$0")") -if [ -f "$SCRIPT_DIR/Ryujinx.Headless.SDL2" ]; then - RYUJINX_BIN="Ryujinx.Headless.SDL2" -fi - if [ -f "$SCRIPT_DIR/Ryujinx" ]; then RYUJINX_BIN="Ryujinx" fi diff --git a/distribution/linux/appimage/AppRun b/distribution/linux/appimage/AppRun new file mode 100755 index 000000000..adbb70a0a --- /dev/null +++ b/distribution/linux/appimage/AppRun @@ -0,0 +1,3 @@ +#!/bin/sh +CURRENTDIR="$(readlink -f "$(dirname "$0")")" +exec "$CURRENTDIR"/usr/bin/Ryujinx.sh "$@" diff --git a/distribution/linux/appimage/build-appimage.sh b/distribution/linux/appimage/build-appimage.sh new file mode 100755 index 000000000..9546a21cc --- /dev/null +++ b/distribution/linux/appimage/build-appimage.sh @@ -0,0 +1,26 @@ +#!/bin/sh +set -eu + +ROOTDIR="$(readlink -f "$(dirname "$0")")"/../../../ +cd "$ROOTDIR" + +BUILDDIR=${BUILDDIR:-publish} +OUTDIR=${OUTDIR:-publish_appimage} + +rm -rf AppDir +mkdir -p AppDir/usr/bin + +cp distribution/linux/Ryujinx.desktop AppDir/Ryujinx.desktop +cp distribution/linux/appimage/AppRun AppDir/AppRun +cp src/Ryujinx.UI.Common/Resources/Logo_Ryujinx.png AppDir/Ryujinx.svg + + +cp -r "$BUILDDIR"/* AppDir/usr/bin/ + +# Ensure necessary bins are set as executable +chmod +x AppDir/AppRun AppDir/usr/bin/Ryujinx* + +mkdir -p "$OUTDIR" + +appimagetool -n --comp zstd --mksquashfs-opt -Xcompression-level --mksquashfs-opt 21 \ + AppDir "$OUTDIR"/Ryujinx.AppImage diff --git a/distribution/macos/bundle_fix_up.py b/distribution/macos/bundle_fix_up.py index a8e3ac760..1c0f67bbf 100644 --- a/distribution/macos/bundle_fix_up.py +++ b/distribution/macos/bundle_fix_up.py @@ -19,7 +19,7 @@ if platform.system() == "Darwin": else: OTOOL = shutil.which("llvm-otool") if OTOOL is None: - for llvm_ver in [15, 14, 13]: + for llvm_ver in [17, 16, 15, 14, 13]: otool_path = shutil.which(f"llvm-otool-{llvm_ver}") if otool_path is not None: OTOOL = otool_path @@ -562,26 +562,29 @@ search_path = [ for path in content_directory.rglob("**/*.dylib"): - current_search_path = [path.parent] - current_search_path.extend(search_path) + if not path.name.startswith("._"): + 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, - ) + print(f"Fixing path '{path}' using search path of '{current_search_path}' for context of '{content_directory}'.") + 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) + if not path.name.startswith("._"): + 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, - ) + fixup_dylib( + path, + get_path_related_to_target_exec(content_directory, path), + current_search_path, + content_directory, + ) with open(executable_path, "rb") as input: diff --git a/distribution/macos/construct_universal_dylib.py b/distribution/macos/construct_universal_dylib.py index 46f63a0a1..18b84399f 100644 --- a/distribution/macos/construct_universal_dylib.py +++ b/distribution/macos/construct_universal_dylib.py @@ -26,7 +26,7 @@ else: LIPO = shutil.which("llvm-lipo") if LIPO is None: - for llvm_ver in [15, 14, 13]: + 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 diff --git a/distribution/macos/create_app_bundle.sh b/distribution/macos/create_app_bundle.sh index 426c9890b..7a1461eb6 100755 --- a/distribution/macos/create_app_bundle.sh +++ b/distribution/macos/create_app_bundle.sh @@ -31,21 +31,35 @@ cp -r "$PUBLISH_DIRECTORY/THIRDPARTY.md" "$APP_BUNDLE_DIRECTORY/Contents/Resourc echo -n "APPL????" > "$APP_BUNDLE_DIRECTORY/Contents/PkgInfo" # Fixup libraries and executable +echo "Running bundle fix up python script" python3 bundle_fix_up.py "$APP_BUNDLE_DIRECTORY" MacOS/Ryujinx +# Resign all dyplib files as ad-hoc after changing them +find "$APP_BUNDLE_DIRECTORY/Contents/Frameworks" -type f -name "*.dylib" -exec codesign --force --sign - {} \; + # Now sign it +echo "Starting signing process" if ! [ -x "$(command -v codesign)" ]; then if ! [ -x "$(command -v rcodesign)" ]; then - echo "Cannot find rcodesign on your system, please install rcodesign." + echo "Cannot find rcodesign on your system, please install rcodesign and ensure it is in your search path." exit 1 fi - # cargo install apple-codesign - echo "Usign rcodesign for ad-hoc signing" + echo "Using rcodesign for ad-hoc signing" + + echo "Resigning all frameworks dylib files as ad-hoc" + find "$APP_BUNDLE_DIRECTORY/Contents/Frameworks" -type f -name "*.dylib" -exec rcodesign sign {} \; + + echo "Signing app bundle as ad-hoc" rcodesign sign --entitlements-xml-path "$ENTITLEMENTS_FILE_PATH" "$APP_BUNDLE_DIRECTORY" else - echo "Usign codesign for ad-hoc signing" + echo "Using codesign for ad-hoc signing" + + echo "Resigning all frameworks dylib files as ad-hoc" + find "$APP_BUNDLE_DIRECTORY/Contents/Frameworks" -type f -name "*.dylib" -exec codesign --force --sign - {} \; + + echo "Signing app bundle as ad-hoc" codesign --entitlements "$ENTITLEMENTS_FILE_PATH" -f --deep -s - "$APP_BUNDLE_DIRECTORY" -fi \ No newline at end of file +fi diff --git a/distribution/macos/create_macos_build_ava.sh b/distribution/macos/create_macos_build_ava.sh index 23eafc129..a45cee552 100755 --- a/distribution/macos/create_macos_build_ava.sh +++ b/distribution/macos/create_macos_build_ava.sh @@ -20,7 +20,19 @@ SOURCE_REVISION_ID=$6 CONFIGURATION=$7 EXTRA_ARGS=$8 -if [ "$VERSION" == "1.1.0" ]; +if [[ "$(uname)" == "Darwin" ]]; then + echo "Clearing xattr on all dot underscore files" + find "$BASE_DIR" -type f -name "._*" -exec sh -c ' + for f; do + dir=$(dirname "$f") + base=$(basename "$f") + orig="$dir/${base#._}" + [ -f "$orig" ] && xattr -c "$orig" || true + done + ' sh {} + +fi + +if [ "$VERSION" == "2.0.0" ]; then RELEASE_TAR_FILE_NAME=ryujinx-$CONFIGURATION-$VERSION+$SOURCE_REVISION_ID-macos_universal.app.tar else @@ -66,11 +78,11 @@ python3 "$BASE_DIR/distribution/macos/construct_universal_dylib.py" "$ARM64_APP_ if ! [ -x "$(command -v lipo)" ]; then - if ! [ -x "$(command -v llvm-lipo-14)" ]; + if ! [ -x "$(command -v llvm-lipo-17)" ]; then LIPO=llvm-lipo else - LIPO=llvm-lipo-14 + LIPO=llvm-lipo-17 fi else LIPO=lipo @@ -109,12 +121,6 @@ python3 "$BASE_DIR/distribution/misc/add_tar_exec.py" "$RELEASE_TAR_FILE_NAME" " gzip -9 < "$RELEASE_TAR_FILE_NAME" > "$RELEASE_TAR_FILE_NAME.gz" rm "$RELEASE_TAR_FILE_NAME" -# Create legacy update package for Avalonia to not left behind old testers. -if [ "$VERSION" != "1.1.0" ]; -then - cp $RELEASE_TAR_FILE_NAME.gz test-ava-ryujinx-$VERSION-macos_universal.app.tar.gz -fi - popd -echo "Done" \ No newline at end of file +echo "Done" diff --git a/distribution/macos/create_macos_build_headless.sh b/distribution/macos/create_macos_build_headless.sh deleted file mode 100755 index a439aef45..000000000 --- a/distribution/macos/create_macos_build_headless.sh +++ /dev/null @@ -1,111 +0,0 @@ -#!/bin/bash - -set -e - -if [ "$#" -lt 7 ]; then - echo "usage " - 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 -CONFIGURATION=$7 -EXTRA_ARGS=$8 - -if [ "$VERSION" == "1.1.0" ]; -then - RELEASE_TAR_FILE_NAME=sdl2-ryujinx-headless-$CONFIGURATION-$VERSION+$SOURCE_REVISION_ID-macos_universal.tar -else - RELEASE_TAR_FILE_NAME=sdl2-ryujinx-headless-$VERSION-macos_universal.tar -fi - -ARM64_OUTPUT="$TEMP_DIRECTORY/publish_arm64" -X64_OUTPUT="$TEMP_DIRECTORY/publish_x64" -UNIVERSAL_OUTPUT="$OUTPUT_DIRECTORY/publish" -EXECUTABLE_SUB_PATH=Ryujinx.Headless.SDL2 - -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 restore -dotnet build -c "$CONFIGURATION" src/Ryujinx.Headless.SDL2 -dotnet publish -c "$CONFIGURATION" -r osx-arm64 -o "$TEMP_DIRECTORY/publish_arm64" "${DOTNET_COMMON_ARGS[@]}" src/Ryujinx.Headless.SDL2 -dotnet publish -c "$CONFIGURATION" -r osx-x64 -o "$TEMP_DIRECTORY/publish_x64" "${DOTNET_COMMON_ARGS[@]}" src/Ryujinx.Headless.SDL2 - -# 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" - -rm -rf "$OUTPUT_DIRECTORY" -mkdir -p "$OUTPUT_DIRECTORY" - -# Let's copy one of the two different outputs and remove the executable -cp -R "$ARM64_OUTPUT/" "$UNIVERSAL_OUTPUT" -rm "$UNIVERSAL_OUTPUT/$EXECUTABLE_SUB_PATH" - -# Make it libraries universal -python3 "$BASE_DIR/distribution/macos/construct_universal_dylib.py" "$ARM64_OUTPUT" "$X64_OUTPUT" "$UNIVERSAL_OUTPUT" "**/*.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 the executable universal -$LIPO "$ARM64_OUTPUT/$EXECUTABLE_SUB_PATH" "$X64_OUTPUT/$EXECUTABLE_SUB_PATH" -output "$UNIVERSAL_OUTPUT/$EXECUTABLE_SUB_PATH" -create - -# 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 "Using rcodesign for ad-hoc signing" - for FILE in "$UNIVERSAL_OUTPUT"/*; do - if [[ $(file "$FILE") == *"Mach-O"* ]]; then - rcodesign sign --entitlements-xml-path "$ENTITLEMENTS_FILE_PATH" "$FILE" - fi - done -else - echo "Using codesign for ad-hoc signing" - for FILE in "$UNIVERSAL_OUTPUT"/*; do - if [[ $(file "$FILE") == *"Mach-O"* ]]; then - codesign --entitlements "$ENTITLEMENTS_FILE_PATH" -f --deep -s - "$FILE" - fi - done -fi - -echo "Creating archive" -pushd "$OUTPUT_DIRECTORY" -tar --exclude "publish/Ryujinx.Headless.SDL2" -cvf "$RELEASE_TAR_FILE_NAME" publish 1> /dev/null -python3 "$BASE_DIR/distribution/misc/add_tar_exec.py" "$RELEASE_TAR_FILE_NAME" "publish/Ryujinx.Headless.SDL2" "publish/Ryujinx.Headless.SDL2" -gzip -9 < "$RELEASE_TAR_FILE_NAME" > "$RELEASE_TAR_FILE_NAME.gz" -rm "$RELEASE_TAR_FILE_NAME" -popd - -echo "Done" \ No newline at end of file