如何使用不同的工具链

时间:2015-05-14 09:11:56

标签: cmake cross-platform

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

可悲的事实是,复杂的构建设置是 hard 来管理。 CMake在提供大量工具来应对这种复杂性方面做得非常出色,但它不能神奇地解决问题。 CMake对其用户施加的大多数限制是有原因的,即如果你试图在没有它们的情况下工作,事情会更加