sim/build.rs

76 lines
2.5 KiB
Rust

// Builds the Leptos UI (ui/) to wasm and generates the JS bindings, so a plain `cargo run` works.
// The result lands in OUT_DIR/ui-pkg and is embedded into the binary by src/main.rs.
use std::path::{Path, PathBuf};
use std::process::Command;
use std::{env, fs};
fn main() {
for p in ["ui/src", "ui/js", "ui/style.css", "ui/Cargo.toml"] {
println!("cargo:rerun-if-changed={p}");
}
let out = PathBuf::from(env::var_os("OUT_DIR").expect("OUT_DIR"));
let pkg = out.join("ui-pkg");
let release = env::var("PROFILE").is_ok_and(|p| p == "release");
ensure_wasm_target();
// A separate target dir avoids deadlocking on the outer build's lock.
let target_dir = out.join("ui-target");
let mut cargo = Command::new(env::var_os("CARGO").unwrap_or_else(|| "cargo".into()));
cargo
.args([
"build",
"--manifest-path",
"ui/Cargo.toml",
"--target",
"wasm32-unknown-unknown",
])
.env("CARGO_TARGET_DIR", &target_dir)
// Host rustflags (e.g. -fuse-ld=lld) break the wasm link.
.env_remove("CARGO_ENCODED_RUSTFLAGS")
.env_remove("RUSTFLAGS");
if release {
cargo.arg("--release");
}
let status = cargo
.status()
.expect("failed to run cargo for the ui crate");
assert!(
status.success(),
"building ui/ failed (see the cargo output above); the wasm32-unknown-unknown target must be installed: rustup target add wasm32-unknown-unknown"
);
let profile = if release { "release" } else { "debug" };
let wasm = target_dir
.join("wasm32-unknown-unknown")
.join(profile)
.join("ui.wasm");
let _ = fs::remove_dir_all(&pkg);
wasm_bindgen_cli_support::Bindgen::new()
.input_path(&wasm)
.web(true)
.expect("bindgen target")
.out_name("ui")
.typescript(false)
.generate(&pkg)
.expect("wasm-bindgen failed");
}
fn ensure_wasm_target() {
let rustc = env::var_os("RUSTC").unwrap_or_else(|| "rustc".into());
let sysroot = Command::new(rustc)
.args(["--print", "sysroot"])
.output()
.ok()
.and_then(|o| String::from_utf8(o.stdout).ok())
.map(|s| PathBuf::from(s.trim()));
let installed = sysroot
.as_deref()
.is_some_and(|s: &Path| s.join("lib/rustlib/wasm32-unknown-unknown").exists());
if !installed {
let _ = Command::new("rustup")
.args(["target", "add", "wasm32-unknown-unknown"])
.status();
}
}