Files
snow_trail/build.rs
2026-03-28 10:34:19 +01:00

89 lines
2.1 KiB
Rust

use std::path::Path;
use std::process::Command;
fn main()
{
compile_ink_stories();
let wesl = wesl::Wesl::new("src/shaders");
wesl.build_artifact(&"package::main".parse().unwrap(), "main");
wesl.build_artifact(&"package::shadow".parse().unwrap(), "shadow");
}
fn compile_ink_stories()
{
let dialogs_dir = Path::new("assets/dialogs");
if !dialogs_dir.exists()
{
return;
}
let inklecate = Path::new("tools/inklecate.dll");
if !inklecate.exists()
{
eprintln!("cargo:warning=tools/inklecate.dll not found — ink stories will not be compiled");
return;
}
let entries = match std::fs::read_dir(dialogs_dir)
{
Ok(e) => e,
Err(_) => return,
};
for entry in entries.flatten()
{
let path = entry.path();
if path.extension().and_then(|e| e.to_str()) != Some("ink")
{
continue;
}
let ink_path = path.to_str().unwrap();
let json_path = format!("{}.json", ink_path);
println!("cargo:rerun-if-changed={ink_path}");
let ink_modified = std::fs::metadata(ink_path).and_then(|m| m.modified()).ok();
let json_modified = std::fs::metadata(&json_path)
.and_then(|m| m.modified())
.ok();
let needs_compile = match (ink_modified, json_modified)
{
(Some(ink_time), Some(json_time)) => ink_time > json_time,
_ => true,
};
if !needs_compile
{
continue;
}
println!("cargo:warning=Compiling {ink_path}");
let status = Command::new("dotnet")
.args([inklecate.to_str().unwrap(), "-o", &json_path, ink_path])
.status();
match status
{
Ok(s) if s.success() =>
{
println!("cargo:warning=Compiled {ink_path}{json_path}");
}
Ok(s) =>
{
println!("cargo:warning=inklecate exited with {s} for {ink_path}");
}
Err(e) =>
{
println!("cargo:warning=Failed to run dotnet inklecate: {e}");
}
}
}
}