hipster/
lib.rs

1use std::{
2    env::{self, var, VarError},
3    path::PathBuf,
4};
5
6const DEFAULT_OPENCL_PATH: &str = "/usr";
7
8// fn main() {
9//     let paths = find_opencl_root_dirs();
10//     if paths.is_empty() {
11//         panic!("Could not find an OpenCL installation.")
12//     }
13
14//     for path in paths.iter() {
15//         println!(
16//             "cargo:rustc-link-search=native={}",
17//             path.join("lib").display()
18//         );
19//     }
20//     println!("cargo:rustc-link-lib=dylib=OpenCL");
21//     println!("cargo:rerun-if-changed=build.rs");
22//     println!("cargo:rerun-if-env-changed=OPENCL_LIBRARY_PATH");
23// }
24
25pub 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        // println!("cargo:rerun-if-env-changed=HIP_CLANG_PATH");
46        // println!("cargo:rerun-if-env-changed=DEVICE_LIB_PATH");
47    }
48}
49
50pub fn read_env() -> Vec<PathBuf> {
51    let split_char = if cfg!(target_os = "windows") {
52        ";"
53    } else {
54        ":"
55    };
56    // Link to OpenCL Headers. If HIP_PATH isn't supplied, use a default.
57    match var("OPENCL_LIBRARY_PATH") {
58        // The location of the libopencl can be hardcoded with the
59        // OPENCL_LIBRARY_PATH environment variable.
60        Ok(path) => {
61            path.split(split_char)
62                .map(PathBuf::from)
63                // Check that the path exists.
64                .filter(|pb| pb.exists())
65                .collect()
66        }
67        Err(VarError::NotPresent) => DEFAULT_OPENCL_PATH
68            .split(split_char)
69            .map(PathBuf::from)
70            // Check that the path exists.
71            .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