extern crate bindgen;
use std::{env, path::PathBuf};
fn main() {
let bellman_cuda_path = if let Ok(path) = std::env::var("BELLMAN_CUDA_DIR") {
path
} else {
todo!("set BELLMAN_CUDA_DIR=$PWD")
};
generate_bindings(&bellman_cuda_path);
#[cfg(not(target_os = "macos"))]
link_multiexp_library(&bellman_cuda_path); }
fn generate_bindings(bellman_cuda_path: &str) {
println!("generating bindings");
let header_file = &format!("{}/src/bellman-cuda.h", bellman_cuda_path);
const OUT_FILE: &str = "bindings.rs";
println!("cargo:rerun-if-changed={}", header_file);
let bindings = bindgen::Builder::default()
.header(header_file)
.parse_callbacks(Box::new(bindgen::CargoCallbacks))
.generate()
.expect("Unable to generate bindings");
let out_path = PathBuf::from(format!(
"{}/{}",
env::current_dir().unwrap().to_str().unwrap(),
"src"
));
println!("out path {:?}", out_path.to_str());
bindings
.write_to_file(out_path.join(OUT_FILE))
.expect("Couldn't write bindings!");
}
fn link_multiexp_library(bellman_cuda_path: &str) {
let kind = "static";
let name = "bellman-cuda";
println!("cargo:rustc-link-lib=dylib=stdc++");
println!("cargo:rustc-link-search=native=/usr/local/cuda/lib64");
println!("cargo:rustc-link-lib=dylib=cudart");
println!("cargo:rustc-link-lib=static=cudadevrt");
println!(
"cargo:rustc-link-search=native={}/build/src",
bellman_cuda_path
);
println!("cargo:rustc-link-lib={}={}", kind, name);
}