我对cmake感到崩溃。在这个答案之后,我尝试制作一个简单的示例并将其放在 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 存储库中。
现在我可以test1
使用 cmake 调用来编译应用程序,cmake path_to_test1_CmakeLists.txt
对此我很高兴。但是,如果我尝试启动cmake path_to_root_CmakeLists.txt
它,它就不起作用,因为该文件Findfoo.cmake
被读取了两次(而且我无法使用一些if
不读取它两次)。
然后,如果我运行 test1 cmake,则会在其中创建一个带有 cmake 缓存等的 foo 目录,root/cmake
但我不想要它。我希望 cmake 必须生成的所有文件都在root/build
目录中。
所以,这些是我的两个问题:
- 如何创建一个可以构建所有应用程序和所有未来测试的 CmakeLists.txt,我将在模块目录中编写
- 如何避免启动单个应用程序的 cmake 会在 cmake 目录中创建文件。
抱歉,如果我的英语和我对 cmake 工作原理的想法不好......我希望它很清楚。
编辑:
还有一件事。在 Findfoo.cmake 我有一个不好的 hack:当我从 test1 调用 cmake 时,为了在 modules/foo 中添加真正的 CMakeLists.txt 我必须添加一个不在树中的子目录。也许这种 hack 可能是删除审查整个结构..