a248e9242a
macOS: packaging/macos/package.sh (run by launcher.yml) builds Horizon.app (Info.plist, bundle id dev.horizon.launcher, macOS 11+, the .icns), signs it ad hoc, and makes the two release assets: horizon-launcher-macos-arm64.dmg, the installer (the app and an Applications link over a background, laid out by dmgbuild without a GUI), and the .zip the launcher updates from. A launcher inside the app replaces the whole bundle: copied beside it with ditto, swapped in by renames, restarted; a bare binary, as older launchers are, still finds its binary in the zip. A macOS test zips, unpacks, swaps and re-verifies a signed bundle. Signing for real is a MACOS_SIGN_IDENTITY away (packaging/macos/README.md, with what Gatekeeper asks meanwhile). Linux: release builds keep horizon-launcher.desktop (with the binary's current path), horizon.desktop (hidden, for the game window's icon) and the hicolor icons under $XDG_DATA_HOME, without root; `horizon-launcher desktop-entry --remove` takes them out and stops it, `desktop-entry` puts them back. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
58 lines
2.4 KiB
Bash
Executable File
58 lines
2.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Packages the macOS launcher: Horizon.app (the binary, Info.plist, the icon), signed, then the
|
|
# two release assets, horizon-launcher-macos-arm64.zip (what the launcher updates itself from;
|
|
# older launchers find the binary inside it) and horizon-launcher-macos-arm64.dmg (the installer:
|
|
# the app and an Applications link over a background, to drag one onto the other).
|
|
#
|
|
# packaging/macos/package.sh BINARY VERSION OUTDIR
|
|
#
|
|
# Needs macOS (ditto, codesign, hdiutil) and dmgbuild (pip install dmgbuild==1.6.5; $DMGBUILD
|
|
# names it if it isn't on PATH). Signing: ad hoc by default, which needs no Apple account;
|
|
# set MACOS_SIGN_IDENTITY to a "Developer ID Application: …" identity in the keychain to sign
|
|
# for real (then notarize the .dmg: see packaging/macos/README.md).
|
|
set -euo pipefail
|
|
here=$(cd "$(dirname "$0")" && pwd)
|
|
binary=$1
|
|
version=$2
|
|
out=$(mkdir -p "$3" && cd "$3" && pwd)
|
|
app=$out/Horizon.app
|
|
|
|
rm -rf "$app"
|
|
mkdir -p "$app/Contents/MacOS" "$app/Contents/Resources"
|
|
cp "$binary" "$app/Contents/MacOS/horizon-launcher"
|
|
chmod 755 "$app/Contents/MacOS/horizon-launcher"
|
|
cp "$here/../icons/horizon.icns" "$app/Contents/Resources/horizon.icns"
|
|
sed "s/@VERSION@/$version/g" "$here/Info.plist" > "$app/Contents/Info.plist"
|
|
printf 'APPL????' > "$app/Contents/PkgInfo"
|
|
plutil -lint "$app/Contents/Info.plist"
|
|
|
|
identity=${MACOS_SIGN_IDENTITY:--}
|
|
if [[ "$identity" == "-" ]]; then
|
|
codesign --force --sign - "$app"
|
|
else
|
|
codesign --force --options runtime --timestamp --sign "$identity" "$app"
|
|
fi
|
|
codesign --verify --strict --verbose=2 "$app"
|
|
|
|
rm -f "$out/horizon-launcher-macos-arm64.zip" "$out/horizon-launcher-macos-arm64.dmg"
|
|
# No resource forks or extended attributes: they would land as ._ files inside the bundle.
|
|
(cd "$out" && ditto -c -k --norsrc --noextattr --noqtn --keepParent Horizon.app horizon-launcher-macos-arm64.zip)
|
|
|
|
cat > "$out/dmg.json" <<JSON
|
|
{
|
|
"title": "Horizon",
|
|
"icon-size": 128,
|
|
"background": "$here/background.png",
|
|
"window": { "position": { "x": 200, "y": 160 }, "size": { "width": 660, "height": 420 } },
|
|
"format": "UDZO",
|
|
"contents": [
|
|
{ "x": 180, "y": 200, "type": "file", "path": "$app" },
|
|
{ "x": 480, "y": 200, "type": "link", "path": "/Applications" }
|
|
]
|
|
}
|
|
JSON
|
|
"${DMGBUILD:-dmgbuild}" -s "$out/dmg.json" Horizon "$out/horizon-launcher-macos-arm64.dmg"
|
|
rm "$out/dmg.json"
|
|
hdiutil verify "$out/horizon-launcher-macos-arm64.dmg" >/dev/null
|
|
echo "Packaged $out/horizon-launcher-macos-arm64.zip and .dmg"
|