extern crate bindgen;
use std::env;
use std::path::PathBuf;
use std::process::Command;
fn main() {
println!("cargo:rerun-if-changed=src/go_ffi/ffi.go");
let lib_out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
let mut cmd = Command::new("go");
cmd.current_dir("src/go_ffi") .envs(env::vars()) .args(&[
"build",
"--buildmode=c-archive", "-o",
format!("{}/{}", lib_out_path.display(), "libgoffi.a").as_str(),
]);
let status = cmd.status().expect("Failed to execute Go build command");
assert!(
status.success(),
"Go build failed with status: {:?}",
status
);
println!(
"Go build successful. Output: libgoffi.a and libgoffi.h in {}",
lib_out_path.display()
);
println!("cargo:rustc-link-search={}", lib_out_path.display());
println!("cargo:rustc-link-lib=static=goffi");
let bindings = bindgen::Builder::default()
.header(format!("{}/{}", lib_out_path.display(), "libgoffi.h").as_str())
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
.generate()
.expect("Unable to generate bindings");
let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
let bindings_file = out_path.join("api_bindings.rs");
bindings
.write_to_file(&bindings_file)
.expect("Couldn't write bindings!");
println!("Rust bindings generated to {}", bindings_file.display());
}