第 1 章 安装 LLVM - 学习笔记
本文为《Learn LLVM 17》第 1 章的学习笔记,主要介绍如何从源码构建 LLVM、配置开发环境,以及自定义构建过程。
1. 本章概览
1.1 学习目标
| 主题 |
内容 |
| 环境准备 |
构建系统所需工具 |
| 源码构建 |
克隆、配置、编译、安装 LLVM 与 clang |
| 自定义构建 |
CMake 变量、LLVM 构建选项 |
1.2 为何从源码构建 LLVM?
| 原因 |
说明 |
| 开发包完整 |
发行版可能缺少头文件、库等开发所需文件 |
| 可定制 |
了解如何自定义,便于跨平台诊断 |
| 扩展需求 |
本书第三部分需扩展 LLVM,需具备自行构建能力 |
替代方案:可直接安装预编译二进制,只需安装下一节中的工具即可。
Note:Ubuntu 等发行版将 LLVM 拆成多个包,需安装 llvm-dev 等开发包,并确认版本为 LLVM 17。
2. 配置环境
2.1 系统要求
| 项目 |
要求 |
| 操作系统 |
Linux、FreeBSD、macOS、Windows |
| 磁盘空间 |
Release 单平台约 2 GB;Debug 全构建可达 30 GB |
| 硬件 |
多核 CPU、SSD 可显著缩短编译时间 |
2.2 必备软件及版本
| 工具 |
最低版本 |
说明 |
| Git |
1.17.10(建议 2.39.1+) |
克隆源码,注意安全更新 |
| CMake |
3.20.0 |
构建文件生成器 |
| Ninja |
建议 1.11.1 |
快速构建系统,跨平台 |
| C/C++ 编译器 |
见下表 |
需支持 C++17 |
| Python |
3.8+ |
生成构建文件、运行测试 |
| GNU Make |
3.79+ |
可选,替代 Ninja |
| zlib |
1.2.3.4(建议 1.2.13) |
依赖库 |
2.3 兼容的 C/C++ 编译器
| 编译器 |
最低版本 |
| GCC |
7.1.0+ |
| Clang |
5.0+ |
| Apple Clang |
10.0+ |
| Visual Studio |
2019 16.7+ |
Tip:建议使用系统可用的最新编译器版本。
2.4 各平台安装命令
Ubuntu 22.04
1
|
$ sudo apt -y install gcc g++ git cmake ninja-build zlib1g-dev
|
Fedora 37 / RHEL 9
1
|
$ sudo dnf -y install gcc gcc-c++ git cmake ninja-build zlib-devel
|
FreeBSD 13+
1
|
$ sudo pkg install -y git cmake ninja zlib-ng
|
macOS (Homebrew)
1
|
$ brew install git cmake ninja zlib
|
(需先安装 Xcode 获取 C/C++ 编译器)
Windows
- 安装 Visual Studio Community 2022,选择「Desktop Development with C++」工作负载
- 安装 Scoop 后,在 x64 Native Tools Command Prompt 中执行:
1
2
3
|
$ scoop install git cmake ninja python gzip bzip2 coreutils
$ scoop bucket add extras
$ scoop install zlib
|
- 按 Scoop 提示添加注册表项(Python、zlib)
Tip:推荐使用 VS Code 等 IDE 方便浏览 LLVM 源码。
3. 从源码构建 LLVM
3.1 流程概览
1
|
配置 Git → 克隆库 → 创建构建目录 → 生成构建文件 → 编译 → 测试 → 安装
|
3.2 配置 Git
1
2
3
4
5
6
7
8
9
10
|
# 检查是否已配置
$ git config user.email
$ git config user.name
# 首次配置
$ git config --global user.email "jane@email.org"
$ git config --global user.name "Jane"
# 可选:更换提交编辑器
$ git config --global core.editor nano
|
3.3 克隆库
类 Unix / macOS:
1
|
$ git clone https://github.com/llvm/llvm-project.git
|
Windows(禁用行尾自动转换):
1
|
$ git clone --config core.autocrlf=false https://github.com/llvm/llvm-project.git
|
3.4 检出 LLVM 17
1
2
|
# 从标签创建分支
$ git checkout -b llvm-17 llvmorg-17.0.1
|
其他方式:
git clone --branch release/17.x ...:只克隆 release 分支
--depth=1:浅克隆,节省空间,但无法按标签 checkout
3.5 创建构建目录
1
2
3
4
5
|
# 类 Unix
$ mkdir build
# Windows
$ md build
|
LLVM 不支持源码目录内构建,必须使用独立构建目录。
3.6 生成构建系统文件
1
2
|
$ cmake -G Ninja -DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_PROJECTS=clang -B build -S llvm
|
| 选项 |
含义 |
-G Ninja |
使用 Ninja 构建系统 |
-DCMAKE_BUILD_TYPE=Release |
Release 构建 |
-DLLVM_ENABLE_PROJECTS=clang |
同时构建 clang |
-B build |
构建目录 |
-S llvm |
源码目录 |
常用生成器:Ninja、Unix Makefiles、Visual Studio 17 VS2022、Xcode
环境变量预设(可选):
1
2
3
4
5
6
7
|
# Bash
$ export CMAKE_GENERATOR=Ninja
$ export CMAKE_BUILD_TYPE=Release
# Windows CMD
$ set CMAKE_GENERATOR=Ninja
$ set CMAKE_BUILD_TYPE=Release
|
3.7 编译
- 编译时间:约 15 分钟(高性能服务器)到数小时(低配笔记本)
- 默认使用所有 CPU 核心
- 限制并行度:
cmake --build build -j2
3.8 运行测试
1
|
$ cmake --build build --target check-all
|
| 目标 |
说明 |
check-all |
所有测试(LLVM + clang) |
check-llvm |
仅 LLVM 测试 |
check-llvm-codegen |
仅 CodeGen 目录测试 |
快速验证:
1
|
$ build/bin/llc --version
|
3.9 安装
1
|
$ cmake --install build
|
- 类 Unix:默认安装到
/usr/local
- Windows:默认安装到
C:\Program Files\LLVM
4. 自定义构建
4.1 CMake 变量说明
- CMAKE_ 前缀:CMake 通用变量
- LLVM_ 前缀:LLVM 专用变量
- 使用
-DVAR=value 在命令行设置
4.2 常用 CMake 变量
| 变量 |
功能 |
CMAKE_INSTALL_PREFIX |
安装路径前缀,如 -DCMAKE_INSTALL_PREFIX=/opt/llvm |
CMAKE_BUILD_TYPE |
Debug / Release / RelWithDebInfo / MinSizeRel |
CMAKE_C_COMPILER |
C 编译器路径或名称 |
CMAKE_CXX_COMPILER |
C++ 编译器路径或名称 |
CMAKE_C_FLAGS / CMAKE_CXX_FLAGS |
编译选项 |
CMAKE_MODULE_PATH |
额外 CMake 模块搜索路径 |
PYTHON_EXECUTABLE |
Python 解释器路径 |
指定编译器:
1
2
3
4
5
6
|
# 环境变量
$ CC=clang17 CXX=clang++17 cmake -B build -S llvm
# 或直接设置 CMake 变量
$ cmake -DCMAKE_C_COMPILER=clang17 \
-DCMAKE_CXX_COMPILER=clang++17 -B build -S llvm
|
4.3 LLVM 构建配置变量(入门)
| 变量 |
功能 |
LLVM_TARGETS_TO_BUILD |
目标架构列表,如 "PowerPC;SystemZ",all 表示全部 |
LLVM_EXPERIMENTAL_TARGETS_TO_BUILD |
实验目标,如 M68k、ARC、CSKY 等 |
LLVM_ENABLE_PROJECTS |
子项目列表,如 "clang;bolt" |
支持的目标:AArch64、AMDGPU、ARM、AVR、BPF、Hexagon、Mips、NVPTX、PowerPC、RISCV、SystemZ、WebAssembly、X86 等。
子项目:bolt、clang、clang-tools-extra、compiler-rt、lld、lldb、mlir、openmp、polly、flang 等。
4.4 LLVM 构建配置变量(进阶)
| 变量 |
功能 |
默认 |
LLVM_ENABLE_ASSERTIONS |
启用断言 |
Debug 为 ON |
LLVM_ENABLE_EXPENSIVE_CHECKS |
高开销检查 |
OFF |
LLVM_APPEND_VC_REV |
版本信息包含 Git 哈希 |
ON |
LLVM_ENABLE_THREADS |
线程支持 |
自动检测 |
LLVM_ENABLE_EH |
C++ 异常 |
OFF |
LLVM_ENABLE_RTTI |
C++ RTTI |
OFF |
LLVM_ENABLE_WARNINGS |
编译警告 |
ON |
LLVM_ENABLE_PEDANTIC |
严格标准检查 |
ON |
LLVM_ENABLE_WERROR |
警告视为错误 |
OFF |
LLVM_OPTIMIZED_TABLEGEN |
优化 tablegen 构建 |
OFF |
LLVM_USE_SPLIT_DWARF |
分离 DWARF 调试信息 |
OFF |
4.5 查看变量帮助
1
2
|
$ cmake --help-variable CMAKE_BUILD_TYPE
$ cmake --help-variable-list
|
5. 总结
5.1 构建流程速查
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# 1. 克隆
git clone https://github.com/llvm/llvm-project.git
cd llvm-project
git checkout -b llvm-17 llvmorg-17.0.1
# 2. 配置
mkdir build
cmake -G Ninja -DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_PROJECTS=clang -B build -S llvm
# 3. 编译与测试
cmake --build build
cmake --build build --target check-all
# 4. 安装
cmake --install build
|
5.2 常见问题
遇到构建问题可参考:LLVM Getting Started - Common Problems
5.3 后续
第 2 章将介绍编译器的结构,包括词法、语法、语义分析及 LLVM 后端接口。