安装LLVM
学习llvm最好从源码编译开始。llvm是一个大的综合项目,托管在GitHub,有很多个子项目比如LLVM,clang,lld,lldb,libcxx,mlir等。每一个项目都在都在仓库的顶级目录中。除了克隆代码库之外,你的编译系统必须完整的安装了编译所需要的所有工具。在这一章节,你会学到如下内容:
- 准备好先决条件,向你展示如何设置构建系统
- 克隆源代码库并从源代码开始构建,包括如何获取 LLVM 源代码,以及如何使用 CMake 和 Ninja 编译并安装 LLVM 核心库和 clang
- 自定义构建过程,将讨论影响构建过程的各种可能性
编译LLVM还是直接安装LLVM?
你可以编译任意一个版本的LLVM源代码。如果你用Linux的话,那么你的发型版软件包管理器中就已经有了LLVM库,所以我们为什么还要这么麻烦的从源码编译呢?
首先,安装的llvm库并非包含了你为了开发llvm所需要的所有的文件。手动编译LLVM并安装到本地,可以避免如此。 另一个原因是 LLVM 可高度定制。通过构建 LLVM,我们将学习如何定制 LLVM,这让我们能够诊断在将 LLVM 应用程序移植到其他平台时可能出现的问题。最后,在这本书的第三个部分,会让你延伸扩展LLVM,这也是为什么需要你有自己手动编译llvm的能力。
然而,现在还不是开始编译的时候,我们还需要安装一些必要组件。
注意
很多Linux发行版把LLVM切分成了好几个不同的包。请确认安装的是开发包,比如在ubuntu上,你得安装llvm-dev
这个包。还有你安装得是 LLVM 17+ 其他更低的版本可能和本书示例不符。
安装必要依赖组件
为了用好LLVM,你的开发环境必须得是一个常见的操作系统,比如 Linux,FreeBSD,macOS 或 Windows。启用Debug模式后的编译产物可能会占用多达 30 GB 的空间。所需磁盘空间在很大程度上取决于所选的编译选项。例如,在Release模式下只针对一个平台构建 LLVM 核心库,需要大约 2 GB 的可用磁盘空间,这是最低限度的要求。 为了缩短编译时间,一颗高速的 CPU(如主频为 2.5 GHz 的四核 CPU)和高速 SSD 也很有帮助。甚至可以在 Raspberry Pi 等小型设备上构建 LLVM,只是需要花费大量时间。本书中的示例是在一台笔记本电脑上开发的,这台笔记本电脑的英特尔四核 CPU 运行速度为 2.7 GHz,拥有 40 GB 内存和 2.5 TB SSD 磁盘空间,这就很合适编译。
然后我们看一下一些必须要安装的软件和要求的最低版本。
为了方便的切换源代码分支,你得安装好Git. 这个库没有特别的版本闲置,GitHub推荐你使用的最的Git版本是 1.17.10。但是由于一些Git已知的安全风险,我们推荐使用Git的最低版本是 2.39.1,截止笔者初稿。
LLVM项目使用CMake作为项目构建工具,最低版本是 CMake 3.20.0。CMake能为各种系统生成编译分析文件,在本书中,我们会使用 Ninja 来组织编译任务并行编译,Ninja的优势是快,而且所有平台都通用。我们推荐使用Ninja 1.11.1。
很显然,你还需要一个C/C++编译器,LLVM项目是用现代C++编写,基于C++17. 现在我们需要一个编译器和一个标准库:
- gcc 7.1.0 +
- clang 5.0 +
- Apple Clang 10.0 +
- Visual Studio 2019 16.7 +
建议
请注意,随着LLVM项目的进一步发展,编译器的需求很可能会发生变化。一般来说,译者建议你应该使用系统可用的最新编译器版本。
我们还需要Python,用于辅助生成编译文件和运行单元测试。最的版本要求是Python3.8
虽然本书没有涉及,但也可能有需要使用 Make 而不是 Ninja 的原因。在这种情况下,你需要使用 GNU Make (https://www.gnu.org/software/make/) 3.79 或更高版本
两种构建工具的用法非常相似。在下面描述的情况下,只需将每个命令中的 ninja 替换为 make 即可。 LLVM 还依赖于 zlib 库 (https://www.zlib.net/)。得至少应安装 1.2.3.4 版本。像往常一样,我们建议使用最新版本 1.2.13。 要安装依赖软件,最简单的方法是使用操作系统的软件包管理器。在下面的章节中,我们将介绍在最常用的操作系统中安装软件所需的命令。
ubuntu
Ubuntu 22.04 使用 apt 软件包管理器。大部分基本实用程序都已安装,只缺开发工具。要一次性安装所有软件包,请键入以下命令:
$ sudo apt -y install gcc g++ git cmake ninja-build zlib1g-dev
Fedora、RedHat
Fedora 37 和 RedHat Enterprise Linux 9 的软件包管理器称为 dnf。与 Ubuntu 一样,它们已经安装了大部分基本实用程序。要一次性安装所有软件包,请键入以下命令:
$ sudo dnf -y install gcc gcc-c++ git cmake ninja-build zlib-devel
FreeBSD
在 FreeBSD 13 或更高版本上,必须使用 pkg 软件包管理器。FreeBSD 与基于 Linux系统的不同之处在于已经安装了 clang 编译器。要一次性安装所有其他软件包,可以键入以下命令
$ sudo pkg install -y git cmake ninja zlib-ng
Windows
与 OS X 一样,Windows 也不自带软件包管理器。要使用 C/C++ 编译器,需要下载 Visual Studio Community 2022 (https://visualstudio.microsoft.com/vs/community/),这是免费供个人使用的。请确保安装名为 Desktop Development with C++ 的工作负载。您可以使用软件包管理器 Scoop (https://scoop.sh/) 安装其他软件包。按照网站上的说明安装 Scoop 后,从 Windows 菜单中打开 x64 Native Tools Command Prompt for VS 2022。要安装所需的软件包,请键入以下内容:
$ scoop install git cmake ninja python gzip bzip2 coreutils
$ scoop bucket add extras
$ scoop install zlib
请仔细观察 Scoop 的输出。对于 Python 和 zlib 软件包,它建议添加一些注册表键值。这些项是其他软件找到这些软件包所必需的。要添加注册表键值,最好复制并粘贴 Scoop 的输出结果,如下所示:
%HOMEPATH%\scoop\sapp\python\current\install-pep-514.reg
%HOMEPATH%\scoop\apps\zlib\current\register.reg
在每条命令之后,注册表编辑器都会弹出一个消息窗口,询问你是否真的要导入这些注册表键值。你需要点击 "是 "来完成导入。现在,所有先决条件都已安装完毕。 对于本书中的所有示例,必须使用 VS 2022 的 x64 本地工具命令提示符。使用该命令提示符,编译器会自动添加到搜索路径中。
提示
LLVM 代码库非常庞大。要轻松浏览源代码,我们建议使用可以跳转到类的定义并搜索源代码的集成开发环境。我们发现 Visual Studio Code (https://code.visualstudio.com/download) 是一个可扩展的跨平台集成开发环境,使用起来非常方便。不过,这并不是学习本书示例的必要条件。
克隆代码,开始编译!
所有的编译工具安装好之后,可以从GitHub上拉取llvm-project的源码进行编译。然后按照如下步骤进行编译:
- 配置Git
- 克隆代码仓库
- 创建编译目录
- 生成编译规则文件
- 编译并安装LLVM
让我们开始配置git吧
配置Git
LLVM项目使用Git进行版本控制。 如果你以前没有使用过 Git,那么在继续之前,你应该先对 Git 做一些基本配置:设置用户名和电子邮件地址。提交修改时会用到这两个信息。 你可以用以下命令检查自己是否已经在 Git 中配置了电子邮件和用户名:
$ git config user.email
$ git config user.name
上述命令将输出您在使用 Git 时已设置的电子邮件和用户名。不过,如果您是第一次设置用户名和电子邮件,可以输入以下命令进行首次配置。在以下命令中,只需将 Jane 替换为您的姓名,将 jane@email.org 替换为您的电子邮件即可:
$ git config --global user.email "jane@email.org"
$ git config --global user.name "Jane"
这些命令会更改 Git 的全局配置。在 Git 仓库中,你可以不指定 --global 选项,在本地覆盖这些值。 Git 默认使用 vi 编辑器来编辑提交信息。如果你偏爱其他编辑器,也可以用类似的方法更改配置。要使用 nano 编辑器,请键入以下内容:
$ git config --global core.editor nano
有关 Git 的更多信息,请参阅《Git 入门手册》(https://www.packtpub.com/product/git-version-control-cookbook-second-edition/9781789137545)。 现在可以从 GitHub 克隆 LLVM 仓库了。
克隆仓库
克隆代码库的命令在所有平台上基本相同。只有在 Windows 平台上,我们建议关闭一下行尾自动翻译功能。 在所有非 Windows 平台上,键入以下命令即可克隆代码库:
$ git clone https://github.com/llvm/llvm-project.git
仅在 Windows 平台上,添加禁用行尾自动翻译的选项。在此,请键入以下命令
$ git clone --config core.autocrlf=false \
https://github.com/llvm/llvm-project.git
这条 Git 命令会将 GitHub 上最新的源代码克隆到本地目录 llvm 项目的本地目录中。现在将当前目录更改为新的 llvm-project 目录,执行以下命令将当前目录更改为新的 llvm-project 目录:
$ cd llvm-project
目录中包含所有 LLVM 项目,每个项目都有自己的目录。最值得注意的是,LLVM 核心库位于 llvm 子目录中。LLVM 项目使用分支进行后续版本开发("release/17.x"),并使用标签("llvmorg-17.0.1")来标记某个版本。通过前面的 clone 命令,您可以获得当前的开发状态。
本书使用 LLVM 17。要在名为 llvm-17 的分支中签出 LLVM 17 的第一个版本,请键入以下命令:
$ git checkout -b llvm-17 llvmorg-17.0.1
通过前面的步骤,你克隆了整个代码库,并从一个标签创建了一个分支。这是最方便的方法。 Gitalsoallowsyoutocloneonlyabranchoratag(includinghistory).Withgit clone --branch release/17.x https://github.com/llvm/llvm-project,youonlyclonetherelease/17.xbranchand 它的历史。
Git也允许你只克隆一个分支或一个标签(包含提交历史),像这样
$ git clone --branch release/17.x https://github.com/llvm/llvm-project
你可以只克隆 release/17.x
这一个分支和提交历史。这样,你就拥有了 LLVM 17 发布分支的最新状态,因此,如果你需要确切的发布版本,只需像之前那样从 release 标签创建一个分支即可。使用附加的 -- depth=1 选项(在 Git 中被称为浅克隆),还能防止克隆历史分支。这样做节省了时间和空间,但显然也限制了你在本地的操作,包括根据发布标签签出分支。
新建编译目录
和其他的项目不同,LLVM不支持原地编译,需要一个单独的编译目录。最简单的做法是在项目文件夹llvm-project内,新建一个build目录。对于类unix系统,操作如下:
$ mkdir build
对于Windows系统,则输入
$ md build
好,现在你可以在这个目录里用CMake创建编译系统文件了。
创建编译系统文件
为了使用ninja编译clang和LLVM,你可以运行如下命令:
$ cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS=clang -B build -S llvm
cmake的-G
用来选择编译系统,最常用的几个选择性有:
- Ninja —— Ninja build system
Unix Makefiles —— GPU Make
Visual Studio 17 VS2022 —— 用于windows系统
- Xcode ——用于macOS
通过 -B 选项,你可以告诉 CMake 联编目录的路径。同样,你也可以用 -S 选项指定源代码目录。使用 -D 选项设置各种变量可以影响生成过程。通常,它们的前缀是 CMAKE(如果由 CMake 定义)或 LLVM(如果由 LLVM 定义)。 如前所述,我们还希望在编译 LLVM 的同时编译 clang。通过设置 LLVM_ENABLE_PROJECTS=clang 变量,CMake 可以生成 LLVM 和 clang 的编译文件。此外,CMAKE_BUILD_TYPE=Release 变量告诉 CMake,它应该为发行版生成编译文件。 -G 选项的默认值取决于你的平台,而构建类型的默认值取决于工具链。不过,你也可以使用环境变量来定义自己的偏好。CMAKE_GENERATOR 变量控制生成器,CMAKE_BUILD_TYPE 变量指定编译类型。如果使用 bash 或类似的 shell,可以用下面的命令设置变量:
$ export CMAKE_GENERATOR=Ninja
$ export CMAKE_BUILD_TYPE=Release
如果您使用的是 Windows 命令行,则可以用以下方法设置变量:
$ set CMAKE_GENERATOR=Ninja
$ set CMAKE_BUILD_TYPE=Release
有了这些设置,创建编译系统文件的命令就变成了下面这个更容易键入的命令:
$ cmake -DLLVM_ENABLE_PROJECTS=clang -B build -S llvm
关于 CMake 变量的更多信息,请参阅 《自定义编译过程》部分。
编译安装LLVM
编译文件生成之后,可以运行如下命令来编译LLVM和clang
$ cmake --build build
这条命令在后台下运行 Ninja,因为我们在配置步骤中告诉 CMake 生成 Ninja 文件。不过,如果要为 Visual Studio 等支持多种构建配置的系统生成构建文件,则需要使用 --config 选项指定构建时要使用的配置。根据硬件资源的不同,该命令的运行时间从 15 分钟(具有大量 CPU 内核、内存和快速存储的服务器)到数小时(内存有限的双核 Windows 笔记本电脑)不等。 默认情况下,Ninja 会使用所有可用的 CPU 内核。这有利于提高编译速度,但可能会妨碍其他任务的运行;例如,在基于 Windows 的笔记本电脑上,几乎不可能在 Ninja 运行时上网。幸运的是,你可以使用 -j 选项来限制资源使用。 假设你有四个可用的 CPU 内核,而 Ninja 只应使用两个(因为你有并行任务要运行);然后使用以下命令进行编译:
$ cmake --build build -j2
编译完成后,最佳做法是运行测试套件,检查一切是否按预期运行:
$ cmake --build build --target check-all
同样,该命令的运行时间会因可用硬件资源的不同而有很大差异。check- all Ninja 目标会运行所有测试用例。每个包含测试用例的目录都会生成目标。使用 check-llvm 代替 check-all 运行 LLVM 测试,但不运行 clang 测试;check-llvm-codegen 只运行 LLVM 的CodeGen 目录(即 llvm/test/CodeGen 目录)中的测试。 您也可以进行快速手动检查。LLVM项目包含的应用程序里有一个是 LLVM 编译器 llc。如果选项运行它,就会显示 LLVM 版本、主机 CPU 和所有支持的架构:
$ build/bin/llc --version
如果在编译 LLVM 时遇到困难,应参阅《LLVM 系统入门》(Getting Started with the LLVM System)文档 https://releases.llvm.org/17.0.1/docs/GettingStarted.html#common-problems 中的 "常见问题"(Common Problems)部分,了解典型问题的解决方案。 最后一步是安装二进制文件:
$ cmake --install build
在类似于 Unix 的系统中,安装目录是/usr/local。在 Windows 中,使用的是 C:\Program Files\LLVM 目录。当然,这个目录可以更改。下一节将介绍如何更改。
定制编译流程
CMake 系统使用 CMakeLists.txt 文件中的项目描述。顶级文件位于 llvm 目录,即 llvm/CMakeLists.txt。其他目录也有 CMakeLists.txt 文件,这些文件在生成过程中递归包含。 根据项目描述中提供的信息,CMake 会检查已安装的编译器、检测库和符号,并创建联编系统文件,例如 build.ninja 或 Makefile(取决于所选的生成器)。还可以定义可重复使用的模块,例如检测是否安装了 LLVM 的函数。这些脚本放在特殊的 cmake 目录 (llvm/cmake),生成过程中会自动搜索该目录。 可以通过定义 CMake 变量来定制编译过程。命令行选项 -D 用于将变量设置为一个值。这些变量在 CMake 脚本中使用。CMake 本身定义的变量几乎都以 CMAKE 作为前缀,这些变量可用于所有项目。由 LLVM 定义的变量以 LLVM 为前缀,但只有在项目定义中包含使用 LLVM 时才能使用。
CMake 定义的变量
有些变量使用环境变量的值进行初始化。最值得注意的是 CC 和 CXX,它们定义了用于编译的 C 和 C++ 编译器。CMake 会使用当前的 shell 搜索路径自动查找 C 和 C++ 编译器。它会选择找到的第一个编译器。如果你安装了多个编译器,例如 gcc 和 clang 或不同版本的 clang,那么这可能不是你想要的用于编译 LLVM 的编译器。 假如你想使用 clang17 作为 C 编译器,clang++17 作为 C++ 编译器。那么,你可以在 Unix shell 中以下面的方式调用 CMake:
$ CC=clang17 CXX=clang++17 cmake -B build -S llvm
这将只为 cmake 的调用设置环境变量的值。如有必要可以指定编译器可执行文件的绝对路径。 CC 是 CMAKE_C_COMPILER CMake 变量的默认值,CXX 是 CMAKE_CXX_COMPILER CMake 变量的默认值。您可以直接设置 CMake 变量,而不是使用环境变量。这相当于前面的调用
$ cmake -DCMAKE_C_COMPILER=clang17 -DCMAKE_CXX_COMPILER=clang++17 -B build -S llvm
CMake 定义的其他有用变量如下:
变量 | 作用 |
---|---|
CMAKE_INSTALL_PREFIX | 项目安装路径的前缀。 在类Unix系统中,默认路径为/usr/local; 在Windows系统中为C:\Program Files 比如你想将LLVM安装到/opt/llvm目录中,需要指定-DCMAKE_INSTALL_PREFIX=/opt/llvm;可执行文件将被复制到/opt/llvm/bin,库文件到/opt/llvm/lib,依此类推。 |
CMAKE_BUILD_TYPE | 构建类型,一般有如下几种 DEBUG:会把debug符号表编译到最终的二进制文件里面 RELEASE:对二进制进行优化,为了生产环境的高速/高效率逻辑执行 RELWITHDEBINFO:进行release编译的同时,保留debug符号表 MINSIZEREL:优化二进制文件大小。 |
CMAKE_C_FLAGS CMAKE_CXX_FLAGS |
这些是在编译C和C++源文件时使用的额外标志。初始值取自CFLAGS和CXXFLAGS环境变量,这些变量可以作为替代选项使用。 |
CMAKE_MODULE_PATH | 这指定了用于搜索CMake模块的额外目录。指定的目录将在默认目录之前进行搜索。该值是一个以分号分隔的目录列表。 |
PYTHON_EXECUTABLE | 如果未找到Python解释器,或者如果选择了错误的解释器(例如安装了多个版本),您可以将此变量设置为Python二进制文件的路径。只有在包含CMake的Python模块时(这在LLVM中是成立的情况下),此变量才会起作用。 |
CMake提供了内置的变量帮助功能。使用--help-variable var选项可以打印出var变量的帮助信息。例如,您可以输入以下命令来获取CMAKE_BUILD_TYPE的帮助信息:
$ cmake --help-variable CMAKE_BUILD_TYPE
您还可以使用以下命令列出所有变量:
$ cmake --help-variable-list
这个列表非常长。您可能想要将输出导入到more或类似的程序中进行查看。
LLVM自定义编译配置变量
LLVM定义的编译配置变量和CMake的变量生效方式一样,除了内置的help
命令之外。我们在下表列出来了一些最有用的配置变量。我们把这些变量划分了一下,有一部分适用于首次安装LLVM的新用户的变量,还有以及适用于更高级LLVM用户的变量。
变量 | 用途 |
---|---|
LLVM_TARGETS_TO_BUILD | LLVM 支持为不同的 CPU 架构生成代码。默认情况下,会编译所有这些目标。使用此变量可指定要编译的目标列表,以分号分隔。当前的目标CPU架构包括 AArch64、AMDGPU、ARM、AVR、BPF、Hexagon、Lanai、LoongArch、Mips、MSP430、NVPTX、PowerPC、RISCV、Sparc、SystemZ、VE、WebAssembly、X86 和 XCore。all可作为所有目标的简称。这些名称区分大小写。要只启用 PowerPC 和 System Z 目标,可指定 -DLLVM_TARGETS_TO_BUILD="PowerPC;SystemZ". |
LLVM_EXPERIMENTAL_TARGETS_TO_BUILD | 除了官方目标之外,LLVM 源代码树还包含实验目标。这些目标正在开发中,通常还不支持后端的全部功能。当前的实验目标包括 ARC、CSKY、DirectX、M68k、SPIRV 和 Xtensa。要编译 M68k 目标,需要指定 -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=M68k。 |
LLVM_ENABLE_PROJECTS | 这是您要构建的项目列表,以分号隔开。项目的源代码必须与 llvm 目录位于同一层级(并排布局)。当前列表包括 bolt、clang、clang-tools-extra、compiler- rt、cross-project-tests、libc、libclc、lld、lldb、mlir、openmp、polly 和 pstl。此外,您还可以在此处指定 flang 项目。由于一些特殊的编译要求,它还不是 all 列表的一部分。 要将 clang 和 bolt 与 LLVM 一起联编,需要指定 -DLLVM_ENABLE_PROJECT="clang;bolt"。 |
变量 | 用途 |
---|---|
LLVM_ENABLE_ASSERTIONS | 如果设置为 ON,则会启用断言检查。能够帮忙发现错误,在开发过程中非常有用。默认值为 DEBUG 联编时开启(为ON),否则关闭(为OFF)。要开启断言检查(例如 RELEASE 联编),请指定 - DLLVM_ENABLE_ASSERTIONS=ON。 |
LLVM_ENABLE_EXPENSIVE_CHECKS | 这会启用一些昂贵的检查,这些检查可能会降低编译速度或消耗大量内存。默认值为 OFF。要打开这些检查,需要指定 -DLLVM_ENABLE_EXPENSIVE_CHECKS=ON。 |
LLVM_APPEND_VC_REV | 如果给出 -version 命令行选项,llc 等 LLVM 工具除了显示其他信息外,还会显示它们所基于的 LLVM 版本。该版本信息基于 LLVM_REVISION C 宏。默认情况下,版本信息不仅包括 LLVM 版本,还包括当前的 Git 哈希值。如果您正在跟踪主分支的开发情况,这一点会很方便,因为它清楚地说明了该工具是基于哪个 Git 提交的。如果不需要,可以使用 - DLLVM_APPEND_VC_REV=OFF 关闭此选项。 |
LLVM_ENABLE_THREADS | 如果系统库里支持了多线程(比如pthread)LLVM会自动引入多线程支持。这种情况下,LLVM会默认编译器已经支持了TLS(thread-local storage)如果你不想要或者编译器不支持的话,请关闭:-DLLVM_ENABLE_THREADS=OFF. |
LLVM_ENABLE_EH | LLVM项目选择不去使用C++的异常处理,异常支持的开关常闭。这个可能和一些链接库不兼容,这个时候你可以打开这个异常支持:–DLLVM_ENABLE_EH=ON. |
LLVM_ENABLE_RTTI | LLVM 使用轻量级自编译系统来生成运行时类型信息。C++ RTTI 的生成默认是关闭的。与异常处理支持一样,这可能与其他库不兼容。要打开 C++ RTTI 的生成,需要指定 -DLLVM_ENABLE_RTTI=ON。 |
LLVM_ENABLE_WARNINGS | LLVM应该尽可能不生成任何warning,默认关闭输出warnings;可以选择性打开: –DLLVM_ENABLE_WARNINGS=OFF. |
LLVM_ENABLE_PEDANTIC | LLVM源代码应该遵循标准的C++语法;因此项目默认打开了源代码严格检查-pedantic 编译器特有的扩展也不会启用;如果要逆转设置,请-DLLVM_ENABLE_PEDANTIC=OFF |
LLVM_ENABLE_WERROR | 如果设置为ON,则所有警告都被视为错误,一旦发现警告,编译就会中止。它有助于在源代码中找到所有剩余的警告。默认情况下,它是关闭的。要打开它,可以指定 -DLLVM_ENABLE_WERROR=ON。 |
LLVM_OPTIMIZED_TABLEGEN | 通常,tablegen 工具的构建选项与 LLVM 的其他部分相同。 同时,tablegen 用于生成代码生成器的大部分内容。 因此,在调试编译时,tablegen 的速度会慢很多,编译时间也会明显增加。 如果将此选项设置为 ON,则即使在调试编译时,也会开启 tablegen 的优化功能,从而缩短编译时间。 默认值为 OFF。 要打开它,需要指定 -DLLVM_OPTIMIZED_TABLEGEN=ON。 |
LLVM_USE_SPLIT_DWARF | 如果编译器是 gcc 或 clang,则打开该选项将指示编译器在一个单独的文件中生成 DWARF 调试信息。对象文件的大小减小后,调试编译的链接时间将大大缩短。默认为关闭。要打开该选项,需要指定 -LLVM_USE_SPLIT_DWARF=ON。 |
NOTE
LLVM 定义了 很多CMake变量,你可以在LLVM的CMake文档里找到这些变量:https://releases.llvm.org/17.0.1/docs/CMake.html#llvm-specific-variables。上面的表格里列出来的变量是最常用的几个。
总结
在这一章,我们学会了如何准备LLVM的编译开发环境;学到了如何从GitHub获取项目代码仓库,切换LLVM和Clang的版本。我们可以通过CMake的变量自定义编译LLVM。学到了这些,我们就可以根据需要调整LLVM了。
下一节,我们将仔细研究编译器的结构。我们将探讨编译器内部的不同组件,以及其中的不同分析类型,特别是词法、句法和语义分析。最后,我们还将简要介绍与 LLVM 后端进行代码生成的接口。