use std::env;
use std::path::PathBuf;
fn main() {
println!("cargo:rerun-if-changed=src/ffi.rs");
println!("cargo:rerun-if-changed=src/context.rs");
println!("cargo:rerun-if-changed=src/types.rs");
println!("cargo:rerun-if-changed=src/lib.rs");
println!("cargo:rerun-if-changed=cbindgen.toml");
println!("cargo:rerun-if-changed=build.rs");
if env::var_os("NODE_APP_API_SKIP_CBINDGEN").is_some() {
println!("cargo:warning=node-app-api: skipping cbindgen (NODE_APP_API_SKIP_CBINDGEN set)");
return;
}
let crate_dir = match env::var("CARGO_MANIFEST_DIR") {
Ok(dir) => PathBuf::from(dir),
Err(_) => {
println!("cargo:warning=node-app-api: CARGO_MANIFEST_DIR not set, skipping cbindgen");
return;
}
};
let workspace_root = match crate_dir.parent().and_then(|p| p.parent()) {
Some(p) => p.to_path_buf(),
None => {
println!(
"cargo:warning=node-app-api: cannot resolve workspace root from {}, skipping cbindgen",
crate_dir.display()
);
return;
}
};
let header_dir = workspace_root.join("core").join("host-abi-v1").join("include");
let header_path = header_dir.join("node-host-api-v1.h");
if !header_dir.exists() {
if let Err(err) = std::fs::create_dir_all(&header_dir) {
println!(
"cargo:warning=node-app-api: failed to create {}: {}; skipping cbindgen",
header_dir.display(),
err
);
return;
}
}
let config = match cbindgen::Config::from_file(crate_dir.join("cbindgen.toml")) {
Ok(cfg) => cfg,
Err(err) => {
println!(
"cargo:warning=node-app-api: failed to load cbindgen.toml: {}",
err
);
return;
}
};
match cbindgen::Builder::new()
.with_crate(&crate_dir)
.with_config(config)
.generate()
{
Ok(bindings) => {
bindings.write_to_file(&header_path);
println!(
"cargo:warning=node-app-api: regenerated {}",
header_path.display()
);
}
Err(err) => {
println!(
"cargo:warning=node-app-api: cbindgen generation failed: {}",
err
);
}
}
}