extern crate bindgen;
extern crate pkg_config;
use std::env;
use std::path::{Path, PathBuf};
use std::process::Command;
fn try_system_parasail() -> Result<pkg_config::Library, pkg_config::Error> {
let mut cfg = pkg_config::Config::new();
match cfg.atleast_version("2.4.2").probe("parasail") {
Ok(lib) => {
for include in &lib.include_paths {
println!("cargo:root={}", include.display());
}
Ok(lib)
},
Err(e) => {
println!("cargo:warning=Could not find system parasail: {e}",);
Err(e)
}
}
}
fn main() {
let project_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
let out_dir = env::var("OUT_DIR").unwrap();
let parasail_dir = PathBuf::from(&project_dir).join("parasail")
.canonicalize()
.expect("Failed to find parasail directory");
let parasail_build = PathBuf::from(&out_dir).join("parasail_build");
std::fs::create_dir_all(¶sail_build).unwrap();
let headers_path = parasail_dir.join("parasail.h");
let headers_path_str = headers_path.to_str().unwrap();
assert!(Command::new("cmake")
.args(&["-DBUILD_SHARED_LIBS=OFF", parasail_dir.to_str().unwrap()])
.current_dir(¶sail_build)
.status()
.unwrap()
.success(), "Failed to cmake"
);
assert!(Command::new("make")
.current_dir(¶sail_build)
.status()
.unwrap()
.success(), "Failed to make"
);
let bindings = bindgen::Builder::default()
.header(headers_path_str)
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
.generate()
.expect("Unable to generate bindings");
let out_path = PathBuf::from(out_dir);
bindings
.write_to_file(out_path.join("parasail_bindings.rs"))
.expect("Couldn't write bindings!");
}