【发布时间】:2012-03-15 10:35:19
【问题描述】:
假设源代码树是这样的结构:
/
|- lib1
| |- src.cpp
| |- lib1.h
| |- CMakeLists.txt
|
|- lib2
| |- src.cpp
| |- lib2.h
| |- CMakeLists.txt
|
|- lib3
| |- src.cpp
| |- lib3.h
| |- CMakeLists.txt
|
|- app
| |- src.cpp
| |- CMakeLists.txt
|
|- CMakeLists.txt
假设:
- lib1 有函数 f();
- lib2 有函数 g() 使用 f();
- app/src.cpp 使用函数 g();
- 没有人使用 lib3。
我想要:
- 在 app/CMakeLists.txt 中,它只链接到 lib2。这里的逻辑是,app/src.cpp 只使用了 g(),所以在编写 app/src.cpp 时,我们不能指定对 lib1 的依赖,因为它是 lib2 的实现细节。所以按照这个逻辑,app/CMakeLists.txt中不能有lib1的相关内容,即既不是lib1的include_directories,也不是lib1的add_subdirectory,也不是lib1的target_link_libraries等。
- 由于没有人使用 lib3,它甚至不会被构建。这需要自动完成。所以为 lib1 和 lib2 而不是 lib3 手动 add_subdirectory 不是一个聪明的方法。您可以想象,如果我们有一个非常大的源代码树,它具有复杂的树结构和依赖关系,并且在数百个不同的子目录中有数百个可执行文件。如果我只想构建其中的几个,那么我根本不想费心构建未使用的库。
所以我的问题是:有没有办法以可扩展的方式编写 CMakeLists.txt 文件以满足上述要求?如果没有,那么是否有一些类似的工具可以做到这一点?
谢谢。
【问题讨论】:
标签: c++ cmake build-automation