Files
onyx/Scripts/local-dmg.sh
Scarriffle d90352a86b DMG für den eigenen Rechner
Der App Store ist für Onyx kein Weg: er verlangt die Sandbox, und ohne die
gäbe es keinen privilegierten Helfer, keinen IOKit-Zugriff, keine
Audio-Taps — also weder Lüftersteuerung noch Ladelimit, Hardwaremesswerte
oder Mixer. Das steht so in der Planung, war aber nie als Skript hinterlegt,
das man ohne Zertifikatsantrag laufen lassen kann.

Scripts/local-dmg.sh füllt die Lücke: Release-Build mit dem
Entwicklerzertifikat, dieselben drei Prüfungen wie beim Verteilen —
Signatur, App-Group, Kennung des Helfers — und ein DMG mit Verweis auf den
Programme-Ordner.

Der Unterschied zu release.sh ist nicht die Verpackung, sondern die
Signatur. Auf dem Mac, auf dem das Zertifikat zuhause ist, läuft es; auf
einem fremden meldet Gatekeeper einen unbekannten Entwickler. Für die
Weitergabe bleibt es bei Developer ID und Notarisierung.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-14 12:52:17 +02:00

87 lines
3.3 KiB
Bash
Executable File

#!/bin/bash
# Baut ein DMG für **den eigenen Rechner**.
#
# Der Unterschied zu `release.sh` ist nicht die Verpackung, sondern die
# Signatur: hier wird mit dem Entwicklerzertifikat signiert, das ohnehin im
# Schlüsselbund liegt. Das genügt auf dem Mac, auf dem dieses Zertifikat
# zuhause ist — und **nur** dort. Auf einem fremden Rechner meldet Gatekeeper
# einen unbekannten Entwickler und lässt die App nicht starten.
#
# Für die Weitergabe braucht es `Scripts/release.sh`, ein Zertifikat
# „Developer ID Application" und die Notarisierung. Dieses Skript ist der
# kurze Weg dorthin, nicht der Ersatz.
set -euo pipefail
export DEVELOPER_DIR=${DEVELOPER_DIR:-/Applications/Xcode.app/Contents/Developer}
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
BUILD="$ROOT/build/local"
APP_NAME="Onyx"
cd "$ROOT"
VERSION=$(awk -F'"' '/MARKETING_VERSION/ {print $2; exit}' project.yml)
DMG="$BUILD/${APP_NAME}-${VERSION}-lokal.dmg"
fail() { echo "$*" >&2; exit 1; }
step() { echo; echo "── $* ──"; }
step "Vorprüfung"
security find-identity -v -p codesigning | grep -q "Apple Development" \
|| fail "Kein Signaturzertifikat im Schlüsselbund."
command -v xcodegen >/dev/null || fail "xcodegen fehlt (brew install xcodegen)"
echo "✓ Zertifikat und xcodegen vorhanden"
step "Projekt erzeugen"
xcodegen generate
step "Tests"
(cd Packages/OnyxKit && swift test 2>&1 | tail -2)
# Release statt Debug: gebaut wird, was man auch benutzen will — optimiert,
# ohne Testgerüst und ohne die Bremsen aus dem Debugger.
step "Bauen (Release)"
rm -rf "$BUILD"
xcodebuild -project Onyx.xcodeproj -scheme Onyx -configuration Release \
-derivedDataPath "$BUILD/dd" build \
| grep -E "error:|BUILD SUCCEEDED" || fail "Bauen fehlgeschlagen"
APP="$BUILD/dd/Build/Products/Release/$APP_NAME.app"
[ -d "$APP" ] || fail "Kein fertiges Programm unter $APP"
# Die drei Punkte, an denen dieses Projekt eine Sonderbehandlung hat. Was hier
# durchrutscht, merkt man erst, wenn eine Funktion still fehlt.
step "Prüfen"
codesign --verify --deep --strict "$APP" || fail "Signatur unvollständig"
codesign -d --entitlements - "$APP" 2>/dev/null | grep -q "application-groups" \
|| fail "App-Group fehlt in den Entitlements — Calendarr wäre unerreichbar"
HELPER_ID=$(codesign -d --verbose=2 "$APP/Contents/MacOS/OnyxHelper" 2>&1 \
| awk -F= '/^Identifier=/ {print $2}')
[ "$HELPER_ID" = "com.scarriffleservices.onyx.helper" ] \
|| fail "Helfer trägt die Kennung „$HELPER_ID“ statt com.scarriffleservices.onyx.helper"
echo "✓ Signatur, Entitlements und Helfer-Kennung in Ordnung"
step "DMG bauen"
STAGE="$BUILD/stage"
rm -rf "$STAGE"; mkdir -p "$STAGE"
cp -R "$APP" "$STAGE/"
# Der Verweis auf den Programme-Ordner: ohne ihn zieht man die App irgendwohin,
# und der privilegierte Helfer verlangt einen festen Ort.
ln -s /Applications "$STAGE/Applications"
rm -f "$DMG"
hdiutil create -volname "$APP_NAME $VERSION" -srcfolder "$STAGE" \
-ov -format UDZO "$DMG" | tail -1
echo
echo "✓ Fertig: $DMG"
echo
echo " Zum Installieren: DMG öffnen, Onyx auf „Programme“ ziehen."
echo " Danach einmal aus /Applications starten — der Lüfterhelfer meldet sich"
echo " neu an, weil er am Ort des Programms hängt."
echo
echo " Dieses DMG läuft nur auf diesem Mac. Für die Weitergabe:"
echo " Scripts/release.sh (Developer ID + Notarisierung)."