#!/bin/bash # HMS MediaEngine – Windows Portable Build (§30.2, ADR-0005: Nuitka Onefolder) # Läuft auf Windows mit Python 3.13 und Nuitka installiert. set -euo pipefail VERSION="0.1.0" OUT_DIR="build/windows/HMS-MediaEngine-Portable-$VERSION" echo "=== HMS MediaEngine Windows Build v$VERSION ===" # 1. Python-Abhängigkeiten installieren echo "[1/5] Installiere Python-Abhängigkeiten..." uv sync # 2. Frontend bauen (statische Assets) echo "[2/5] Baue Web-Frontend..." cd apps/web corepack enable pnpm 2>/dev/null || true pnpm install --frozen-lockfile pnpm build cd ../.. # 3. Rust-Renderkern bauen (nur wenn cargo verfügbar; sonst Überspringen) echo "[3/5] Baue Rust-Renderkern..." if command -v cargo >/dev/null 2>&1; then cd native/render_bridge cargo build --release cd ../.. RENDERER_DLL="native/render_bridge/target/release/hms_render_bridge.dll" if [ -f "$RENDERER_DLL" ]; then echo " Render-Bridge DLL gefunden: $RENDERER_DLL" fi else echo " WARNUNG: cargo nicht gefunden; Rust-Renderkern wird nicht gebaut" echo " (Wird im Windows-Durchlauf nachgeholt, ADR-0004)" fi # 4. Nuitka Onefolder-Build echo "[4/5] Baue portable Onefolder-Ausgabe (Nuitka)..." rm -rf "$OUT_DIR" mkdir -p "$OUT_DIR" python -m nuitka \ --standalone \ --onefile=False \ --output-dir="$OUT_DIR" \ --include-package=hms_protocol \ --include-package=hms_domain \ --include-package=hms_parameter \ --include-package=hms_artnet \ --include-package=hms_cluster \ --include-package=hms_persistence \ --include-package=hms_plugin_sdk \ --include-package=hms_media \ --include-package=hms_audio \ --include-package=hms_content_sync \ --include-package=hms_capabilities \ --include-package=hms_adaptive \ --include-package=hms_renderer \ --include-package=hms_control_server \ --include-package=hms_launcher \ --include-data-dir=apps/web/dist=web \ --windows-console-mode=disable \ --company-name="HMS" \ --product-name="HMS MediaEngine" \ --file-version="$VERSION" \ --product-version="$VERSION" \ apps/launcher/hms_launcher/__main__.py # 5. GStreamer-Runtime und portable Struktur echo "[5/5] Kopiere GStreamer-Runtime und portable Struktur..." # PORTABLE_MODE Markierung (§9) touch "$OUT_DIR/PORTABLE_MODE" # GStreamer (MSVC 1.28.6, ADR-0002) # Erwartet: GStreamer-MSVC-Installationspfad oder GSTREAMER_1_0_ROOT_MSVC_X86_64 if [ -n "${GSTREAMER_1_0_ROOT_MSVC_X86_64:-}" ]; then mkdir -p "$OUT_DIR/runtime/gstreamer" cp -r "$GSTREAMER_1_0_ROOT_MSVC_X86_64/bin" "$OUT_DIR/runtime/gstreamer/bin" cp -r "$GSTREAMER_1_0_ROOT_MSVC_X86_64/lib/gstreamer-1.0" "$OUT_DIR/runtime/gstreamer/lib/" echo " GStreamer 1.28.6 gebündelt (ADR-0002)" else echo " WARNUNG: GSTREAMER_1_0_ROOT_MSVC_X86_64 nicht gesetzt" echo " GStreamer wird nicht gebündelt; im Windows-Durchlauf ergänzen" fi # Portable Verzeichnisstruktur (§9) mkdir -p "$OUT_DIR/plugins/builtin" "$OUT_DIR/plugins/user" mkdir -p "$OUT_DIR/projects" "$OUT_DIR/media" "$OUT_DIR/logs" mkdir -p "$OUT_DIR/userdata/database" "$OUT_DIR/userdata/cache" \ "$OUT_DIR/userdata/identity" "$OUT_DIR/userdata/sync-staging" \ "$OUT_DIR/userdata/thumbnails" "$OUT_DIR/userdata/plugin-cache" mkdir -p "$OUT_DIR/config" "$OUT_DIR/licenses" # Plugin-Dateien kopieren cp -r plugins/builtin/generators "$OUT_DIR/plugins/builtin/" cp -r plugins/builtin/filters "$OUT_DIR/plugins/builtin/" # Standardkonfiguration cat > "$OUT_DIR/config/app.toml" << 'EOF' [hms] bind_host = "127.0.0.1" default_port = 8000 open_browser = true EOF # SHA-256-Prüfsumme echo "Erzeuge SHA-256-Prüfsumme..." cd "build/windows" if command -v sha256sum >/dev/null 2>&1; then find "HMS-MediaEngine-Portable-$VERSION" -type f -exec sha256sum {} + > "HMS-MediaEngine-Portable-$VERSION.sha256" echo " Prüfsumme: HMS-MediaEngine-Portable-$VERSION.sha256" fi # ZIP erstellen echo "Erstelle Release-ZIP..." if command -v zip >/dev/null 2>&1; then zip -r "HMS-MediaEngine-Portable-$VERSION.zip" "HMS-MediaEngine-Portable-$VERSION" echo " Release: build/windows/HMS-MediaEngine-Portable-$VERSION.zip" fi echo "=== Build abgeschlossen ===" echo "Ausgabe: $OUT_DIR" echo "" echo "Hinweis: Dieser Build ist ein Dev-Build ohne GPU-Validierung (ADR-0008)." echo "Gate-0-Messungen (D3D11, Framezeiten, DMX-Latenz) laufen auf echter Hardware."