use std::env;
use std::path::PathBuf;
fn main() {
let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
let mut base_dir = manifest_dir.join("sppark");
if !base_dir.exists() {
base_dir = manifest_dir
.parent()
.expect("can't access parent of current directory")
.into();
println!(
"cargo:rerun-if-changed={}",
base_dir.join("ec").to_string_lossy()
);
println!(
"cargo:rerun-if-changed={}",
base_dir.join("ff").to_string_lossy()
);
println!(
"cargo:rerun-if-changed={}",
base_dir.join("ntt").to_string_lossy()
);
println!(
"cargo:rerun-if-changed={}",
base_dir.join("msm").to_string_lossy()
);
println!(
"cargo:rerun-if-changed={}",
base_dir.join("util").to_string_lossy()
);
}
println!("cargo:ROOT={}", base_dir.to_string_lossy());
let nvcc = match env::var("NVCC") {
Ok(var) => which::which(var),
Err(_) => which::which("nvcc"),
};
if nvcc.is_ok() {
let cuda_version = std::process::Command::new(nvcc.unwrap())
.arg("--version")
.output()
.expect("impossible");
if !cuda_version.status.success() {
panic!("{:?}", cuda_version);
}
let cuda_version = String::from_utf8(cuda_version.stdout).unwrap();
let x = cuda_version
.find("release ")
.expect("can't find \"release X.Y,\" in --version output")
+ 8;
let y = cuda_version[x..]
.find(",")
.expect("can't parse \"release X.Y,\" in --version output");
let v = cuda_version[x..x + y].parse::<f32>().unwrap();
if v < 11.4 {
panic!("Unsupported CUDA version {} < 11.4", v);
}
let util_dir = base_dir.join("util");
let mut nvcc = cc::Build::new();
nvcc.cuda(true);
nvcc.include(base_dir);
nvcc.file(util_dir.join("all_gpus.cpp"))
.compile("sppark_cuda");
println!("cargo:rustc-cfg=feature=\"cuda\"");
}
println!("cargo:rerun-if-env-changed=NVCC");
}