diff --git a/README.md b/README.md index dcfd857..00b9584 100644 --- a/README.md +++ b/README.md @@ -102,7 +102,10 @@ open Package.swift Fertige Binaries liegen unter Git-Releases (`dist/` wird lokal gebaut, nicht committet): ```bash ./scripts/build-release.sh +./scripts/build-app.sh # RemminaMac.app für /Applications +./scripts/build-dmg.sh # DMG mit Drag-and-drop auf Programme # → dist/RemminaMac--macos-arm64.zip + .sha256 +# → dist/RemminaMac--macos-arm64.dmg + .sha256 ls dist/ ``` Details: [docs/INSTALL.md](docs/INSTALL.md), [docs/RELEASING.md](docs/RELEASING.md). diff --git a/Resources/Info.plist b/Resources/Info.plist new file mode 100644 index 0000000..acb6cea --- /dev/null +++ b/Resources/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + de + CFBundleDisplayName + RemminaMac + CFBundleExecutable + RemminaMac + CFBundleIdentifier + xyz.sysdaemon.remmina-mac + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + RemminaMac + CFBundlePackageType + APPL + CFBundleShortVersionString + 0.1.0 + CFBundleVersion + 1 + LSMinimumSystemVersion + 14.0 + NSHighResolutionCapable + + NSHumanReadableCopyright + MIT — RemminaMac Contributors + LSApplicationCategoryType + public.app-category.utilities + + diff --git a/docs/ERRORS.md b/docs/ERRORS.md index f283473..404b0c1 100644 --- a/docs/ERRORS.md +++ b/docs/ERRORS.md @@ -11,6 +11,7 @@ Stand: 2026-09-21 · Version 0.1.0 · macOS arm64 · Swift 5.9+ · Xcode 15+ | 2 | 2026-09-21 | `swift build -c release` | keine Fehler, nur lange Link-Zeit (~40 s) | Info | ✅ ok | | 3 | 2026-09-21 | Release-Skript | `dist/` war nicht in `.gitignore` → Binary drohte committet zu werden | mittel | ✅ behoben (ignoriert) | | 4 | 2026-09-21 | Gitea-Upload | `GET /api/v1/user` → `401 invalid username, password or token` mit alten Credentials | blockierend (Push/Release) | ✅ behoben — neue Credentials ok, Push + Release v0.1.0 hochgeladen | +| 5 | 2026-09-21 | App-Bundle + DMG | keine Fehler: `build-app.sh` (Signatur ok), `build-dmg.sh` (UDZO, 200K), Mount-Verifikation ok (App + Applications/Programme-Links) | Info | ✅ ok | --- diff --git a/docs/INSTALL.md b/docs/INSTALL.md index 7d67293..8e47fbd 100644 --- a/docs/INSTALL.md +++ b/docs/INSTALL.md @@ -26,6 +26,17 @@ unzip dist/RemminaMac-*-macos-arm64.zip -d /tmp/rmm /tmp/rmm/RemminaMac ``` +## Variante D: Installer-DMG (Empfohlen für Endnutzer) +1. `RemminaMac-0.1.0-macos-arm64.dmg` aus dem Gitea-Release laden (oder lokal: `./scripts/build-app.sh 0.1.0 && ./scripts/build-dmg.sh 0.1.0`) +2. DMG doppelklicken → Finder-Fenster mit `RemminaMac.app` + `Programme`-Link +3. `RemminaMac.app` auf `Programme` ziehen → liegt in `/Applications/RemminaMac.app` +4. Auswerfen, aus Programme starten. Beim ersten Start: Rechtsklick → Öffnen (ad-hoc-Signatur, kein Apple-Notarization). +```bash +# Prüfen: +spctl -a -vv dist/RemminaMac.app +hdiutil verify dist/RemminaMac-0.1.0-macos-arm64.dmg +``` + ## RDP-Voraussetzungen ```bash # Für volle RDP-Unterstützung: diff --git a/docs/RELEASING.md b/docs/RELEASING.md index 1a43be0..4ce2584 100644 --- a/docs/RELEASING.md +++ b/docs/RELEASING.md @@ -2,13 +2,17 @@ ## Lokal bauen ```bash -./scripts/build-release.sh [version] +./scripts/build-release.sh [version] # ZIP mit Binary + Docs +./scripts/build-app.sh [version] # RemminaMac.app (Bundle, ad-hoc-signiert) +./scripts/build-dmg.sh [version] # DMG mit App + Programme-Link # Beispiel: ./scripts/build-release.sh 0.1.0 +./scripts/build-app.sh 0.1.0 +./scripts/build-dmg.sh 0.1.0 # Output: -# dist/RemminaMac-0.1.0-macos-arm64.zip -# dist/RemminaMac-0.1.0-macos-arm64.zip.sha256 -# dist/RemminaMac-0.1.0-macos-arm64/RemminaMac (Binary) +# dist/RemminaMac-0.1.0-macos-arm64.zip (+ .sha256) +# dist/RemminaMac.app/ +# dist/RemminaMac-0.1.0-macos-arm64.dmg (+ .sha256) ``` ## Was das Skript macht diff --git a/scripts/build-app.sh b/scripts/build-app.sh new file mode 100755 index 0000000..b2ea9ec --- /dev/null +++ b/scripts/build-app.sh @@ -0,0 +1,32 @@ +#!/bin/bash +# Baut RemminaMac.app (Drag-and-drop-fähiges Bundle) aus dem Release-Binary. +# Usage: ./scripts/build-app.sh [version] +set -euo pipefail +VERSION="${1:-0.1.0}" +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +DIST="$ROOT/dist" +BIN="$ROOT/.build/release/RemminaMac" +APP="$DIST/RemminaMac.app" + +echo "[build-app] Version: $VERSION" +if [ ! -x "$BIN" ]; then + echo "[build-app] Kein Release-Binary, baue..." + swift build -c release --package-path "$ROOT" +fi + +rm -rf "$APP" +mkdir -p "$APP/Contents/MacOS" "$APP/Contents/Resources" +cp "$BIN" "$APP/Contents/MacOS/RemminaMac" +chmod +x "$APP/Contents/MacOS/RemminaMac" + +# Info.plist mit Version versehen +sed "s|0.1.0|$VERSION|" "$ROOT/Resources/Info.plist" > "$APP/Contents/Info.plist" +echo -n "APPL????" > "$APP/Contents/PkgInfo" + +# Ad-hoc-Signatur (nötig für Apple Silicon / Gatekeeper-Basis) +codesign --force --deep --sign - "$APP" 2>&1 | tail -n 3 || true +codesign --verify --verbose=2 "$APP" 2>&1 | tail -n 5 || true + +echo "[build-app] Fertig:" +ls -ld "$APP" +du -sh "$APP" diff --git a/scripts/build-dmg.sh b/scripts/build-dmg.sh new file mode 100755 index 0000000..d1ca779 --- /dev/null +++ b/scripts/build-dmg.sh @@ -0,0 +1,44 @@ +#!/bin/bash +# Baut ein Drag-and-drop-DMG: RemminaMac.app + Programme-Symlink. +# Nur Bordmittel (hdiutil). Usage: ./scripts/build-dmg.sh [version] +set -euo pipefail +VERSION="${1:-0.1.0}" +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +DIST="$ROOT/dist" +APP="$DIST/RemminaMac.app" +VOL="RemminaMac $VERSION" +RW_DMG="$DIST/.rw.RemminaMac-$VERSION.dmg" +FINAL_DMG="$DIST/RemminaMac-$VERSION-macos-arm64.dmg" + +echo "[build-dmg] Version: $VERSION" +[ -d "$APP" ] || { echo "[build-dmg] $APP fehlt — erst ./scripts/build-app.sh $VERSION"; exit 1; } + +rm -f "$RW_DMG" "$FINAL_DMG" +# 1. Beschreibbares DMG mit App + Programme-Link erzeugen +hdiutil create -volname "$VOL" -srcfolder "$APP" -ov -format UDRW "$RW_DMG" > /dev/null +MOUNT="$(hdiutil attach -readwrite -nobrowse "$RW_DMG" | grep -E '/Volumes/' | sed 's/.*\/Volumes\//\/Volumes\//')" +echo "[build-dmg] Gemountet: $MOUNT" +ln -s /Applications "$MOUNT/Programme" || true +ln -s /Applications "$MOUNT/Applications" || true +# Optionales Fenster-Layout (schlägt headless ggf. fehl — nicht fatal) +osascript < /dev/null +# 2. Komprimieren + Checksumme +hdiutil convert "$RW_DMG" -format UDZO -imagekey zlib-level=9 -o "$FINAL_DMG" > /dev/null +rm -f "$RW_DMG" +shasum -a 256 "$FINAL_DMG" > "$FINAL_DMG.sha256" + +echo "[build-dmg] Fertig:" +ls -lh "$FINAL_DMG" "$FINAL_DMG.sha256" +cat "$FINAL_DMG.sha256" +hdiutil imageinfo "$FINAL_DMG" 2>/dev/null | grep -E 'Format|Size' | head -n 4 || true