extern crate bindgen;
use std::env;
use std::path::PathBuf;
use std::path::Path;
use std::{fs, io};
fn scan_dir(dir: &Path, files: &mut Vec<PathBuf>) -> io::Result<()> {
if dir.is_dir() {
for entry in fs::read_dir(dir)? {
let entry = entry?;
let path = entry.path();
if path.is_file() {
let file: PathBuf = entry.path();
match file.to_str() {
Some(filename) => {
if filename.ends_with(".c") || filename.ends_with(".cu") {
files.push(file);
}
}
None => {}
}
}
}
}
Ok(())
}
fn main() {
let src_dir = String::from("zfp-1.0.0");
let mut src_files: Vec<PathBuf> = Vec::new();
#[cfg(feature = "cuda")]
let mut cuda_files: Vec<PathBuf> = Vec::new();
let _ = scan_dir(Path::new(&format!("{}/src", src_dir)), &mut src_files);
#[cfg(feature = "cuda")]
let _ = scan_dir(
Path::new(&format!("{}/src/cuda_zfp", src_dir)),
&mut cuda_files,
);
#[cfg(not(feature = "cuda"))]
cc::Build::new()
.flag("-O3")
.include(format!("{}/include", src_dir))
.files(src_files)
.compile("zfp");
#[cfg(feature = "cuda")]
cc::Build::new()
.flag("-O3")
.define("ZFP_WITH_CUDA", "ON")
.cuda(true)
.include(format!("{}/include", src_dir))
.files(src_files)
.files(cuda_files)
.compile("zfp");
println!("cargo:rustc-link-lib=zfp");
let bindings = bindgen::Builder::default()
.blocklist_type("max_align_t")
.header("wrapper.h")
.clang_arg("-I")
.clang_arg(format!("{}/include", src_dir))
.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!");
}