mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-11-01 23:07:30 +00:00
## CI 实测暴露的下一层问题
上一版让 clang 做交叉编译后,安装步骤成功且**完全跳过 apt**(cmake/clang 都在
镜像里),但 `make check-csrc` 红在:
In file included from /usr/lib/llvm-18/lib/clang/18/include/stdint.h:52:
/usr/include/stdint.h:26:10: fatal error: 'bits/libc-header-start.h' file not found
真因:`clang --target=aarch64-linux-gnu` 切换的是**目标架构**,但系统头
仍按**宿主**(amd64)找 —— `bits/libc-header-start.h` 是 amd64 的布局,
aarch64 目标下不该用。本地能过是本机装了完整交叉 GCC,带来了
`/usr/aarch64-linux-gnu/include`。
## 试过但走不通的两条路(记录以免重复踩)
| 尝试 | 结果 |
|---|---|
| `-nostdinc` + clang 内建头 | ❌ clang 内建**不含 `string.h`**(那是 libc 的) |
| `-ffreestanding -nostdlibinc` | ❌ 同上,代码实际用了 `strlen`/`memcpy` |
## 采用:只装 libc 头,不装编译器
libc6-dev-arm64-cross 1.7 MB(+ libc6-arm64-cross、linux-libc-dev-arm64-cross)
gcc-aarch64-linux-gnu 含 cpp-13(10.8MB)+ gcc-16 等,实测下载卡死
既然只需要**头文件**(不做链接、不跑代码),就不该拉整个交叉 GCC。
装上头后 clang 就能完成 `-fsyntax-only`。
### Makefile 配合
`csrc-cross` 的 clang-target 模式现在自动探测并注入 aarch64 头路径:
for d in /usr/aarch64-linux-gnu/include /usr/include/aarch64-linux-gnu; do
[ -d "$d" ] && ARM64_SYSINC="$ARM64_SYSINC -isystem $d"
done
探测改用**真实头文件**(`#include <string.h>`)而非空 main,这样
"clang 版本支持 --target" 与 "aarch64 头是否齐备" 两个条件一起验;
缺头时明确 SKIP 并说清装哪个包(`libc6-dev-arm64-cross`)。
## 本地实测
| 验证 | 结果 |
|---|---|
| 有 aarch64 头时 | ✅ clang-target 通过(0 告警) |
| `make check-csrc` 全门禁 | ✅ 全部通过,0 SKIP |
| YAML 可解析 | ✅ |
| 上一版三条失败路径(编译器不存在/真写坏/正常) | ✅ 仍然正确(PIPESTATUS 修复未回退) |