/ distribution / macos / create_macos_build_ava.sh
create_macos_build_ava.sh
  1  #!/bin/bash
  2  
  3  set -e
  4  
  5  if [ "$#" -lt 7 ]; then
  6      echo "usage <BASE_DIR> <TEMP_DIRECTORY> <OUTPUT_DIRECTORY> <ENTITLEMENTS_FILE_PATH> <VERSION> <SOURCE_REVISION_ID> <CONFIGURATION> <EXTRA_ARGS>"
  7      exit 1
  8  fi
  9  
 10  mkdir -p "$1"
 11  mkdir -p "$2"
 12  mkdir -p "$3"
 13  
 14  BASE_DIR=$(readlink -f "$1")
 15  TEMP_DIRECTORY=$(readlink -f "$2")
 16  OUTPUT_DIRECTORY=$(readlink -f "$3")
 17  ENTITLEMENTS_FILE_PATH=$(readlink -f "$4")
 18  VERSION=$5
 19  SOURCE_REVISION_ID=$6
 20  CONFIGURATION=$7
 21  EXTRA_ARGS=$8
 22  
 23  if [ "$VERSION" == "1.1.0" ];
 24  then
 25    RELEASE_TAR_FILE_NAME=ryujinx-$CONFIGURATION-$VERSION+$SOURCE_REVISION_ID-macos_universal.app.tar
 26  else
 27    RELEASE_TAR_FILE_NAME=ryujinx-$VERSION-macos_universal.app.tar
 28  fi
 29  
 30  ARM64_APP_BUNDLE="$TEMP_DIRECTORY/output_arm64/Ryujinx.app"
 31  X64_APP_BUNDLE="$TEMP_DIRECTORY/output_x64/Ryujinx.app"
 32  UNIVERSAL_APP_BUNDLE="$OUTPUT_DIRECTORY/Ryujinx.app"
 33  EXECUTABLE_SUB_PATH=Contents/MacOS/Ryujinx
 34  
 35  rm -rf "$TEMP_DIRECTORY"
 36  mkdir -p "$TEMP_DIRECTORY"
 37  
 38  DOTNET_COMMON_ARGS=(-p:DebugType=embedded -p:Version="$VERSION" -p:SourceRevisionId="$SOURCE_REVISION_ID" --self-contained true $EXTRA_ARGS)
 39  
 40  dotnet restore
 41  dotnet build -c "$CONFIGURATION" src/Ryujinx
 42  dotnet publish -c "$CONFIGURATION" -r osx-arm64 -o "$TEMP_DIRECTORY/publish_arm64" "${DOTNET_COMMON_ARGS[@]}" src/Ryujinx
 43  dotnet publish -c "$CONFIGURATION" -r osx-x64 -o "$TEMP_DIRECTORY/publish_x64" "${DOTNET_COMMON_ARGS[@]}" src/Ryujinx
 44  
 45  # Get rid of the support library for ARMeilleure for x64 (that's only for arm64)
 46  rm -rf "$TEMP_DIRECTORY/publish_x64/libarmeilleure-jitsupport.dylib"
 47  
 48  # Get rid of libsoundio from arm64 builds as we don't have a arm64 variant
 49  # TODO: remove this once done
 50  rm -rf "$TEMP_DIRECTORY/publish_arm64/libsoundio.dylib"
 51  
 52  pushd "$BASE_DIR/distribution/macos"
 53  ./create_app_bundle.sh "$TEMP_DIRECTORY/publish_x64" "$TEMP_DIRECTORY/output_x64" "$ENTITLEMENTS_FILE_PATH"
 54  ./create_app_bundle.sh "$TEMP_DIRECTORY/publish_arm64" "$TEMP_DIRECTORY/output_arm64" "$ENTITLEMENTS_FILE_PATH"
 55  popd
 56  
 57  rm -rf "$UNIVERSAL_APP_BUNDLE"
 58  mkdir -p "$OUTPUT_DIRECTORY"
 59  
 60  # Let's copy one of the two different app bundle and remove the executable
 61  cp -R "$ARM64_APP_BUNDLE" "$UNIVERSAL_APP_BUNDLE"
 62  rm "$UNIVERSAL_APP_BUNDLE/$EXECUTABLE_SUB_PATH"
 63  
 64  # Make it libraries universal
 65  python3 "$BASE_DIR/distribution/macos/construct_universal_dylib.py" "$ARM64_APP_BUNDLE" "$X64_APP_BUNDLE" "$UNIVERSAL_APP_BUNDLE" "**/*.dylib"
 66  
 67  if ! [ -x "$(command -v lipo)" ];
 68  then
 69      if ! [ -x "$(command -v llvm-lipo-14)" ];
 70      then
 71          LIPO=llvm-lipo
 72      else
 73          LIPO=llvm-lipo-14
 74      fi
 75  else
 76      LIPO=lipo
 77  fi
 78  
 79  # Make the executable universal
 80  $LIPO "$ARM64_APP_BUNDLE/$EXECUTABLE_SUB_PATH" "$X64_APP_BUNDLE/$EXECUTABLE_SUB_PATH" -output "$UNIVERSAL_APP_BUNDLE/$EXECUTABLE_SUB_PATH" -create
 81  
 82  # Patch up the Info.plist to have appropriate version
 83  sed -r -i.bck "s/\%\%RYUJINX_BUILD_VERSION\%\%/$VERSION/g;" "$UNIVERSAL_APP_BUNDLE/Contents/Info.plist"
 84  sed -r -i.bck "s/\%\%RYUJINX_BUILD_GIT_HASH\%\%/$SOURCE_REVISION_ID/g;" "$UNIVERSAL_APP_BUNDLE/Contents/Info.plist"
 85  rm "$UNIVERSAL_APP_BUNDLE/Contents/Info.plist.bck"
 86  
 87  # Now sign it
 88  if ! [ -x "$(command -v codesign)" ];
 89  then
 90      if ! [ -x "$(command -v rcodesign)" ];
 91      then
 92          echo "Cannot find rcodesign on your system, please install rcodesign."
 93          exit 1
 94      fi
 95  
 96      # NOTE: Currently require https://github.com/indygreg/apple-platform-rs/pull/44 to work on other OSes.
 97      # cargo install --git "https://github.com/marysaka/apple-platform-rs" --branch "fix/adhoc-app-bundle" apple-codesign --bin "rcodesign"
 98      echo "Using rcodesign for ad-hoc signing"
 99      rcodesign sign --entitlements-xml-path "$ENTITLEMENTS_FILE_PATH" "$UNIVERSAL_APP_BUNDLE"
