use std::env;
use std::path::PathBuf;
use std::process::Command;
fn main() {
let mut pkgconf_args = vec!["--cflags", "--libs"];
#[cfg(feature = "static")]
pkgconf_args.push("--static");
pkgconf_args.push("r_core");
let cfg = Command::new("pkg-config")
.args(pkgconf_args)
.output()
.expect("Can't find r_core")
.stdout;
let cfg_str = String::from_utf8(cfg).unwrap();
let mut flags: Vec<String> = Vec::new();
for f in cfg_str.split(' ') {
if let Some(include) = f.strip_prefix("-I") {
flags.push(String::from(f));
println!("cargo:include={include}");
} else if let Some(path) = f.strip_prefix("-L") {
println!("cargo:rustc-link-search=native={path}");
} else if let Some(lib) = f.strip_prefix("-l") {
let skip = cfg!(feature = "static") && lib.starts_with("r_");
if !skip {
println!("cargo:rustc-link-lib=dylib={lib}");
}
} else if f.ends_with(".a") {
println!("cargo:rustc-link-arg={f}")
} else {
println!("cargo:warning=Unknown flag from pkg-config: {f}");
}
}
println!("cargo:rerun-if-changed=wrapper.h");
let bindings = bindgen::Builder::default()
.header("wrapper.h")
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
.allowlist_function("r_.*")
.allowlist_function("sdb_.*")
.blocklist_item("IPPORT_RESERVED")
.clang_args(flags)
.derive_default(true)
.generate()
.expect("Unable to generate bindings");
let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
bindings
.write_to_file(out_path.join("bindings.rs"))
.expect("Couldn't write bindings!");
}