use std::path::Path;
fn main() {
println!("cargo:rerun-if-env-changed=OPENBLAS_LIB_DIR");
println!("cargo:rerun-if-changed=build.rs");
if let Ok(p) = std::env::var("OPENBLAS_LIB_DIR") {
if !p.is_empty() {
println!("cargo:rustc-link-search=native={p}");
return;
}
}
let candidates = [
"/usr/lib/x86_64-linux-gnu",
"/usr/lib/aarch64-linux-gnu",
"/usr/lib64",
"/usr/lib",
"/usr/local/opt/openblas/lib",
"/opt/homebrew/opt/openblas/lib",
];
for dir in candidates {
if has_openblas(dir) {
println!("cargo:rustc-link-search=native={dir}");
return;
}
}
if let Ok(entries) = std::fs::read_dir("/nix/store") {
for entry in entries.flatten() {
let name = entry.file_name();
let Some(s) = name.to_str() else { continue };
if !s.contains("-openblas-") {
continue;
}
let lib = entry.path().join("lib");
if has_openblas(&lib) {
println!("cargo:rustc-link-search=native={}", lib.display());
return;
}
}
}
println!("cargo:warning=dynvecdb: no openblas found; set OPENBLAS_LIB_DIR if linking fails");
}
fn has_openblas(dir: impl AsRef<Path>) -> bool {
let dir = dir.as_ref();
if !dir.is_dir() {
return false;
}
let Ok(entries) = std::fs::read_dir(dir) else {
return false;
};
for entry in entries.flatten() {
let name = entry.file_name();
let Some(s) = name.to_str() else { continue };
if s.starts_with("libopenblas.") {
return true;
}
}
false
}