如何使用不同的工具链

How to use different tool chains

在一个项目中,其中一些目标是要构建的,运行 在构建平台上,其他目标是为跨平台构建的;使用 cmake 时,我们有哪些选择?

目前我使用CMAKE_BUILD_TYPE来定义工具链、构建类型和平台(例如-D CMAKE_BUILD_TYPE=arm_debug)。在构建的一个地方,我根据 CMAKE_BUILD_TYPE 的值切换工具(编译器、linke 等)、命令行标志、库等。对于每种构建类型,我都创建了一个构建目录。

这种方法有它的缺点:多个构建目录,并且没有简单的方法将一种构建类型的一个目标依赖于另一种构建类型的目标(交叉构建在构建平台上需要某种预编译器)例如平台)。

由于目前每个构建目标都有一个要使用的工具链,我很乐意将目标与目标平台/工具集相关联。这意味着必须为具有不同工具集的多个目标平台构建一些库。

每个 CMake 一个构建类型和平台 运行”的限制是基本的,我强烈建议不要尝试解决它。​​

在我看来,正确的解决方案是将构建分成几个阶段。特别是,对于一种构建类型的目标依赖于另一种构建类型的目标的情况,您不应尝试将这两个目标放在同一个 CMake 项目中。适当的模块化是这里的关键。有效使用 CMake 的 include 命令可以帮助避免构建脚本中的代码重复。

这种方法的最大缺点是构建过程变得更加复杂,因为您现在有几个相互依赖的 CMake 项目,需要使用特定配置按特定顺序构建。尽管您似乎已经远远超出了可以使用单个命令构建整个系统的程度。 CMake 可以使用 ExternalProject 等工具帮助管理这种复杂性,这些工具允许您从另一个项目构建 CMake 项目。根据您的特定设置,用您最喜欢的脚本语言编写的非 CMake 层也可能是确保以正确顺序构建不同子项目的可行替代方案。

可悲的事实是,复杂的构建设置难以管理。 CMake 在提供大量工具来解决这种复杂性方面做得很好,但它不能神奇地使问题变得更简单。 CMake 对其用户施加的大多数限制都是有原因的,即如果您尝试在没有它们的情况下工作,事情会 更加困难