use std::{env, path::PathBuf, process::Command};
fn main() {
let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());
let target = env::var("TARGET").unwrap_or_else(|_| "wasm32-wasip1".to_string());
if !target.starts_with("wasm32") {
let stubs_root = manifest_dir.join("stubs");
let src_root = stubs_root.join("lib.rs");
if src_root.exists() {
println!("cargo:rerun-if-changed={}", src_root.display());
}
return;
}
println!("cargo:rerun-if-env-changed=TARGET");
println!("cargo:rerun-if-env-changed=RUSTUP_TOOLCHAIN");
println!("cargo:rerun-if-env-changed=RUSTFLAGS");
let stubs_root = manifest_dir.join("stubs");
let src_root = stubs_root.join("lib.rs");
println!("cargo:rerun-if-changed={}", src_root.display());
if let Ok(read_dir) = std::fs::read_dir(&stubs_root) {
for entry in read_dir.flatten() {
let p = entry.path();
if p.is_dir() {
if let Ok(inner) = std::fs::read_dir(&p) {
for e in inner.flatten() {
let pp = e.path();
if pp.extension().and_then(|s| s.to_str()) == Some("rs") {
println!("cargo:rerun-if-changed={}", pp.display());
}
}
}
} else if p.extension().and_then(|s| s.to_str()) == Some("rs") {
println!("cargo:rerun-if-changed={}", p.display());
}
}
}
let out_rlib = out_dir.join("libmiden_base_sys_stubs.a");
let status = Command::new("rustc")
.arg("--crate-name")
.arg("miden_base_sys_stubs")
.arg("--edition=2024")
.arg("--crate-type=rlib")
.arg("--target")
.arg(&target)
.arg("-C")
.arg("opt-level=1")
.arg("-C")
.arg("codegen-units=1")
.arg("-C")
.arg("debuginfo=0")
.arg("-Z")
.arg("merge-functions=disabled")
.arg("-C")
.arg("target-feature=+bulk-memory,+wide-arithmetic")
.arg("-o")
.arg(&out_rlib)
.arg(&src_root)
.status()
.expect("failed to spawn rustc for base stubs object");
if !status.success() {
panic!("failed to compile miden-base-sys stubs object: {status}");
}
println!("cargo:rustc-link-search=native={}", out_dir.display());
println!("cargo:rustc-link-lib=miden_base_sys_stubs");
}