【发布时间】:2013-06-23 18:41:00
【问题描述】:
cmake 让我心烦意乱。在this answer 之后,我尝试做一个简单的例子并将其放在github 中,因为目录中有很多文件,在这里复制所有内容可能会很无聊。
我想做的是构建一个简单的框架来处理我的 qt/opencv/opengl 实验。我喜欢的是一个包含这些目录的存储库:
root*
|-apps
|---test1*
|
|-build
|-cmake*
|
|-modules
|---foo*
(* 签名的目录是包含一些 cmake 文件的目录,例如 CmakeLists.txt 或 FindXXModule.cmake)
在模块中我可以编写模块(例如用于面部识别的模块,用于在 opengl 中绘制红色立方体的模块,包含我个人 qt 小部件扩展的模块)。
我需要一种简单的方法来创建应用程序并在其上链接一些模块。为此,我想创建一个 cmake 目录来放置 FindXXModule.cmake 并在应用程序中说:find_package(XXModule)。
请注意,现在我不关心安装这个存储库,树结构必须是这个(所以如果我在应用程序/test2 中,我知道我可以将 cmake 目录称为 ../../cmake 或模块目录是../../modules)
我写了一个名为test1 的应用程序的小例子,它使用了模块foo,我把它放在github repository 中。
现在我可以使用 cmake 调用 cmake path_to_test1_CmakeLists.txt 来编译应用程序 test1,对此我很高兴。但是,如果我尝试启动 cmake path_to_root_CmakeLists.txt 它不起作用,因为文件 Findfoo.cmake 被读取了两次(并且我无法使用一些 if 不读取它两次)。
然后,如果我运行 test1 cmake,则会在 root/cmake 中创建带有 cmake 缓存等的 foo 目录,但我不想要它。我希望 cmake 必须生成的所有文件都在 root/build 目录中。
所以,这是我的 2 个问题:
- 如何创建一个可以构建所有应用程序的 CmakeLists.txt 以及我将在模块目录中编写的所有未来测试
- 如何避免启动单个应用程序的 cmake 会在 cmake 目录中创建文件。
对不起,如果我的英语和我对 cmake 工作原理的想法不好......我希望它很清楚。
编辑:
还有一件事。在 Findfoo.cmake 我有一个不好的 hack:当我从 test1 调用 cmake 时,为了在 modules/foo 中添加真正的 CMakeLists.txt 我必须添加一个不在树中的子目录。也许这种 hack 可能是删除审查整个结构..
【问题讨论】:
标签: cmake