.net 4.0_net40安装未成功一看就会
为了学习如何使用 LLVM,最好从源代码编译 LLVM 开始。总结 在本章中,您准备了开发机器以编译 LLVM。
为了学习如何使用 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-develFreeBSD 在 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 zlibWindows 像 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 bucketadd 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,那么您可以使用以下命令设置变量:。
$ exportCMAKE_GENERATOR=Ninja $ exportCMAKE_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。
要将 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_FLAGSCMAKE_CXX_FLAGSCMAKE_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_BUILDLLVM 支持为不同的 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=M68kLLVM_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=ONLLVM_ENABLE_EXPENSIVE_CHECKS这会启用一些成本较高的检查,这些检查可能会显著降低编译速度或消耗大量内存。
默认值为 OFF要启用这些检查,您指定 -DLLVM_ENABLE_EXPENSIVE_CHECKS=ONLLVM_APPEND_VC_REVLLVM 工具(如 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_EHLLVM 项目不使用 C++ 异常处理,因此默认情况下关闭异常支持。
此设置可能与您的项目链接的其他库不兼容如果需要,您可以通过指定 –DLLVM_ENABLE_EH=ON 来启用异常支持LLVM_ENABLE_RTTILLVM 使用轻量级、自建系统进行运行时类型信息(RTTI)。
默认情况下关闭 C++ RTTI 的生成像异常处理支持一样,这可能与其他库不兼容要启用 C++ RTTI 的生成,您指定 –DLLVM_ENABLE_RTTI=ONLLVM_ENABLE_WARNINGS
编译 LLVM 应该尽可能不生成警告消息因此,默认情况下启用打印警告消息的选项要关闭它,您指定 –DLLVM_ENABLE_WARNINGS=OFFLLVM_ENABLE_PEDANTICLLVM 源代码应该符合 C/C++ 语言标准;因此,默认情况下启用了源代码的严格检查。
如果可能,还会禁用特定于编译器的扩展要反转此设置,您指定 –DLLVM_ENABLE_PEDANTIC=OFFLLVM_ENABLE_WERROR如果设置为 ON,则所有警告都被视为错误——一旦找到警告,编译就会中止。
这有助于发现源代码中的所有剩余警告默认情况下,它被关闭要打开它,您指定 –DLLVM_ENABLE_WERROR=ONLLVM_OPTIMIZED_TABLEGEN通常,tablegen 工具的构建选项与 LLVM 的其他部分相同。
同时,tablegen 用于生成代码生成器的大部分代码结果是,在调试构建中,tablegen 要慢得多,显著增加了编译时间如果将此选项设置为 ON,则即使对于调试构建,tablegen 也会以开启优化的方式编译,可能减少编译时间。
默认为 OFF要打开它,您指定 –DLLVM_OPTIMIZED_TABLEGEN=ONLLVM_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 后端进行代码生成的接口
免责声明:本站所有信息均搜集自互联网,并不代表本站观点,本站不对其真实合法性负责。如有信息侵犯了您的权益,请告知,本站将立刻处理。联系QQ:1640731186