构建 LLVM 的发行版¶

构建 LLVM 的发行版¶

通用发行版指南¶

在构建编译器发行版时,通常建议执行编译器的引导构建。这意味着使用您的主机工具链构建“阶段 1”编译器,然后使用“阶段 1”编译器构建“阶段 2”编译器。这样做是为了使您分发的编译器受益于新编译器提供的所有错误修复、性能优化和一般改进。

在决定如何构建您的发行版时,您需要评估一些权衡。最重要的两个是

发行版的编译时间与构建的编译器的性能

发行版的二进制大小与构建的编译器的性能

最大化生成的编译器性能的指南是使用 LTO、PGO 和静态链接所有内容。这将导致更大的整体发行版,并且生成时间更长,但它为编译器提供了最大的优化机会。

最小化发行版大小的指南是将 LLVM 和 Clang 库动态链接到工具中,以减少代码重复。这将对生成的二进制文件造成相当大的性能损失,因为它减少了优化机会,并且因为动态链接需要在进程启动时解析符号,这对于 C++ 代码来说可能非常慢。

警告

一个非常重要的注意事项:永远不应使用 BUILD_SHARED_LIBS CMake 选项构建发行版。该选项仅用于优化开发人员工作流程。由于设计和实现决策,LLVM 依赖于全局数据,这些数据最终可能会在共享库中重复,从而导致错误。因此,这不是分发 LLVM 或基于 LLVM 的工具的安全方法。

使用合理的性能构建发行版的最简单示例在 clang/cmake/caches/DistributionExample.cmake 中提供的 DistributionExample CMake 缓存文件中捕获。以下命令将执行并安装发行版构建

$ cmake -G Ninja -C /cmake/caches/DistributionExample.cmake

$ ninja stage2-distribution

$ ninja stage2-install-distribution

install 和 install-distribution 之间的区别¶

一个细微但重要的事情需要注意的是 install 和 install-distribution 目标之间的区别。install 目标旨在安装您的构建配置为生成的所有 LLVM 部分,除了 LLVM 测试工具。或者,install-distribution 目标(推荐用于构建发行版)仅安装在配置时通过 LLVM_DISTRIBUTION_COMPONENTS 指定的 LLVM 的特定部分。

此外,默认情况下,install 目标会将 LLVM 测试工具安装为公共工具。可以通过将 LLVM_INSTALL_TOOLCHAIN_ONLY 设置为 On 来很好地更改这一点。LLVM 工具旨在用于 LLVM 的开发和测试,并且只应包含在支持 LLVM 开发的发行版中。

当使用 LLVM_DISTRIBUTION_COMPONENTS 构建时,构建系统还会生成一个 distribution 目标,该目标构建列表中指定的所有组件。这是一个方便的构建目标,允许仅构建分发的部分,而无需构建所有配置的目标。

多发行版配置¶

上面描述的 install-distribution 目标用于构建单个发行版。LLVM 的构建系统还支持构建多个发行版,例如,可以使用一个发行版仅包含工具,另一个发行版包含库(以启用开发)。这些通过将 LLVM_DISTRIBUTIONS 变量设置为包含所有发行版名称的列表(通常以大写字母开头,例如“Development”)来配置,然后将 LLVM__DISTRIBUTION_COMPONENTS 变量设置为该发行版的目标列表。对于每个发行版,构建系统都会生成一个 install-${distribution}-distribution 目标,其中 ${distribution} 是小写的发行版名称,用于安装该发行版。

每个发行版都会创建自己的一组 CMake 导出,并且为项目安装特定发行版的 CMake 导出的目标名为 ${project}-${distribution}-cmake-exports,其中 ${project} 是小写的项目名称,${distribution} 是小写的发行版名称,除非项目是 LLVM,在这种情况下,目标仅命名为 ${distribution}-cmake-exports。这些目标需要显式包含在 LLVM__DISTRIBUTION_COMPONENTS 变量中,以便作为发行版的一部分包含在内。

与单发行版设置不同,在构建多个发行版时,LLVM_RUNTIME_DISTRIBUTION_COMPONENTS 中指定的任何组件都不会自动添加到任何发行版。相反,您必须将目标显式包含在某些 LLVM__DISTRIBUTION_COMPONENTS 列表中。

默认情况下,每个目标可以出现在多个发行版中;目标将作为其出现的所有发行版的一部分安装,并且它将由它出现的最后一个发行版导出(发行版的顺序是它们在 LLVM_DISTRIBUTIONS 中出现的顺序)。我们还定义了一些伞状目标(例如,llvm-libraries 用于安装所有 LLVM 库);目标可以出现在与其伞状目标不同的发行版中,在这种情况下,目标将由它出现的发行版导出(而不是其伞状目标出现的发行版)。如果您希望强制目标仅出现在一个发行版中,并且伞状发行版与目标发行版一致,请将 LLVM_STRICT_DISTRIBUTIONS 设置为 On。

我们强烈建议查看 clang/cmake/caches/MultiDistributionExample.cmake 作为配置多个发行版的示例。

仅库发行版的特别说明¶

LLVM 最强大的功能之一是其库优先的设计理念以及您可以使用 LLVM 的不同部分组合各种工具的方式。即使在这种情况下,也不支持使用 BUILD_SHARED_LIBS。如果您想将 LLVM 作为共享库分发以在工具中使用,建议的方法是使用 LLVM_BUILD_LLVM_DYLIB,您可以使用 LLVM_DYLIB_COMPONENTS 配置哪些 LLVM 组件是 libLLVM 的一部分。注意:LLVM_BUILD_LLVM_DYLIB 在 Windows 上不可用。

相关推荐

猫开脚是什么意思啊?
正规beat365app

猫开脚是什么意思啊?

📅 09-15 👁️ 9358
含有【一人】的成语
365bet网页版

含有【一人】的成语

📅 10-09 👁️ 9238
小米电视VS乐视电视:深度对比,哪个更适合你?