#!/bin/sh # Builds Rookery.app for macOS without a Mac: a macOS Java runtime made by jlink from the macOS JDK's # jmods, the universal jar, an Info.plist and a small launcher. It is not signed or notarized. # usage: site/macos-app.sh [dir holding aarch64/ and x64/ macOS JDKs (jmods only is enough)] set -eu root=$(cd "$(dirname "$0")/.." && pwd) version=${1:?usage: macos-app.sh [jdk dir]} jdks=${2:-/opt/macjdk} jar=$root/desktop/build/libs/rookery-universal.jar out=$root/desktop/build/macos # Use the same modules the desktop build decided the app needs (Compose records them in the runtime's release file). release=$(ls "$root"/desktop/build/compose/binaries/main/app/rookery/lib/runtime/release \ "$root"/desktop/build/compose/binaries/main/app/rookery.app/Contents/runtime/Contents/Home/release 2>/dev/null | head -1) modules=$(sed -n 's/^MODULES="\(.*\)"/\1/p' "$release" | tr ' ' ',') [ -n "$modules" ] || { echo "no module list in $release" >&2; exit 1; } work=$(mktemp -d) trap 'rm -rf "$work"' EXIT mkdir -p "$out" for pair in aarch64:arm64 x64:x64; do jdk=${pair%%:*}; name=${pair##*:} app=$work/$name/Rookery.app mkdir -p "$app/Contents/MacOS" "$app/Contents/Resources" "$app/Contents/app" cp "$root/site/assets/rookery.icns" "$app/Contents/Resources/rookery.icns" jlink --module-path "$jdks/$jdk/Contents/Home/jmods" --add-modules "$modules" \ --strip-java-debug-attributes --no-header-files --no-man-pages --compress zip-6 --output "$app/Contents/runtime" cp "$jar" "$app/Contents/app/rookery.jar" # the universal jar carries every platform's graphics library; this app only needs its own case $name in arm64) other=x64 ;; *) other=arm64 ;; esac zip -qd "$app/Contents/app/rookery.jar" 'libskiko-linux-*' 'skiko-windows-*' "libskiko-macos-$other*" > /dev/null || true cat > "$app/Contents/MacOS/rookery" <<'LAUNCHER' #!/bin/sh here=$(cd "$(dirname "$0")/.." && pwd) exec "$here/runtime/bin/java" -Xdock:name=Rookery -Xmx256m -XX:+UseSerialGC -jar "$here/app/rookery.jar" "$@" LAUNCHER chmod +x "$app/Contents/MacOS/rookery" cat > "$app/Contents/Info.plist" < CFBundleNameRookery CFBundleDisplayNameRookery CFBundleIdentifiercoffee.liz.rookery CFBundleExecutablerookery CFBundlePackageTypeAPPL CFBundleIconFilerookery CFBundleShortVersionString$version CFBundleVersion$version LSMinimumSystemVersion11.0 NSHighResolutionCapable NSBluetoothAlwaysUsageDescriptionConnects to your smart cube. NSMicrophoneUsageDescriptionListens to a stackmat timer on an audio input. PLIST rm -f "$out/rookery-macos-$name.zip" (cd "$work/$name" && zip -qry "$out/rookery-macos-$name.zip" Rookery.app) echo "macos: rookery-macos-$name.zip $(du -h "$out/rookery-macos-$name.zip" | cut -f1)" done