use std::env;
use std::path::{Path, PathBuf};
fn main() {
println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rerun-if-env-changed=LIBNVINFER_PATH");
println!("cargo:rerun-if-env-changed=CARGO_FEATURE_TENSORRT_LINK");
let link_enabled = env::var_os("CARGO_FEATURE_TENSORRT_LINK").is_some();
if !link_enabled {
return;
}
let onnx_enabled = env::var_os("CARGO_FEATURE_TENSORRT_ONNX").is_some();
let probe = probe_libnvinfer().unwrap_or_else(|| {
panic!(
"atomr-accel-tensorrt: libnvinfer.so not found.\n\
Set LIBNVINFER_PATH (directory or full path), or install TensorRT \
from https://developer.nvidia.com/tensorrt and ensure libnvinfer.so \
is on the system library path. Probed: $LIBNVINFER_PATH, \
/usr/lib/x86_64-linux-gnu, /usr/local/cuda/lib64, /usr/local/lib."
)
});
println!("cargo:rustc-link-search=native={}", probe.display());
println!("cargo:rustc-link-lib=dylib=nvinfer");
if onnx_enabled {
println!("cargo:rustc-link-lib=dylib=nvonnxparser");
}
}
fn probe_libnvinfer() -> Option<PathBuf> {
if let Ok(env_path) = env::var("LIBNVINFER_PATH") {
let p = PathBuf::from(&env_path);
if dir_contains_libnvinfer(&p) {
return Some(p);
}
if p.is_file()
&& p.file_name()
.and_then(|n| n.to_str())
.map(|n| n.starts_with("libnvinfer"))
.unwrap_or(false)
{
return p.parent().map(Path::to_path_buf);
}
}
for candidate in [
"/usr/lib/x86_64-linux-gnu",
"/usr/local/cuda/lib64",
"/usr/local/lib",
] {
let p = PathBuf::from(candidate);
if dir_contains_libnvinfer(&p) {
return Some(p);
}
}
None
}
fn dir_contains_libnvinfer(dir: &Path) -> bool {
if !dir.is_dir() {
return false;
}
let Ok(rd) = std::fs::read_dir(dir) else {
return false;
};
for entry in rd.flatten() {
if let Some(name) = entry.file_name().to_str() {
if name.starts_with("libnvinfer") && name.contains(".so") {
return true;
}
}
}
false
}