create_macos_build_headless.sh 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #!/bin/bash
  2. set -e
  3. if [ "$#" -lt 8 ]; then
  4. echo "usage <BASE_DIR> <TEMP_DIRECTORY> <OUTPUT_DIRECTORY> <ENTITLEMENTS_FILE_PATH> <VERSION> <SOURCE_REVISION_ID> <CONFIGURATION> <CANARY>"
  5. exit 1
  6. fi
  7. mkdir -p "$1"
  8. mkdir -p "$2"
  9. mkdir -p "$3"
  10. BASE_DIR=$(readlink -f "$1")
  11. TEMP_DIRECTORY=$(readlink -f "$2")
  12. OUTPUT_DIRECTORY=$(readlink -f "$3")
  13. ENTITLEMENTS_FILE_PATH=$(readlink -f "$4")
  14. VERSION=$5
  15. SOURCE_REVISION_ID=$6
  16. CONFIGURATION=$7
  17. CANARY=$8
  18. if [ "$CANARY" == "1" ]; then
  19. RELEASE_TAR_FILE_NAME=nogui-ryujinx-canary-$VERSION-macos_universal.tar
  20. elif [ "$VERSION" == "1.1.0" ]; then
  21. RELEASE_TAR_FILE_NAME=nogui-ryujinx-$CONFIGURATION-$VERSION+$SOURCE_REVISION_ID-macos_universal.tar
  22. else
  23. RELEASE_TAR_FILE_NAME=nogui-ryujinx-$VERSION-macos_universal.tar
  24. fi
  25. ARM64_OUTPUT="$TEMP_DIRECTORY/publish_arm64"
  26. X64_OUTPUT="$TEMP_DIRECTORY/publish_x64"
  27. UNIVERSAL_OUTPUT="$OUTPUT_DIRECTORY/publish"
  28. EXECUTABLE_SUB_PATH=Ryujinx.Headless.SDL2
  29. rm -rf "$TEMP_DIRECTORY"
  30. mkdir -p "$TEMP_DIRECTORY"
  31. DOTNET_COMMON_ARGS=(-p:DebugType=embedded -p:Version="$VERSION" -p:SourceRevisionId="$SOURCE_REVISION_ID" --self-contained true $EXTRA_ARGS)
  32. dotnet restore
  33. dotnet build -c "$CONFIGURATION" src/Ryujinx.Headless.SDL2
  34. dotnet publish -c "$CONFIGURATION" -r osx-arm64 -o "$TEMP_DIRECTORY/publish_arm64" "${DOTNET_COMMON_ARGS[@]}" src/Ryujinx.Headless.SDL2
  35. dotnet publish -c "$CONFIGURATION" -r osx-x64 -o "$TEMP_DIRECTORY/publish_x64" "${DOTNET_COMMON_ARGS[@]}" src/Ryujinx.Headless.SDL2
  36. # Get rid of the support library for ARMeilleure for x64 (that's only for arm64)
  37. rm -rf "$TEMP_DIRECTORY/publish_x64/libarmeilleure-jitsupport.dylib"
  38. # Get rid of libsoundio from arm64 builds as we don't have a arm64 variant
  39. # TODO: remove this once done
  40. rm -rf "$TEMP_DIRECTORY/publish_arm64/libsoundio.dylib"
  41. rm -rf "$OUTPUT_DIRECTORY"
  42. mkdir -p "$OUTPUT_DIRECTORY"
  43. # Let's copy one of the two different outputs and remove the executable
  44. cp -R "$ARM64_OUTPUT/" "$UNIVERSAL_OUTPUT"
  45. rm "$UNIVERSAL_OUTPUT/$EXECUTABLE_SUB_PATH"
  46. # Make its libraries universal
  47. python3 "$BASE_DIR/distribution/macos/construct_universal_dylib.py" "$ARM64_OUTPUT" "$X64_OUTPUT" "$UNIVERSAL_OUTPUT" "**/*.dylib"
  48. if ! [ -x "$(command -v lipo)" ];
  49. then
  50. if ! [ -x "$(command -v llvm-lipo-17)" ];
  51. then
  52. LIPO=llvm-lipo
  53. else
  54. LIPO=llvm-lipo-17
  55. fi
  56. else
  57. LIPO=lipo
  58. fi
  59. # Make the executable universal
  60. $LIPO "$ARM64_OUTPUT/$EXECUTABLE_SUB_PATH" "$X64_OUTPUT/$EXECUTABLE_SUB_PATH" -output "$UNIVERSAL_OUTPUT/$EXECUTABLE_SUB_PATH" -create
  61. # Now sign it
  62. if ! [ -x "$(command -v codesign)" ];
  63. then
  64. if ! [ -x "$(command -v rcodesign)" ];
  65. then
  66. echo "Cannot find rcodesign on your system, please install rcodesign."
  67. exit 1
  68. fi
  69. # NOTE: Currently require https://github.com/indygreg/apple-platform-rs/pull/44 to work on other OSes.
  70. # cargo install --git "https://github.com/marysaka/apple-platform-rs" --branch "fix/adhoc-app-bundle" apple-codesign --bin "rcodesign"
  71. echo "Using rcodesign for ad-hoc signing"
  72. for FILE in "$UNIVERSAL_OUTPUT"/*; do
  73. if [[ $(file "$FILE") == *"Mach-O"* ]]; then
  74. rcodesign sign --entitlements-xml-path "$ENTITLEMENTS_FILE_PATH" "$FILE"
  75. fi
  76. done
  77. else
  78. echo "Using codesign for ad-hoc signing"
  79. for FILE in "$UNIVERSAL_OUTPUT"/*; do
  80. if [[ $(file "$FILE") == *"Mach-O"* ]]; then
  81. codesign --entitlements "$ENTITLEMENTS_FILE_PATH" -f -s - "$FILE"
  82. fi
  83. done
  84. fi
  85. echo "Creating archive"
  86. pushd "$OUTPUT_DIRECTORY"
  87. tar --exclude "publish/Ryujinx.Headless.SDL2" -cvf "$RELEASE_TAR_FILE_NAME" publish 1> /dev/null
  88. python3 "$BASE_DIR/distribution/misc/add_tar_exec.py" "$RELEASE_TAR_FILE_NAME" "publish/Ryujinx.Headless.SDL2" "publish/Ryujinx.Headless.SDL2"
  89. gzip -9 < "$RELEASE_TAR_FILE_NAME" > "$RELEASE_TAR_FILE_NAME.gz"
  90. rm "$RELEASE_TAR_FILE_NAME"
  91. popd
  92. echo "Done"