在我的公司,我们正在开发一个中型项目,我们计划将CMake用作构建平台生成器。在这种情况下,我和我的同事正在讨论应该使用CMake的方式。我们的讨论转向了我们必须决定使用的方法。我们的目录结构与此类似:
<"our project"> \
modules \
module_1 \
tests \
test_example.cpp
mock
some_mock_class.hpp
some_class.hpp
some_class.cpp
...
module_2 \
...
module_3 \
...
utility \
...
1-首先,我的同事认为像&#34; src&#34;和&#34;包括&#34;是C编程的提醒,在现代C ++程序中没有位置,所以我们不需要它们。所以我们将它们从结构中移除,但是作为Linux人员;我不确定这是不是一个好主意。我们应该设置一个&#34; include&#34;标题的目录,因此CMake可以将它们适当地安装到安装目标的include目录;或者CMake能够妥善处理它们吗?
2-我们是否应该在项目的根目录中创建一个包含和定义所有目标的CMakeLists.txt,或者我们应该为每个模块创建一个CMakeLists.txt,然后使用&#34; add_subdirectory&#34;指令包括它们?我的同事认为CMakeLists.txt是最好的,因为这样模块实现者根本不需要考虑CMake,一个或两个部署管理员可以维护文件;但我认为每个模块实现者都更了解他们使用哪些库,以及如何编译他们的模块 - 他不同意。在这种情况下你有什么建议?
如果您之前(或知道案例)确实使用过CMake这样的中型项目,请您推荐我们他们做了什么,如果可能,为什么?
此致
答案 0 :(得分:0)
主题很大,但简而言之,我的个人推荐。对于中间项目,我应该已经应用了组件模型。然后合理的是,让组件目录带有他们的onwn CMakeLists.txt,它们通过add_subdirectory()被顶级CMakeLists.txt引用。每个组件 - 一个单独的库(我喜欢静态库)。
对于组件文件夹,我发现在private
子目录下隐藏所有内部内容(也就是实现和私有标头,...)是合理的,不要暴露给外部。然后,在顶部组件目录中,您只有其他人要使用的标头。在私人目录中,您可以混合使用源代码和标题 - 这只是中间项目的品味问题。如果组件很大,私有目录也可以被分解。但是,您需要决定将所有工件添加到组件的单个CMakeLists.txt,还是要有子库。但在这种情况下,用户应单独链接到它们,而只是链接到组件的库。
在最好的情况下,文件夹结构应遵循依赖关系结构并形成树视图构建系统,其中组件尽可能少地了解其他组件的内部结构。在这种情况下,如果可能的重构,您将具有良好的可配置性和灵活性。换句话说,构建系统的设计在我看来类似于C ++中的类设计 - 相同的原则。
运行cmake的真实(目标)构建目录可以位于任何位置,通常位于源目录之外。如果你有足够的内存,它的好地方可能是RAM光盘。然后,对于干净的构建,您只需将其删除即可。但是源和构建本身并不依赖于它的位置。
啊,是的,还有一个暗示。我的建议是从组件目录开始包含头文件,如#include "SomeHeader.hpp"
,它位于ComponentX / SomeHeader.hpp。然后,CMakelists.txt用于执行组件已知的ComponentX
目录。这意味着,标头的路径不会在源文件中进行硬编码。这带来了一些限制,如唯一文件名,但更容易更改组件位置。
希望无论如何都有帮助。