100  else
101      echo "Using codesign for ad-hoc signing"
102      codesign --entitlements "$ENTITLEMENTS_FILE_PATH" -f --deep -s - "$UNIVERSAL_APP_BUNDLE"
103  fi
104  
105  echo "Creating archive"
106  pushd "$OUTPUT_DIRECTORY"
107  tar --exclude "Ryujinx.app/Contents/MacOS/Ryujinx" -cvf "$RELEASE_TAR_FILE_NAME" Ryujinx.app 1> /dev/null
108  python3 "$BASE_DIR/distribution/misc/add_tar_exec.py" "$RELEASE_TAR_FILE_NAME" "Ryujinx.app/Contents/MacOS/Ryujinx" "Ryujinx.app/Contents/MacOS/Ryujinx"
109  gzip -9 < "$RELEASE_TAR_FILE_NAME" > "$RELEASE_TAR_FILE_NAME.gz"
110  rm "$RELEASE_TAR_FILE_NAME"
111  
112  # Create legacy update package for Avalonia to not left behind old testers.
113  if [ "$VERSION" != "1.1.0" ];
114  then
115      cp $RELEASE_TAR_FILE_NAME.gz test-ava-ryujinx-$VERSION-macos_universal.app.tar.gz
116  fi
117  
118  popd
119  
120  echo "Done"