$ 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 --help-variable CMAKE_BUILD_TYPE
您也可以使用以下命令列出所有变量:$ cmake --help-variable-list
这个列表非常长您可能希望将输出管道传输到 more 或类似的程序使用 LLVM 定义的构建配置变量 LLVM 定义的构建配置变量的工作原理与 CMake 定义的变量相同,只是没有内置帮助最有用的变量如下表所示,它们被分为对首次安装 LLVM 的用户有用的变量和对更高级的 LLVM 用户有用的变量对首次安装 LLVM 的用户有用的变量(图片来源网络,侵删)
0 评论