use std::env;
use std::path::PathBuf;
fn get_lib_path(nixl_root_path: &str, arch: &str) -> String {
let os_info = os_info::get();
match os_info.os_type() {
os_info::Type::Redhat
| os_info::Type::RedHatEnterprise
| os_info::Type::CentOS
| os_info::Type::Fedora => {
format!("{}/lib64", nixl_root_path)
}
os_info::Type::Ubuntu | os_info::Type::Debian => {
format!("{}/lib/{}-linux-gnu", nixl_root_path, arch)
}
os_info::Type::Arch => {
format!("{}/lib", nixl_root_path)
}
_ => {
let possible_paths = [
format!("{}/lib64", nixl_root_path),
format!("{}/lib/{}-linux-gnu", nixl_root_path, arch),
format!("{}/lib", nixl_root_path),
];
println!(
"cargo:warning=Unknown Linux distribution: {}. Trying common library paths.",
os_info
);
for path in possible_paths.iter() {
if std::path::Path::new(path).exists() {
return path.clone();
}
}
format!("{}/lib64", nixl_root_path)
}
}
}
fn get_arch() -> String {
let os_info = os_info::get();
match os_info.architecture().unwrap_or("x86_64").to_string() {
arch if arch == "x86_64" => "x86_64".to_string(),
arch if arch == "aarch64" || arch == "arm64" => "aarch64".to_string(),
other => panic!("Unsupported architecture: {}", other),
}
}
fn main() {
let nixl_root_path =
env::var("NIXL_PREFIX").unwrap_or_else(|_| "/opt/nvidia/nvda_nixl".to_string());
let nixl_include_path = format!("{}/include", nixl_root_path);
let arch = get_arch();
let nixl_lib_path = get_lib_path(&nixl_root_path, &arch);
let etcd_enabled = env::var("HAVE_ETCD").map(|v| v != "0").unwrap_or(false);
println!("cargo:rustc-link-search={}", nixl_lib_path);
let mut cc_builder = cc::Build::new();
cc_builder
.cpp(true)
.compiler("g++") .file("wrapper.cpp")
.flag("-std=c++17")
.flag("-fPIC")
.include(&nixl_include_path)
.include("../../api/cpp")
.include("../../infra")
.include("../../core")
.flag("-Wno-unused-parameter")
.flag("-Wno-unused-variable");
if etcd_enabled {
cc_builder.define("HAVE_ETCD", "1");
}
cc_builder.compile("wrapper");
if etcd_enabled {
println!("cargo:rustc-link-lib=dylib=etcd-cpp-api");
}
println!("cargo:rustc-link-lib=dylib=stream");
println!("cargo:rustc-link-lib=dylib=nixl_common");
println!("cargo:rustc-link-lib=dylib=nixl");
println!("cargo:rustc-link-lib=dylib=nixl_build");
println!("cargo:rustc-link-lib=dylib=nixl_common");
println!("cargo:rustc-link-lib=dylib=serdes");
println!("cargo:rustc-link-lib=dylib=stream");
println!("cargo:rustc-link-lib=dylib=ucx_utils");
println!("cargo:rustc-link-lib=dylib=stdc++");
println!("cargo:rustc-link-search=native={}", nixl_lib_path);
println!("cargo:rerun-if-changed=wrapper.h");
println!("cargo:rerun-if-changed=wrapper.cpp");
println!("cargo:rerun-if-env-changed=HAVE_ETCD");
let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
bindgen::Builder::default()
.header("wrapper.h")
.generate()
.expect("Unable to generate bindings")
.write_to_file(out_path.join("bindings.rs"))
.expect("Couldn't write bindings!");
}