use bindgen; use std::process; fn main() { linking_info(); build_pmemkv_bindings(); } fn linking_info() { println!("cargo:rustc-link-lib=pmemkv"); println!("cargo:rustc-link-lib=tbb"); } const WHITELIST_FUNCTION: &'static [&'static str] = &["kvengine_.*"]; const WHITELIST_TYPES: &'static [&'static str] = &["KVEngine", "KVStatus"]; fn build_pmemkv_bindings() { let mut bindings = bindgen::Builder::default() .header("libpmemkv.h") .clang_arg("-I") .clang_arg(concat!(env!("CARGO_MANIFEST_DIR"), "/include")); for func in WHITELIST_FUNCTION { bindings = bindings.whitelist_function(func); } for ty in WHITELIST_TYPES { bindings = bindings.whitelist_type(ty); } bindings = bindings .derive_debug(true) .impl_debug(true) .derive_default(true) .derive_partialeq(true) .impl_partialeq(true) .derive_eq(true) .derive_partialord(true) .derive_ord(true) .derive_hash(true) .rustfmt_bindings(true); let builder = bindings .generate() .expect("Should generate PMEMKV API bindings OK"); builder .write_to_file( ::std::path::PathBuf::from(::std::env::var_os("OUT_DIR").unwrap()).join("bindings.rs"), ) .expect("Couldn't write pmemkv bindings!"); let have_working_rustfmt = process::Command::new("rustup") .args(&["run", "nightly", "rustfmt", "--version"]) .stdout(process::Stdio::null()) .stderr(process::Stdio::null()) .status() .ok() .map_or(false, |status| status.success()); if !have_working_rustfmt { println!( " The latest `rustfmt` is required to format the generated bindings. Install `rustfmt` with: $ rustup component add rustfmt-preview $ rustup update " ); } }