1use std::{
2 env::{self, var, VarError},
3 path::PathBuf,
4};
5
6const DEFAULT_OPENCL_PATH: &str = "/usr";
7
8pub fn include_hip() {
26 if env::var("DOCS_RS").is_err() && !cfg!(doc) {
27 let paths = find_hip_root_dirs();
28 if paths.is_empty() {
29 panic!("Could not find a hip installation");
30 }
31 for path in paths {
32 println!("cargo:rustc-link-search=native={}/lib", path.display());
33 }
34
35 println!("cargo:rustc-link-lib=dylib=amdhip64");
36 println!("cargo:rerun-if-changed=build.rs");
37 println!("cargo:rerun-if-env-changed=CUDA_LIBRARY_PATH");
38 println!("cargo:rerun-if-env-changed=CUDA_ROOT");
39 println!("cargo:rerun-if-env-changed=CUDA_PATH");
40 println!("cargo:rerun-if-env-changed=CUDA_TOOLKIT_ROOT_DIR");
41 println!("cargo:rerun-if-env-changed=HIP_PATH");
42 println!("cargo:rerun-if-env-changed=HCC_ROCCLR_HOME");
43 println!("cargo:rerun-if-env-changed=HSA_PATH");
44 println!("cargo:rerun-if-env-changed=ROCM_PATH");
45 }
48}
49
50pub fn read_env() -> Vec<PathBuf> {
51 let split_char = if cfg!(target_os = "windows") {
52 ";"
53 } else {
54 ":"
55 };
56 match var("OPENCL_LIBRARY_PATH") {
58 Ok(path) => {
61 path.split(split_char)
62 .map(PathBuf::from)
63 .filter(|pb| pb.exists())
65 .collect()
66 }
67 Err(VarError::NotPresent) => DEFAULT_OPENCL_PATH
68 .split(split_char)
69 .map(PathBuf::from)
70 .filter(|pb| pb.exists())
72 .collect(),
73 Err(e @ VarError::NotUnicode(_)) => panic!("{}: HIP_PATH: {}", env!("CARGO_PKG_NAME"), e),
74 }
75}
76
77pub fn find_hip_root_dirs() -> Vec<PathBuf> {
78 let mut candidates = read_env();
79 candidates.push(PathBuf::from("/opt/cuda"));
80 candidates.push(PathBuf::from("/opt/cuda/targets/x86_64-linux"));
81 candidates.push(PathBuf::from("/opt/rocm"));
82 candidates.push(PathBuf::from("/opt/rocm/opencl"));
83 candidates.push(PathBuf::from("/usr"));
84
85 let mut valid_paths = vec![];
86 for base in &candidates {
87 let header = base.join("include/CL/cl.h");
88 let lib = PathBuf::from(base).join("lib");
89 if lib.is_dir() && header.is_file() {
90 valid_paths.push(base.clone());
91 }
92 }
93 valid_paths
94}
95