use std::process::Command;
fn main() {
#[cfg(target_os = "macos")]
{
let out_dir = std::env::var("OUT_DIR").unwrap();
let lib_path = format!("{}/libstdc++.a", out_dir);
std::fs::write(&lib_path, b"!<arch>\n").expect("failed to create empty libstdc++.a");
println!("cargo:rustc-link-search=native={}", out_dir);
}
println!("cargo::rerun-if-env-changed=CUDARC_CUDA_VERSION");
println!("cargo::rerun-if-env-changed=PATH");
println!("cargo::rustc-check-cfg=cfg(cuda_mem_location_union)");
let is_union = match cuda_version() {
Some((major, minor)) => (major, minor) >= (13, 2),
None => true, };
if is_union {
println!("cargo::rustc-cfg=cuda_mem_location_union");
}
}
fn cuda_version() -> Option<(u32, u32)> {
cuda_version_from_env().or_else(cuda_version_from_nvcc)
}
fn cuda_version_from_env() -> Option<(u32, u32)> {
let digits: u32 = std::env::var("CUDARC_CUDA_VERSION")
.ok()?
.trim()
.parse()
.ok()?;
Some((digits / 1000, (digits % 1000) / 10))
}
fn cuda_version_from_nvcc() -> Option<(u32, u32)> {
let output = Command::new("nvcc").arg("--version").output().ok()?;
if !output.status.success() {
return None;
}
let text = String::from_utf8_lossy(&output.stdout);
let release = text.split("release ").nth(1)?;
let version = release.split(',').next()?.trim();
let mut parts = version.split('.');
let major = parts.next()?.parse().ok()?;
let minor = parts.next()?.parse().ok()?;
Some((major, minor))
}