准备好构建工具后,就可以从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

    这将最新的源代码从GitHub克隆到一个名为llvm-project的本地目录中。现在,进入llvm-project目录:

    \$ cd llvm-project

    这个目录包含所有的LLVM项目,每个项目都有自己的目录。最值得注意的是,LLVM核心库位于LLVM子目录中。LLVM项目使用分支来进行后续版本开发(“release/12.x”)和标记(“llvmorg-12.0.0”)来标记某个版本。通过前面的clone命令,可以获得当前的开发状态。本书使用LLVM 12。要查看LLVM 12的第一个版本,输入以下命令:

    \$ git checkout -b llvmorg-12.0.0

    这样,就克隆了整个存储库,检出到对应的标记。

    Git还允许只克隆一个分支或标记(包括历史记录)。使用git clone --branch llvmorg-12.0.0 https://github.com/llvm/llvm-project。使用-depth=1选项,可以防止历史信息的克隆。这节省了时间和空间,但显然也限制了你能在本地可以做什么。

    下一步就是创建构建目录。

    创建构建目录

    与许多其他项目不同,LLVM不支持内联构建,需要单独的构建目录。可以在llvm-project目录中创建一个目录。先进入llvm-project目录:

    \$ cd llvm-project

    然后,为了简单起见,创建一个名为build的构建目录。Unix和Windows系统的命令是不同,在类Unix系统上,应该使用以下命令:

    \$ mkdir build

    在Windows上,应该使用以下命令:

    \$ md build

    然后,切换到构建目录:

    \$ cd build

    现在,您可以在这个目录中使用CMake工具创建构建系统文件了。

    生成构建系统文件

    要生成将使用Ninja编译LLVM和Clang的构建系统文件,请运行以下命令:

    \$ cmake —G Ninja -DLLVM[ ]{.underline}ENABLE[ ]{.underline}PROJECTS=clang ../llvm

    在Windows上,反斜杠字符$\setminus$是目录名分隔符,CMake会自动将Unix分隔符/转换为Windows分隔符。

    -G选项告诉CMake要为哪个系统生成构建文件。最常用的选项如下:

    • Ninja: 对应Ninja的构建系统

    • Unix Makefiles: 对应GNU Make

    • Visual Studio 15 VS2017和Visual Studio 16 VS2019: 对应Visual Studio和MS Build

    • Xcode: 对应Xcode工程

    可以使用-D选项设置各种变量来影响生成过程。通常,以CMAKE[ ]{.underline}(由CMAKE定义)或LLVM[ ]{.underline}(由LLVM定义)作为前缀。使用LLVM[ ]{.underline}ENABLE[ ]{.underline}PROJECTS=clang变量设置,CMake为LLVM之外的Clang生成构建文件。命令的最后一部分告诉CMake在哪里可以找到LLVM核心库源代码。下一节中会有更多的相关内容。

    当生成了构建文件,LLVM和Clang可以用以下命令编译:

    \$ ninja

    根据硬件资源的不同,该命令的运行时间在15分钟(具有大量CPU内核、内存和快速存储的服务器)到数小时(内存有限的双核Windows笔记本)之间。默认情况下,Ninja使用了所有可用的CPU核。这有利于提高编译速度,但可能会阻止其他任务的运行。例如,在Windows笔记本上,Ninja在运行时几乎不能上网。幸运的是,可以使用-j选项限制资源的使用。

    假设您有四个可用的CPU核,而Ninja应该只使用两个(因为有并行任务要运行)。在这里,应该使用以下命令进行编译:

    \$ ninja —j2

    当编译完成,可以运行测试套件,以检查是否一切正常:

    \$ ninja check-all

    同样,该命令的运行时因可用硬件资源的不同而有很大差异。Ninja检查目标运行所有测试用例,为每个包含测试用例的目录生成目标。使用check-llvm(而不是check-all)是运行LLVM测试,而不是Clang测试,check-llvm-codegen只运行来自LLVM的CodeGen目录中的测试(即llvm/test/CodeGen目录)。

    也可以做一个快速的手动检查。使用的LLVM的llc,即LLVM编译器。如果使用-version选项,会显示它的LLVM版本,主机CPU,以及它所支持的所有架构:

    \$ bin/llc -version

    如果您在编译LLVM时有困难,那么可以参考LLVM系统文档入门中的常见问题部分(https://llvm.org/docs/GettingStarted.html#common-problems),以获得常见问题的解决方案。

    最后,安装可执行文件:

    \$ ninja install

    在类Unix系统上,安装目录是/usr/local。在Windows下,使用C:$\setminus$Program Files$\setminus$LLVM。当然可以修改,下一节将说明如何操作。