我的脑子里充满了cmake。在this answer之后我试图做一个简单的例子并将它放在github中,因为目录中有很多文件,并且可能无聊复制一切。
我想做的是构建一个简单的框架来处理我的qt / opencv / opengl实验。我喜欢的是一个包含这些目录的存储库:
root*
|-apps
|---test1*
|
|-build
|-cmake*
|
|-modules
|---foo*
(* signed目录是带有一些cmake文件的目录,如CmakeLists.txt或FindXXModule.cmake)
在模块中我可以编写模块(例如用于面部识别的模块,用于在opengl中绘制红色立方体的模块,包含我的个人qt小部件扩展的模块)。
我需要一种简单的方法来创建应用程序并在其上链接一些模块。为此我想创建一个cmake目录,在那里放置FindXXModule.cmake并在应用程序中说:find_package(XXModule)
。
请注意,现在我不关心安装此存储库,并且树结构必须是这个(因此,如果我在apps / test2中,我知道我可以将cmake目录称为../../cmake
或模块目录是../../modules
)
我已经使用名为test1
的应用程序编写了一个小例子,该应用程序使用模块foo
并将其放在github repository中。
现在我可以使用cmake调用test1
编译应用程序cmake path_to_test1_CmakeLists.txt
,我很高兴。但是,如果我尝试启动cmake path_to_root_CmakeLists.txt
,它就不起作用,因为文件Findfoo.cmake
被读取了两次(而且我无法使用某些if
来不读取它两次)。
然后,如果我运行test1 cmake,在root/cmake
中创建了一个带有cmake cache等的foo目录,我不想要它。我希望cmake必须生成的所有文件都在root/build
目录中。
所以,这些是我的2个问题:
很抱歉,如果我的英语和我对cmake如何运作的看法不好......我希望很清楚。
还有一件事。在Findfoo.cmake中我有一个糟糕的黑客:当我从test1调用cmake时,在modules / foo中添加真正的CMakeLists.txt我必须添加一个不在树中的子目录..也许这种黑客可能是删除审查enteire结构..
答案 0 :(得分:0)
正如您所说,您希望将整个目录结构放入源代码管理中。这意味着这些文件夹结构在您结帐的每个位置都是相同的。那么,如果foo目录有相对路径,为什么要创建Findfoo.cmake?
我建议将一个CMakelists.txt文件放入root中,添加所有子目录。为了减少CMake和原始文件生成的文件之间的混淆,您应该创建一个名为./build(甚至是../build)的文件夹,并在该目录中运行CMake,并将根目录作为第一个参数。这将在./build目录中创建所有CMake生成的文件,并使您可以轻松地清理它。这种工作方式称为源外构建,强烈建议以这种方式使用cmake。有关示例,请参阅this question。