CMake:"子项目的最佳方法"档

时间:2012-10-07 14:08:08

标签: cmake

我正在学习/审核CMake,因为我正在考虑将代码迁移到它。我们当前的make系统做的很多事情就是“子项目”公共代码文件。例如,我们有很多共享的通用头文件(加上一些c / cpp文件),它们包含在我们创建的每个项目中。我想在CMake中复制这个,但我没有看到一个简单的方法。确切地说,我想做类似的事情:

父级CMakeLists.txt

add_subdirectory(shared_folder shared_build_folder)

#Next line should somehow add in the files reference in the shared_folder
add_executable([specific files for this project] build_folder)

儿童CMakeLists.txt(shared_folder)

#Somehow have a list of files here that get added to the parent project

到目前为止,我已经找到了各种“方法”来做这件事,但所有人看起来都有点hacky。我得出的结论是,这实际上是我必须做的事情,而CMake并不是真正适应这种发展方式。为清楚起见,我的大多数解决方案都涉及在父级别创建一个由文件列表组成的变量。这个变量(通过一些恶作剧)可以“传递”到任何孩子,从中填充,然后当我调用add_exectuable时,我使用该变量来添加文件。

我的所有解决方案都涉及相当多的宏/函数,而且看起来相当多的开销。这是其他人尝试过的吗?关于这样做的最佳方法的任何线索?

由于 安德鲁

1 个答案:

答案 0 :(得分:1)

我们遇到了完全相同的问题,经过一段时间的哭泣后,我们接受了CMake-way,这导致了一个更好的结构化项目,即使它意味着要改变我们结构的某些部分。

使用子目录时,一旦处理了add_subdirectory - 语句,目标就会自动导出整个项目(即使在后续的其他add_subdirectory调用中):包含公共代码的子项目正在创建库。 / p>

您还可以使用PARENT_SCOPE将变量导出到父级CMakeLists.txt

对于“其他”事物,我们通过将.cmake文件包含在带有include的主CMakeLists.txt中来模拟FindPackage机制。通过这样做,我们可以轻松地提供变量,更改include_directories并为项目做其他奇特的事情。

由于cmake变量之间没有依赖关系,我们不使用cmake来配置源代码(项目的功能),而只使用构建(编译器,包含,库......)。这种拆分是我们构建系统重构的关键因素。