//! Build-Hook: kompiliert geänderte Ink-Dialoge automatisch beim Cargo-Build. //! //! Reines „Wann"-Stück — das eigentliche Bauen macht `tools/build-dialogues.sh` //! (und bleibt von Hand aufrufbar). Hier melden wir Cargo nur, wann es uns //! erneut ausführen soll, und stoßen das Skript an. //! //! Cargo führt build.rs ausschließlich dann erneut aus, wenn eine der unten //! via `rerun-if-changed` gemeldeten Dateien sich ändert. Unveränderte //! Rebuilds kosten also nichts; nur nach einer `.ink`-Änderung läuft //! inklecate (inkrementell nur für die betroffene Datei). use std::path::Path; use std::process::Command; fn main() { let root = env!("CARGO_MANIFEST_DIR"); let script = Path::new(root).join("tools/build-dialogues.sh"); let ink_dir = Path::new(root).join("assets/interactions"); // Wann soll Cargo build.rs erneut ausführen? println!("cargo:rerun-if-changed=tools/build-dialogues.sh"); println!("cargo:rerun-if-changed=tools/inklecate"); // Verzeichnis-mtime fängt neu hinzugekommene/gelöschte .ink-Dateien. println!("cargo:rerun-if-changed=assets/interactions"); // Inhaltsänderungen einzelner .ink-Dateien einzeln melden. if let Ok(entries) = std::fs::read_dir(&ink_dir) { for entry in entries.flatten() { let p = entry.path(); if p.extension().and_then(|s| s.to_str()) == Some("ink") { println!("cargo:rerun-if-changed={}", p.display()); } } } // Skript ausführen. Ausgabe einsammeln, damit ein Dialog-Fehler sichtbar // wird (Cargo blendet Build-Script-stdout sonst aus). match Command::new("bash").arg(&script).output() { Ok(out) if out.status.success() => { /* still bei Erfolg */ } Ok(out) => { let stdout = String::from_utf8_lossy(&out.stdout); let stderr = String::from_utf8_lossy(&out.stderr); for line in stdout.lines().chain(stderr.lines()) { println!("cargo:warning={line}"); } panic!( "Dialog-Build fehlgeschlagen — siehe Warnungen oben. \ Einzeln debuggen: ./tools/build-dialogues.sh" ); } Err(e) => { // bash/Skript nicht startbar (z.B. fremdes OS): den Build nicht // blockieren, nur warnen — die committeten .ink.json reichen. println!( "cargo:warning=Dialog-Build übersprungen ({e}). \ Bei Bedarf von Hand: ./tools/build-dialogues.sh" ); } } }