CMAKE为构建一个简单的框架

时间:2013-06-23 18:41:00

标签: cmake

我的脑子里充满了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个问题:

  • 如何创建可以构建所有应用程序的CmakeLists.txt以及我将在模块目录中编写的所有未来测试
  • 如何避免启动单个应用程序的cmake将在cmake目录中创建文件。

很抱歉,如果我的英语和我对cmake如何运作的看法不好......我希望很清楚。

编辑:

还有一件事。在Findfoo.cmake中我有一个糟糕的黑客:当我从test1调用cmake时,在modules / foo中添加真正的CMakeLists.txt我必须添加一个不在树中的子目录..也许这种黑客可能是删除审查enteire结构..

1 个答案:

答案 0 :(得分:0)

正如您所说,您希望将整个目录结构放入源代码管理中。这意味着这些文件夹结构在您结帐的每个位置都是相同的。那么,如果foo目录有相对路径,为什么要创建Findfoo.cmake?

我建议将一个CMakelists.txt文件放入root中,添加所有子目录。为了减少CMake和原始文件生成的文件之间的混淆,您应该创建一个名为./build(甚至是../build)的文件夹,并在该目录中运行CMake,并将根目录作为第一个参数。这将在./build目录中创建所有CMake生成的文件,并使您可以轻松地清理它。这种工作方式称为源外构建,强烈建议以这种方式使用cmake。有关示例,请参阅this question