3

我正在学习/审查 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

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

我所有的解决方案都涉及相当多的宏/函数,而且似乎有相当多的开销。这是其他人尝试过的吗?有关执行此操作的最佳方法的任何线索?

谢谢安德鲁

4

1 回答 1

1

我们面临着完全相同的问题,经过一段时间的哭泣后,我们接受了 CMake 方式,它产生了一个结构更好的项目,即使它意味着改变我们结构的某些部分。

当使用子目录时,一旦处理了-statement,目标就会自动导出到整个项目中(甚至在随后的其他add_subdirectory-calls中)add_subdirectory:包含公共代码的子项目正在创建库。

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

对于“其他”事物,我们通过将 .cmake-files 包含到主 CMakeLists.txt 中来模拟 FindPackage 机制include。这样做我们可以很容易地提供变量,改变include_directories和做其他对项目全局的花哨的事情。

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

于 2012-10-09T18:45:06.067 回答