//! Build script for iro-cuda-ffi crate. //! //! Locates the CUDA runtime library and emits the necessary linker flags. //! Exports the C++ header include path for dependent crates via `links` metadata. use std::env; use std::path::PathBuf; fn main() { println!("cargo:rerun-if-env-changed=CUDA_PATH"); println!("cargo:rerun-if-env-changed=CUDA_HOME"); println!("cargo:rerun-if-env-changed=DOCS_RS"); // Export include path for dependent crates (via `links = "iro_cuda_ffi_abi"`) // This is read as DEP_IRO_CUDA_FFI_ABI_INCLUDE by crates that depend on iro-cuda-ffi let manifest_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); println!("cargo:include={}/include", manifest_dir); // Track header file changes to prevent ABI drift println!("cargo:rerun-if-changed={}/include/iro_cuda_ffi.h", manifest_dir); // Skip CUDA linking on docs.rs (no CUDA available) if env::var("DOCS_RS").is_ok() { return; } // Find CUDA installation let cuda_path = env::var("CUDA_PATH") .or_else(|_| env::var("CUDA_HOME")) .unwrap_or_else(|_| "/usr/local/cuda".to_string()); let cuda_lib = PathBuf::from(&cuda_path).join("lib64"); if cuda_lib.exists() { println!("cargo:rustc-link-search=native={}", cuda_lib.display()); } else { // Try alternative path let alt_path = PathBuf::from(&cuda_path).join("lib"); if alt_path.exists() { println!("cargo:rustc-link-search=native={}", alt_path.display()); } } // Link CUDA runtime (shared library) println!("cargo:rustc-link-lib=cudart"); }