diff options
| author | Elizabeth Alexander Hunt <me@liz.coffee> | 2026-11-13 16:40:02 -0800 |
|---|---|---|
| committer | Elizabeth Alexander Hunt <me@liz.coffee> | 2026-11-13 16:40:02 -0800 |
| commit | 3803f14160c30ac470bc957f8a0f2dbe67c4fd57 (patch) | |
| tree | b7cfc3e0570ef7766e053b89ca038109c353d359 /site | |
| parent | 8974b115b69bc25ebf174e8c9637373c4d206325 (diff) | |
| download | rookery-release.tar.gz rookery-release.zip | |
Diffstat (limited to 'site')
| -rw-r--r-- | site/.gitignore | 7 | ||||
| -rwxr-xr-x | site/assemble.sh | 12 | ||||
| -rw-r--r-- | site/assets/favicon.png | bin | 0 -> 511 bytes | |||
| -rw-r--r-- | site/assets/penguin.png | bin | 0 -> 821 bytes | |||
| -rw-r--r-- | site/assets/rookery.icns | bin | 0 -> 46522 bytes | |||
| -rwxr-xr-x | site/macos-app.sh | 67 |
6 files changed, 83 insertions, 3 deletions
diff --git a/site/.gitignore b/site/.gitignore new file mode 100644 index 0000000..3343c00 --- /dev/null +++ b/site/.gitignore @@ -0,0 +1,7 @@ +# site/assemble.sh can publish straight into this folder; everything except the sources is generated. +/* +!/assets/ +!/assemble.sh +!/macos-app.sh +!/nginx.conf +!/.gitignore diff --git a/site/assemble.sh b/site/assemble.sh index aed5b27..52cd84c 100755 --- a/site/assemble.sh +++ b/site/assemble.sh @@ -13,12 +13,14 @@ case $(uname -m) in x86_64|amd64) arch=x64 ;; aarch64|arm64) arch=arm64 ;; *) ar sha() { if command -v sha256sum >/dev/null 2>&1; then sha256sum "$@"; else shasum -a 256 "$@"; fi; } size() { du -h "$1" | cut -f1 | tr -d ' '; } -apk=$root/android/build/outputs/apk/debug/android-debug.apk +apk=$root/android/build/outputs/apk/release/android-release.apk jar=$root/desktop/build/libs/rookery-universal.jar app=$root/desktop/build/compose/binaries/main/app/rookery [ -f "$apk" ] && cp "$apk" "$out/rookery-android.apk" [ -f "$jar" ] && cp "$jar" "$out/rookery.jar" +cp "$root"/site/assets/*.png "$out/" +for z in "$root"/desktop/build/macos/rookery-macos-*.zip; do [ -f "$z" ] && cp "$z" "$out/"; done [ -d "$app" ] && tar -C "$(dirname "$app")" -czf "$out/rookery-linux-$arch.tar.gz" rookery printf '%s\n' "$commit" > "$out/commit.txt" @@ -39,6 +41,7 @@ cat > "$out/index.html" <<HTML <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> +<link rel="icon" href="favicon.png"> <title>rookery</title> <style> :root { --bg: black; --fg: white; --a: #c4d0c8; --h: #7d978c; --line: #3a403d; --dim: #a3ada7; } @@ -54,16 +57,19 @@ cat > "$out/index.html" <<HTML </style> </head> <body> -<h1>rookery</h1> +<h1><img src="penguin.png" alt="" width="32" height="32" style="vertical-align:-7px; image-rendering:pixelated"> rookery</h1> <p>speedcubing timer and blindfold trainer. desktop and android.</p> <hr> <h2>downloads</h2> <table> -$(row rookery-android.apk "Android 8+, debug-signed") +$(row rookery-macos-arm64.zip "macOS 11+, Apple Silicon, not notarized") +$(row rookery-macos-x64.zip "macOS 11+, Intel, not notarized") +$(row rookery-android.apk "Android 8+, release build (debug-signed)") $(row "rookery-linux-$arch.tar.gz" "Linux $arch, runtime included") $(row rookery.jar "Java 21; Linux, macOS, Windows") </table> <ul> + <li>macOS: unzip, then run <tt>xattr -dr com.apple.quarantine Rookery.app</tt> once. The app isn't notarized.</li> <li>apk: allow installing from this source when asked.</li> <li>tar.gz: extract, then run <tt>rookery/bin/rookery</tt>.</li> <li>jar: <tt>java -jar rookery.jar</tt></li> diff --git a/site/assets/favicon.png b/site/assets/favicon.png Binary files differnew file mode 100644 index 0000000..162fffc --- /dev/null +++ b/site/assets/favicon.png diff --git a/site/assets/penguin.png b/site/assets/penguin.png Binary files differnew file mode 100644 index 0000000..6e9db07 --- /dev/null +++ b/site/assets/penguin.png diff --git a/site/assets/rookery.icns b/site/assets/rookery.icns Binary files differnew file mode 100644 index 0000000..f904afd --- /dev/null +++ b/site/assets/rookery.icns diff --git a/site/macos-app.sh b/site/macos-app.sh new file mode 100755 index 0000000..e7b9bc3 --- /dev/null +++ b/site/macos-app.sh @@ -0,0 +1,67 @@ +#!/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 <version> [dir holding aarch64/ and x64/ macOS JDKs (jmods only is enough)] +set -eu + +root=$(cd "$(dirname "$0")/.." && pwd) +version=${1:?usage: macos-app.sh <version> [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" <<PLIST +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleName</key><string>Rookery</string> + <key>CFBundleDisplayName</key><string>Rookery</string> + <key>CFBundleIdentifier</key><string>coffee.liz.rookery</string> + <key>CFBundleExecutable</key><string>rookery</string> + <key>CFBundlePackageType</key><string>APPL</string> + <key>CFBundleIconFile</key><string>rookery</string> + <key>CFBundleShortVersionString</key><string>$version</string> + <key>CFBundleVersion</key><string>$version</string> + <key>LSMinimumSystemVersion</key><string>11.0</string> + <key>NSHighResolutionCapable</key><true/> + <key>NSBluetoothAlwaysUsageDescription</key><string>Connects to your smart cube.</string> + <key>NSMicrophoneUsageDescription</key><string>Listens to a stackmat timer on an audio input.</string> +</dict> +</plist> +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 |
