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>
87 lines
3.3 KiB
Bash
Executable File
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)."
|