5.1 KiB
5.1 KiB
从源码构建 IREE(写 pass 的前置)
2026-08-15。为了写自定义 pass,需要从源码构建 IREE 编译器(pip 包只有二进制,没有头文件和构建系统)。 记录完整步骤,方便复现。
1. 为什么要源码构建
pip 安装的 iree-base-compiler 是预编译二进制,没有头文件、没有 CMake 构建系统,无法编写和编译自定义 pass。
写 pass 需要:源码 + LLVM/MLIR 头文件 + 构建系统。
2. 前提(工具链)
sudo apt install clang-15 lld-15 # 编译器 + 链接器(Ubuntu 22.04 最新可用 clang)
.venv/bin/pip install ninja # ninja 也可用 pip 装(免 sudo)
- clang-15(不能用默认 clang=14,可能太老,IREE 3.11 用 LLVM 23)
- lld-15(快速链接,可选但推荐)
- ninja(构建生成器)
- cmake(系统已有)
3. 子模块
# 关键子模块:llvm-project(IREE fork,~1.5GB,最耗时)、flatcc(VM 字节码)
git submodule update --init --depth 1 third_party/llvm-project third_party/flatcc
只初始化编译所需的最小集合。写 pass 测试用 linalg 输入,不需要 stablehlo/torch-mlir 等子模块。
4. 配置(cmake)
cmake -G Ninja -B build/ -S . \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_C_COMPILER=clang-15 -DCMAKE_CXX_COMPILER=clang++-15 \
-DIREE_ENABLE_LLD=ON \
-DIREE_BUILD_TESTS=OFF -DIREE_BUILD_SAMPLES=OFF -DIREE_BUILD_PYTHON_BINDINGS=OFF \
-DIREE_TARGET_BACKEND_DEFAULTS=OFF -DIREE_TARGET_BACKEND_LLVM_CPU=ON \
-DIREE_HAL_DRIVER_DEFAULTS=OFF -DIREE_HAL_DRIVER_LOCAL_SYNC=ON -DIREE_HAL_DRIVER_LOCAL_TASK=ON
关键选项:
-DIREE_BUILD_TESTS/SAMPLES/PYTHON_BINDINGS=OFF—— 大幅缩减构建(只建编译器)-DIREE_TARGET_BACKEND_DEFAULTS=OFF + LLVM_CPU=ON—— 只保留 CPU 后端-DIREE_HAL_DRIVER_DEFAULTS=OFF + LOCAL_SYNC/TASK=ON—— 只保留 CPU 运行时驱动-DCMAKE_BUILD_TYPE=RelWithDebInfo—— 有调试信息 + 优化(写 pass 推荐)
5. 构建
# 只构建编译器工具(iree-compile + iree-opt),比全量快很多
cmake --build build/ --target iree-compile iree-opt -j 16
- 结果在
build/tools/iree-compile、build/tools/iree-opt iree-opt是测试 pass 的关键工具(单 pass 运行,无需完整编译管线)- 首次全量构建 ~30-60 分钟(16 核)
6. 验证
build/tools/iree-compile --version
build/tools/iree-opt --help
7. 写 pass 的流程(后续)
- 在某个 dialect 的
Transforms/下写 pass 的.cpp - 在对应
Passes.td里注册 pass(TableGen) - 在
CMakeLists.txt里加入源文件 - 重新构建(增量构建,快)
- 用
iree-opt --pass-name单测 pass
8. 备选:gcc 构建(不用 sudo)
如果没有 sudo 装 clang,可以用系统 gcc 11.4(支持 C++17):
cmake -G Ninja -B build/ -S . -DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DIREE_BUILD_TESTS=OFF -DIREE_BUILD_SAMPLES=OFF -DIREE_BUILD_PYTHON_BINDINGS=OFF \
-DIREE_TARGET_BACKEND_DEFAULTS=OFF -DIREE_TARGET_BACKEND_LLVM_CPU=ON \
-DIREE_HAL_DRIVER_DEFAULTS=OFF -DIREE_HAL_DRIVER_LOCAL_SYNC=ON -DIREE_HAL_DRIVER_LOCAL_TASK=ON
(gcc 是 IREE 官方"best effort"支持,能用但稍慢。)
9. 实际踩坑记录(本次构建的关键修复)
9.1 工具链版本
- cmake 3.22 太旧(需 3.26+)→
pip install cmake(4.4.2) - clang-15 需要 g++-12:系统只有
gcc-12(无g++-12)和libstdc++-11-dev,导致 clang-15 自动选 GCC 12 却找不到 C++ 头文件/libstdc++.so。 修复:sudo apt install g++-12(带libstdc++-12-dev) - lld:装了
lld-15但没有无版本号ld.lld。修复:软链接ln -sf /usr/bin/ld.lld-15 .venv/bin/ld.lld,并把.venv/bin加入 PATH
9.2 llvm-project 子模块用 tarball 而非 git
git 方式下载 llvm-project(1.5GB)在 VPN 下被 GitHub 限速(~30KB/s),改用 codeload tarball(280MB 压缩)+ 断点续传,快很多。但 git 不认 tarball 解压出的目录为子模块,导致 IREE 的子模块检查失败。
修复:把 build_tools/scripts/git/check_submodule_init.py 改成 no-op(本地构建,手动提供源码)。
9.3 只保留必要组件(大幅缩减构建)
最终配置命令:
cmake -G Ninja -B build/ -S . \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_C_COMPILER=clang-15 -DCMAKE_CXX_COMPILER=clang++-15 \
-DIREE_ENABLE_LLD=ON \
-DIREE_BUILD_TESTS=OFF -DIREE_BUILD_SAMPLES=OFF -DIREE_BUILD_PYTHON_BINDINGS=OFF -DIREE_BUILD_BENCHMARKS=OFF \
-DIREE_TARGET_BACKEND_DEFAULTS=OFF -DIREE_TARGET_BACKEND_LLVM_CPU=ON \
-DIREE_HAL_DRIVER_DEFAULTS=OFF -DIREE_HAL_DRIVER_LOCAL_SYNC=ON -DIREE_HAL_DRIVER_LOCAL_TASK=ON \
-DIREE_INPUT_STABLEHLO=OFF -DIREE_INPUT_TORCH=OFF -DIREE_INPUT_TOSA=OFF
关键:-DIREE_BUILD_BENCHMARKS=OFF(否则要 benchmark 子模块)、
-DIREE_INPUT_*=OFF(否则要 stablehlo/torch-mlir 子模块)。
9.4 写 pass 最小依赖子模块
只用 llvm-project + flatcc 两个子模块(linalg 输入 + VM 字节码输出),其余全关。