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"