/ distribution / macos / create_macos_build_headless.sh
create_macos_build_headless.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=sdl2-ryujinx-headless-$CONFIGURATION-$VERSION+$SOURCE_REVISION_ID-macos_universal.tar
 26  else
 27    RELEASE_TAR_FILE_NAME=sdl2-ryujinx-headless-$VERSION-macos_universal.tar
 28  fi
 29  
 30  ARM64_OUTPUT="$TEMP_DIRECTORY/publish_arm64"
 31  X64_OUTPUT="$TEMP_DIRECTORY/publish_x64"
 32  UNIVERSAL_OUTPUT="$OUTPUT_DIRECTORY/publish"
 33  EXECUTABLE_SUB_PATH=Ryujinx.Headless.SDL2
 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.Headless.SDL2
 42  dotnet publish -c "$CONFIGURATION" -r osx-arm64 -o "$TEMP_DIRECTORY/publish_arm64" "${DOTNET_COMMON_ARGS[@]}" src/Ryujinx.Headless.SDL2
 43  dotnet publish -c "$CONFIGURATION" -r osx-x64 -o "$TEMP_DIRECTORY/publish_x64" "${DOTNET_COMMON_ARGS[@]}" src/Ryujinx.Headless.SDL2
 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  rm -rf "$OUTPUT_DIRECTORY"
 53  mkdir -p "$OUTPUT_DIRECTORY"
 54  
 55  # Let's copy one of the two different outputs and remove the executable
 56  cp -R "$ARM64_OUTPUT/" "$UNIVERSAL_OUTPUT"
 57  rm "$UNIVERSAL_OUTPUT/$EXECUTABLE_SUB_PATH"
 58  
 59  # Make it libraries universal
 60  python3 "$BASE_DIR/distribution/macos/construct_universal_dylib.py" "$ARM64_OUTPUT" "$X64_OUTPUT" "$UNIVERSAL_OUTPUT" "**/*.dylib"
 61  
 62  if ! [ -x "$(command -v lipo)" ];
 63  then
 64      if ! [ -x "$(command -v llvm-lipo-14)" ];
 65      then
 66          LIPO=llvm-lipo
 67      else
 68          LIPO=llvm-lipo-14
 69      fi
 70  else
 71      LIPO=lipo
 72  fi
 73  
 74  # Make the executable universal
 75  $LIPO "$ARM64_OUTPUT/$EXECUTABLE_SUB_PATH" "$X64_OUTPUT/$EXECUTABLE_SUB_PATH" -output "$UNIVERSAL_OUTPUT/$EXECUTABLE_SUB_PATH" -create
 76  
 77  # Now sign it
 78  if ! [ -x "$(command -v codesign)" ];
 79  then
 80      if ! [ -x "$(command -v rcodesign)" ];
 81      then
 82          echo "Cannot find rcodesign on your system, please install rcodesign."
 83          exit 1
 84      fi
 85  
 86      # NOTE: Currently require https://github.com/indygreg/apple-platform-rs/pull/44 to work on other OSes.
 87      # cargo install --git "https://github.com/marysaka/apple-platform-rs" --branch "fix/adhoc-app-bundle" apple-codesign --bin "rcodesign"
 88      echo "Using rcodesign for ad-hoc signing"
 89      for FILE in "$UNIVERSAL_OUTPUT"/*; do
 90          if [[ $(file "$FILE") == *"Mach-O"* ]]; then
 91              rcodesign sign --entitlements-xml-path "$ENTITLEMENTS_FILE_PATH" "$FILE"
 92          fi
 93      done  
 94  else
 95      echo "Using codesign for ad-hoc signing"
 96      for FILE in "$UNIVERSAL_OUTPUT"/*; do
 97          if [[ $(file "$FILE") == *"Mach-O"* ]]; then
 98              codesign --entitlements "$ENTITLEMENTS_FILE_PATH" -f --deep -s - "$FILE"
 99          fi
100      done    
101  fi
102  
103  echo "Creating archive"
104  pushd "$OUTPUT_DIRECTORY"
105  tar --exclude "publish/Ryujinx.Headless.SDL2" -cvf "$RELEASE_TAR_FILE_NAME" publish 1> /dev/null
106  python3 "$BASE_DIR/distribution/misc/add_tar_exec.py" "$RELEASE_TAR_FILE_NAME" "publish/Ryujinx.Headless.SDL2" "publish/Ryujinx.Headless.SDL2"
107  gzip -9 < "$RELEASE_TAR_FILE_NAME" > "$RELEASE_TAR_FILE_NAME.gz"
108  rm "$RELEASE_TAR_FILE_NAME"
109  popd
110  
111  echo "Done"