LLVM学习教程:1 安装 LLVM llvm clang安装
liebian365 2024-10-23 13:54 19 浏览 0 评论
为了学习如何使用 LLVM,最好从源代码编译 LLVM 开始。LLVM 是一个总称项目,其 GitHub 仓库包含了所有属于 LLVM 项目的源代码。每个 LLVM 项目都位于仓库的顶级目录中。除了克隆仓库外,您的系统还必须安装构建系统所需的所有工具。在本章中,您将了解以下主题:
准备先决条件,这将向您展示如何设置构建系统 从源代码克隆仓库并构建,这将涵盖如何获取 LLVM 源代码,以及如何使用 CMake 和 Ninja 编译和安装 LLVM 核心库和 clang 自定义构建过程,这将讨论影响构建过程的各种可能性 编译 LLVM 与安装二进制文件 您可以从各种来源安装 LLVM 二进制文件。如果您使用的是 Linux,则您的发行版包含 LLVM 库。为什么还要自己编译 LLVM?
首先,并非所有安装包都包含开发 LLVM 所需的所有文件。自己编译和安装 LLVM 可以避免这个问题。另一个原因源于 LLVM 高度可定制的事实。通过构建 LLVM,您将了解如何自定义 LLVM,这将使您能够在将 LLVM 应用程序带到另一个平台时诊断可能出现的问题。最后,在本书的第三部分,您将扩展 LLVM 本身,为此,您需要自己构建 LLVM 的技能。
然而,对于最初几步,完全避免编译 LLVM 是完全可以的。如果您想走这条路,那么您只需要按照下一节中描述的方式安装先决条件。
注意
许多 Linux 发行版将 LLVM 分为几个包。请确保您安装了开发包。例如,在 Ubuntu 上,您需要安装 llvm-dev 包。还请确保您安装了 LLVM 17。对于其他版本,本书中的示例可能需要更改。
准备先决条件 要使用 LLVM,您的开发系统应该运行一个常见的操作系统,如 Linux、FreeBSD、macOS 或 Windows。您可以以不同的模式构建 LLVM 和 clang。启用调试符号的构建可能占用高达 30 GB 的空间。所需的磁盘空间严重依赖于所选的构建选项。例如,仅构建 LLVM 核心库,以发布模式为目标,仅针对一个平台,需要大约 2 GB 的空闲磁盘空间,这是所需的最低限度。
为了减少编译时间,拥有一个快速的 CPU(例如具有 2.5 GHz 时钟速度的四核 CPU)和快速的 SSD 也是有帮助的。甚至可以在 Raspberry Pi 这样的小型设备上构建 LLVM —— 只是需要很长时间。本书中的示例是在一台搭载 2.7 GHz 时钟速度的 Intel 四核 CPU、40 GB RAM 和 2.5 TB SSD 磁盘空间的笔记本电脑上开发的。这个系统非常适合开发任务。
您的开发系统必须安装一些先决条件软件。让我们回顾一下这些软件包的最小所需版本。
要从 GitHub 检出源代码,您需要 Git (https://git-scm.com/)。没有特定版本的要求。GitHub 帮助页面建议至少使用 1.17.10 版本。由于过去发现的已知安全问题,建议使用最新可用版本,即撰写时的 2.39.1 版本。
LLVM 项目使用 CMake (https://cmake.org/) 作为构建文件生成器。至少需要 3.20.0 版本。CMake 可以为各种构建系统生成构建文件。在本书中,使用 Ninja (https://ninja-build.org/) 是因为它快速且在所有平台上都可用。建议使用最新版本 1.11.1。
显然,您还需要一个 C/C++ 编译器。LLVM 项目是用基于 C++17 标准的现代 C++ 编写的。需要一个符合标准的编译器和标准库。以下是已知与 LLVM 17 兼容的编译器:
gcc 7.1.0 或更高版本 clang 5.0 或更高版本 Apple clang 10.0 或更高版本 Visual Studio 2019 16.7 或更高版本 提示
请注意,随着 LLVM 项目的进一步开发,编译器的要求最有可能发生变化。一般来说,您应该使用系统上可用的最新编译器版本。
Python (https://python.org/) 在生成构建文件和运行测试套件期间使用。它至少应该是 3.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 包管理器。与基于 Linux 的系统不同,FreeBSD 已经安装了 clang 编译器。要一次性安装所有其他包,您需要输入以下命令:
$ sudo pkg install –y git cmake ninja zlib-ng
OS X 对于 OS X 的开发,最好从 Apple 商店安装 Xcode。虽然本书中没有使用 Xcode IDE,但它带有所需的 C/C++ 编译器和支持实用程序。对于其他工具的安装,可以使用包管理器 Homebrew (https://brew.sh/)。要一次性安装所有包,您需要输入以下命令:
$ brew install git cmake ninja zlib
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\apps\python\current\install-pep-514.reg
$ %HOMEPATH%\scoop\apps\zlib\current\register.reg
在每个命令之后,注册表编辑器会弹出一个消息窗口,询问您是否真的想要导入这些注册表键。您需要点击“是”以完成导入。现在所有先决条件都已安装。
对于本书中的所有示例,您必须使用 x64 Native Tools Command Prompt for VS 2022。使用此命令提示符,编译器会自动添加到搜索路径。
提示
LLVM 代码库非常大。为了舒适地导航源代码,我们建议使用允许您跳转到类定义并搜索源代码的 IDE。我们发现 Visual Studio Code (https://code.visualstudio.com/download),这是一个可扩展的跨平台 IDE,非常舒适易用。然而,这并不是遵循本书示例的要求。
克隆仓库并从源代码构建 准备好构建工具后,您现在可以从 GitHub 检出所有 LLVM 项目并构建 LLVM。这个过程在所有平台上基本相同:
配置 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-project 的本地目录中。现在使用以下命令将当前目录更改为新的 llvm-project 目录:
$ cd llvm-project
目录中包含了所有 LLVM 项目,每个项目都有自己的目录。最值得注意的是,LLVM 核心库位于 llvm 子目录中。LLVM 项目使用分支进行后续的发布开发(“release/17.x”)和标签(“llvmorg-17.0.1”)来标记某个特定发布。使用前面的克隆命令,您将获得当前的开发状态。本书使用 LLVM 17。要检出 LLVM 17 的第一个发布版本到名为 llvm-17 的分支,您输入以下命令:
$ git checkout -b llvm-17 llvmorg-17.0.1
通过前面的步骤,您克隆了整个仓库并从标签创建了一个分支。这是最灵活的方法。
Git 还允许您只克隆一个分支或一个标签(包括历史记录)。使用 git clone --branch release/17.x https://github.com/llvm/llvm-project,您只克隆 release/17.x 分支及其历史记录。然后您就有了 LLVM 17 发布分支的最新状态,所以如果您需要确切的发布版本,您只需要像之前一样从发布标签创建一个分支。使用附加的 --depth=1 选项,这在 Git 中被称为浅克隆,您可以防止克隆历史记录。这节省了时间和空间,但显然限制了您可以在本地执行的操作,包括基于发布标签检出分支。
创建构建目录 与许多其他项目不同,LLVM 不支持内联构建,需要一个单独的构建目录。最容易的做法是在 llvm-project 目录内创建,这是您当前的目录。让我们将构建目录命名为 build,以简化操作。在这里,Unix 和 Windows 系统的命令不同。在类 Unix 系统上,您使用以下命令:
$ mkdir build
在 Windows 上,使用以下命令:
$ md build
现在您准备好在这个目录中使用 CMake 工具创建构建系统文件了。
生成构建系统文件 为了生成编译 LLVM 和 clang 的构建系统文件,使用 Ninja,您运行以下命令:
$ cmake -G Ninja -DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_PROJECTS=clang -B build -S llvm
-G 选项告诉 CMake 为哪个系统生成构建文件。该选项的常用值如下:
Ninja – 为 Ninja 构建系统 Unix Makefiles – 为 GNU Make Visual Studio 17 VS2022 – 为 Visual Studio 和 MS Build Xcode – 为 Xcode 项目
使用 -B 选项,您告诉 CMake 构建目录的路径。同样,您使用 -S 选项指定源目录。生成过程可以通过设置各种变量来影响,这些变量使用 -D 选项设置。通常,它们以 CMAKE_(如果由 CMake 定义)或 LLVM_(如果由 LLVM 定义)为前缀。
如前所述,我们还对同时编译 clang 和 LLVM 感兴趣。通过 LLVM_ENABLE_PROJECTS=clang 变量设置,这允许 CMake 生成 clang 的构建文件以及 LLVM。此外,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 应用程序之一是 llc,LLVM 编译器。如果您使用 -version 选项运行它,它会显示 LLVM 版本、主机 CPU 和所有支持的架构:
$ build/bin/llc --version
如果您在编译 LLVM 时遇到麻烦,那么您应该参考“开始使用 LLVM 系统”文档中的“常见问题”部分 (https://releases.llvm.org/17.0.1/docs/GettingStarted.html#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 会尝试自动定位 C 和 C++ 编译器,使用当前的 shell 搜索路径。它会选取找到的第一个编译器。如果您安装了多个编译器,例如 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 变量 CMAKE_C_COMPILER 的默认值,CXX 是 CMAKE_CXX_COMPILER 的默认值。而不是使用环境变量,您可以直接设置 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<Project>。要将 LLVM 安装在 /opt/llvm 目录中,您指定 -DCMAKE_INSTALL_PREFIX=/opt/llvm。二进制文件被复制到 /opt/llvm/bin,库文件被复制到 /opt/llvm/lib 等。 |
CMAKE_BUILD_TYPE | 不同类型的构建需要不同的设置。例如,调试构建需要指定生成调试符号的选项,并且通常链接到系统库的调试版本。相比之下,发布构建使用优化标志,并链接到库的生产版本。此变量仅用于只能处理一种构建类型的构建系统,例如 Ninja 或 Make。对于 IDE 构建系统,生成所有变体,并且您必须使用 IDE 的机制在构建类型之间切换。可能的值为:DEBUG(带有调试符号的构建)、RELEASE(优化速度的构建)、RELWITHDEBINFO(带有调试符号的发布构建)、MINSIZEREL(优化大小的构建)。默认构建类型从环境变量 CMAKE_BUILD_TYPE 中获取。如果未设置此变量,则默认值取决于所使用的工具链,通常为空。为了生成发布构建的构建文件,您指定 -DCMAKE_BUILD_TYPE=RELEASE。 |
CMAKE_C_FLAGS | CMAKE_CXX_FLAGS |
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 定义的变量相同,只是没有内置帮助。最有用的变量如下表所示,它们被分为对首次安装 LLVM 的用户有用的变量和对更高级的 LLVM 用户有用的变量。
对首次安装 LLVM 的用户有用的变量
变量名称 | 用途 |
LLVM_TARGETS_TO_BUILD | LLVM 支持为不同的 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 目标,您指定 -D LLVM_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。all 可以用作此列表中所有项目的简写。此外,您还可以在此处指定 flang 项目。由于一些特殊的构建要求,它尚未成为 all 列表的一部分。要与 LLVM 一起构建 clang 和 bolt,您指定 -DLLVM_ENABLE_PROJECT="clang;bolt"。 |
高级 LLVM 用户的变量
变量名称 | 用途 |
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 | LLVM 工具(如 llc)在给出 –version 命令行选项时,会显示它们所基于的 LLVM 版本以及其他信息。这个版本信息基于 LLVM_REVISION C 宏。默认情况下,不仅是 LLVM 版本,当前的 Git 哈希也是版本信息的一部分。如果您正在跟踪主分支的开发,这将非常有用,因为它清楚地表明工具基于哪个 Git 提交。如果不需要,那么可以用 –DLLVM_APPEND_VC_REV=OFF 关闭它。 |
LLVM_ENABLE_THREADS | 如果检测到线程库(通常是 pthreads 库),LLVM 会自动包含线程支持。此外,在这种情况下,LLVM 假定编译器支持 TLS(线程本地存储)。如果您不希望线程支持或您的编译器不支持 TLS,那么您可以用 -DLLVM_ENABLE_THREADS=OFF 关闭它。 |
LLVM_ENABLE_EH | LLVM 项目不使用 C++ 异常处理,因此默认情况下关闭异常支持。此设置可能与您的项目链接的其他库不兼容。如果需要,您可以通过指定 –DLLVM_ENABLE_EH=ON 来启用异常支持。 |
LLVM_ENABLE_RTTI | LLVM 使用轻量级、自建系统进行运行时类型信息(RTTI)。默认情况下关闭 C++ RTTI 的生成。像异常处理支持一样,这可能与其他库不兼容。要启用 C++ RTTI 的生成,您指定 –DLLVM_ENABLE_RTTI=ON。 |
LLVM_ENABLE_WARNINGS | 编译 LLVM 应该尽可能不生成警告消息。因此,默认情况下启用打印警告消息的选项。要关闭它,您指定 –DLLVM_ENABLE_WARNINGS=OFF。 |
LLVM_ENABLE_PEDANTIC | LLVM 源代码应该符合 C/C++ 语言标准;因此,默认情况下启用了源代码的严格检查。如果可能,还会禁用特定于编译器的扩展。要反转此设置,您指定 –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 调试信息。对象文件的减小大小显著减少了调试构建的链接时间。默认为 OFF。要打开它,您指定 -LLVM_USE_SPLIT_DWARF=ON。 |
注意
LLVM 定义了许多 CMake 变量。您可以在 LLVM 文档中找到完整列表,网址是 https://releases.llvm.org/17.0.1/docs/CMake.html#llvm-specific-variables。前面的列表只包含您最有可能需要的变量。
总结 在本章中,您准备了开发机器以编译 LLVM。您克隆了 GitHub 仓库并编译了自己的 LLVM 和 clang 版本。构建过程可以通过 CMake 变量进行自定义。您了解了有用变量及其如何更改的知识,有了这些知识,您可以根据需要调整 LLVM。
在下一节中,我们将更仔细地查看编译器的结构。我们将探索编译器内部的不同组件以及其中发生的不同类型的分析——具体来说,是词法、语法和语义分析。最后,我们也将简要触及与 LLVM 后端进行代码生成的接口。
相关推荐
- 4万多吨豪华游轮遇险 竟是因为这个原因……
-
(观察者网讯)4.7万吨豪华游轮搁浅,竟是因为油量太低?据观察者网此前报道,挪威游轮“维京天空”号上周六(23日)在挪威近海发生引擎故障搁浅。船上载有1300多人,其中28人受伤住院。经过数天的调...
- “菜鸟黑客”必用兵器之“渗透测试篇二”
-
"菜鸟黑客"必用兵器之"渗透测试篇二"上篇文章主要针对伙伴们对"渗透测试"应该如何学习?"渗透测试"的基本流程?本篇文章继续上次的分享,接着介绍一下黑客们常用的渗透测试工具有哪些?以及用实验环境让大家...
- 科幻春晚丨《震动羽翼说“Hello”》两万年星间飞行,探测器对地球的最终告白
-
作者|藤井太洋译者|祝力新【编者按】2021年科幻春晚的最后一篇小说,来自大家喜爱的日本科幻作家藤井太洋。小说将视角放在一颗太空探测器上,延续了他一贯的浪漫风格。...
- 麦子陪你做作业(二):KEGG通路数据库的正确打开姿势
-
作者:麦子KEGG是通路数据库中最庞大的,涵盖基因组网络信息,主要注释基因的功能和调控关系。当我们选到了合适的候选分子,单变量研究也已做完,接着研究机制的时便可使用到它。你需要了解你的分子目前已有哪些...
- 知存科技王绍迪:突破存储墙瓶颈,详解存算一体架构优势
-
智东西(公众号:zhidxcom)编辑|韦世玮智东西6月5日消息,近日,在落幕不久的GTIC2021嵌入式AI创新峰会上,知存科技CEO王绍迪博士以《存算一体AI芯片:AIoT设备的算力新选择》...
- 每日新闻播报(September 14)_每日新闻播报英文
-
AnOscarstatuestandscoveredwithplasticduringpreparationsleadinguptothe87thAcademyAward...
- 香港新巴城巴开放实时到站数据 供科技界研发使用
-
中新网3月22日电据香港《明报》报道,香港特区政府致力推动智慧城市,鼓励公私营机构开放数据,以便科技界研发使用。香港运输署21日与新巴及城巴(两巴)公司签署谅解备忘录,两巴将于2019年第3季度,开...
- 5款不容错过的APP: Red Bull Alert,Flipagram,WifiMapper
-
本周有不少非常出色的app推出,鸵鸟电台做了一个小合集。亮相本周榜单的有WifiMapper's安卓版的app,其中包含了RedBull的一款新型闹钟,还有一款可爱的怪物主题益智游戏。一起来看看我...
- Qt动画效果展示_qt显示图片
-
今天在这篇博文中,主要实践Qt动画,做一个实例来讲解Qt动画使用,其界面如下图所示(由于没有录制为gif动画图片,所以请各位下载查看效果):该程序使用应用程序单窗口,主窗口继承于QMainWindow...
- 如何从0到1设计实现一门自己的脚本语言
-
作者:dong...
- 三年级语文上册 仿写句子 需要的直接下载打印吧
-
描写秋天的好句好段1.秋天来了,山野变成了美丽的图画。苹果露出红红的脸庞,梨树挂起金黄的灯笼,高粱举起了燃烧的火把。大雁在天空一会儿写“人”字,一会儿写“一”字。2.花园里,菊花争奇斗艳,红的似火,粉...
- C++|那些一看就很简洁、优雅、经典的小代码段
-
目录0等概率随机洗牌:1大小写转换2字符串复制...
- 二年级上册语文必考句子仿写,家长打印,孩子照着练
-
二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)