README.md 2.3 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# 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`