你可以用cmake处理钻石

2021-03-28 18:53:57

CMake是一个保守和流行的C ++的构建系统,因此如果您寻找无聊技术,则首选.EET,它对依赖管理的大型项目没有效果很好。这是关于经典"钻石"形状:

by"大规模项目"我谈论多个队伍和#34; m更多组件,使您无法将其构建为树。在您放置组件方面的平面目录结构,它更有意义逐渐。组件之间的依赖性将迅速生长成各种形状(尽管您应该真正避免周期),其中包括钻石迟早。

要将组件解耦,我们希望独立构建和测试它们中的每一个,因此每个都获取CMAKELISTS.TXT.WEVER,我们仍然需要一个在root的全局,每个子目录都可以找到其依赖项。

对根文件的需求是令人作呕的。它需要解析所有CMAKELIST.TXT文件以进行配置。

相反,我宁愿进入一个组件目录并在那里建立.CAN CMake这样做?

CMake有两个依赖性机制。首先,存在find_package。这里的意图是为了检测系统上可用的包和相应地配置构建。在a"模块"和一个" config"模式但是这里的区别在这里不相关。它们在这里非常有用,因为它们假设一个预构建的库.Camake不会通过find_package构建依赖项。

替代方案是add_subdirectory.just从它的名字中看到它的意图是关于一个目录树。根cmakelists.txt使用它来查找组件cmakelists.txt.if您尝试瞄准A"非子&#34 ;目录,它将显示一条错误消息:

cmakelists.txt的cmake误差:8(add_subdirectory):add_subdirectory没有给出二进制目录,但给定的源目录" ../ a"不是&#34的子目录; root"当指定树源外源时,必须明确指定二进制目录。

嗯,有一个add_subdirectory的第二个参数来使它工作.Since cmake支持树构建,它使用第二个参数来定位依赖于依赖的树外构建。 a中的构建文件夹,依赖依赖性基础的第二个参数是sub / base,并且您运行cmake ..在其中.Cmake在此处创建Cmakecache.txt filesand它将为其依赖创建一个,并且可以为其依赖创建一个

由于每个组件都会创建自己的子构建文件夹,这会递归地发生,因此基础将存在两次。然而,CMake具有巧妙的魔法,在子/位内部没有构建自己的base.Instead它在sub / a中构建并在那里重用目标并重新使用目标。

问题是CMake抱怨重复的variableas,它会解析Base / Cmakelists.txt两次。避免我们需要在C头文件中包含GuardSAS。

最初可能不会注意到的问题是CMake没有命名方式。这意味着它与$ {project_name}(如{project_name})类似的预混物乱丢了垃圾

现在构建成功。您可以从每个组件构建它,它只能根据需要构建依赖关系。我们不需要根cmakelists.txt.not优雅但可用。

至少如果你的依赖关系不是那么深入你不要尝试在Windows上建立有限的路径长度。

显着的解决方案似乎映射到C solutions.so如果您设计构建系统,则考虑现代语言可以更干净地解决C问题是有意义的。

构建模仿CMake,如Meson或Xmake的系统。主要目的是根据我们关心内部依赖项的大型项目的外部依赖性配置构建。

Bazel(及其克隆克隆,裤子和裤子)是为此用例而设计的,所以它看起来更优雅。虽然指定要构建依赖项的目录名,Bazel相对于工作空间(通常是回购)重用文件夹(通常是回购)这解释了为什么依赖于依赖关系是用它们的整条路径指定的,如//component/a:a.within同一个文件,目标名称:a是sufficienceo在这里,您可以看到命名空间的好处。

一个更靠的构建系统,如此,因为它是不受树木外构造的复杂功能的负担.its的简单意味着用户必须在顶部构建更复杂的功能。

相关帖子:思考亚马逊' s的manyRepo构建系统表格亚马逊如何在包上全押。 Interfacedescribes的三个所有者如何出现碱包。