CMake: "subprojecting"文件的最佳方法

标签 cmake

我正在学习/审查 CMake,因为我正在考虑将我们的代码迁移到它。我们用当前的 make 系统经常做的一件事是“子项目”公共(public)代码文件。例如,我们有很多共享的通用头文件(加上一些 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(共享文件夹)

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

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

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

谢谢 安德鲁

最佳答案

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

当使用子目录时,一旦处理了 add_subdirectory 语句,目标就会自动导出到整个项目(甚至在后续的其他 add_subdirectory 调用中):包含公共(public)代码的子项目正在创建图书馆。

还有 PARENT_SCOPE 可用于将变量导出到父级 CMakeLists.txt

对于“其他”事物,我们通过使用 include 将 .cmake 文件包含到主 CMakeLists.txt 中来模拟 FindPackage 机制。通过这样做,我们可以轻松地提供变量、更改 include_directories 以及在项目全局范围内执行其他奇特的操作。

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

关于CMake: "subprojecting"文件的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12769521/

相关文章:

c++ - 问题 : No package 'libcrypto' found

c++ - CMake 中的路径变量

cmake - 如何让 cmake 解压我的编译器

c++ - Windows 上的 Clang 和 CMake - clang.exe 损坏,程序不可执行

c++ - GCC6 中 undefined reference 为 'rt' ,'pthread' ,'stdc++fs'

CMake 我可以通过另一个程序过滤编译器输出吗

c++ - 为什么建议包含googletest源文件

C++ CMake 编译错误 (/usr/bin/ld : cannot find <LIBRARY_NAME>)

linux - CMake如何使用pkg-config来查找包?

cmake - 设置安装目录权限