# DTK `HIP_CLANG_INCLUDE_PATH` 最小复现 ## 问题描述 DTK 的 `hip-config.cmake` 会为 `hip::device` 查找 clang resource include 目录,正常情况下应该得到类似路径: ```text /opt/dtk/llvm/lib/clang/17.0.0/include ``` 问题出现在编译器 wrapper 场景,例如 Spack。 当编译器路径以 `clang++` 结尾,但所在 prefix 下没有 `lib/clang/*/include` 时,`hip-config.cmake` 会错误地从 wrapper 路径推导 `HIP_CLANG_ROOT`,最终导致 `HIP_CLANG_INCLUDE_PATH` 变成 `HIP_CLANG_INCLUDE_PATH-NOTFOUND`。 ## 复现方式 这个 MRE 提供了一个名为 `clang++` 的假 wrapper: ```text fake-wrapper/bin/clang++ ``` 这个 wrapper 只转发到 `/usr/bin/c++`,但它所在 prefix 下没有 `lib/clang/*/include`。 把整个当前目录复制到干净的 DTK 容器中,进入该目录后运行: ```sh cmake -S . -B build-installed \ -DCMAKE_CXX_COMPILER="$PWD/fake-wrapper/bin/clang++" \ -Dhip_DIR=/opt/dtk/hip/lib/cmake/hip \ -DCMAKE_PREFIX_PATH="/opt/dtk;/opt/hyhal" ``` 预期输出包含: ```text HIP_CLANG_INCLUDE_PATH=HIP_CLANG_INCLUDE_PATH-NOTFOUND ERROR: HIP_CLANG_INCLUDE_PATH is NOTFOUND ``` 这说明 `find_package(hip CONFIG REQUIRED)` 已经拿到无效的 clang resource include 路径,并且这个 `NOTFOUND` 路径会继续通过 `hip::device` 传播给下游 CMake 项目。 ## 修复方案 需要直接修复 DTK 的 `hip-config.cmake` 生成逻辑,例如 `hip-config.cmake.in` 模板。这里暂时修改 `hip-config.cmake` 来绕过问题。 修复思路是不要只使用从 `HIP_CXX_COMPILER` 推导出的单一 `HIP_CLANG_ROOT`,而是维护多个候选 clang root,并在所有候选目录下查找 `lib/clang/*/include`。 候选目录至少应包含: - `${ROCM_PATH}/llvm` - `${PACKAGE_PREFIX_DIR}/../llvm` - 从 `HIP_CXX_COMPILER --version` 的 `InstalledDir` 推导出的 clang root - 从 `clang++` 编译器路径推导出的 clang root 修复后,如果找到了 DTK 自带 clang 的 resource include 目录,CMake 配置应输出类似: ```text HIP_CLANG_INCLUDE_PATH=/opt/dtk/llvm/lib/clang/17.0.0/include ``` 如果所有候选目录都找不到 `lib/clang/*/include`,`hip-config.cmake` 应直接给出明确的 `FATAL_ERROR`,并列出检查过的搜索路径,避免继续向下游导出 `HIP_CLANG_INCLUDE_PATH-NOTFOUND`。