2010-07-14 76 views
25

我使用一些我不想构建的库,作为使用它们的每个项目的一部分。一个非常容易理解的例子是LLVM,它有78个静态库。即使有cmake代码在每个cmake文件中查找和导入这些代码都是过度的。对于cmake“include”命令,文件和模块有什么区别?

显而易见的解决方案似乎是使用“include”命令,并将相关的cmake脚本块分解为* .cmake文件,并设置CMAKE_MODULE_PATH环境变量。

除了它只是普通不起作用。 Cmake没有找到我在include命令中指定的文件。

就机会而言,我甚至试图用几种方式指定环境变量中的路径 - 一次是反斜线,一次是正斜杠......并且我每次都重新启动命令提示符并检查环境变量是目前和正确。

在cmake手册中,它意味着“文件”与“模块”不同 - 只有一个模块获得自动添加扩展和搜索路径处理。但是没有解释有什么不同。我猜想,缺少的扩展可能已经足够了(与标准模块一样),但显然不是。

在该手册中搜索“模块”没有太大的帮助,因为这个词似乎被重载。例如,一个模块也是一个使用LoadLibrary/dl_open加载的动态库。

任何人都可以解释在这种情况下文件和模块之间有什么区别,以及如何创建我自己的模块,以便cmake include命令可以找到并使用它?

我在Windows上使用cmake 2.8.1。

编辑

我很有信心,这里的问题是不理解的cmake是如何工作的。我认为应该正在做的是写find_package可以使用的东西。

虽然事实证明,我仍然有些不能回答我自己的问题。

回答

26

我相信CMake'模块'只是一个可以与find_package指令一起使用的文件。也就是说,当您运行find_package(Module)时,它会在MODULE_PATH中搜索名为FindModule.cmake的文件。

也就是说,如果include文件没有扩展名,它也会通过你的MODULE_PATH搜索那个file.cmake。在我正在开发的CMake项目中,我的目录结构与您的建议非常相似。

+ root/ 
    + CMakeLists.txt 
    + cmake/ 
    | + FindMatlab.cmake 
    | + TestInline.cmake 
    | + stdint.cmake 
    + src/ 
    + include/ 

在的CMakeLists.txt我:

set (CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") 
find_package (Matlab) # runs FindMatlab.cmake 
include(TestInline) # defines a macro: 
test_inline (CONFIG_C_INLINE) 
include(stdint) # simply executes flat CMake code 

也许你的问题是,你正试图定义从环境的模块路径。相反,试着简单地将附加到之内,您试图访问模块/文件的CMakeList。

+7

现在回头看看这段代码,我注意到我没有追加到'CMAKE_MODULE_PATH';我完全打破了它。你可能想要做更多的事情:'set(CMAKE_MODULE_PATH“$ {CMAKE_MODULE_PATH}; $ {CMAKE_CURRENT_SOURCE_DIR}/cmake”)' – 2010-07-16 01:16:45

+0

我现在没有时间检查,但这看起来不错。谢谢。 – Steve314 2010-07-16 08:09:32

+0

我不知道为什么我现在认为变量是一个环境变量。我想,看看我在找什么,而不是在那里。我最近刚刚在YouTube上观看了Google的techtalk视频,并指出环境变量大多是故意避免的。无论如何 - 接受和感谢。 – Steve314 2010-07-17 03:11:03

2

文件是CMake listfile,例子是CMakeLists.txt。使用下面的命令来获得

cmake --help-command-list 

模块使用的命令列表是cmake的文件(* .cmake)包含cmake的命令。

正如Matt B. put,CMAKE_MODULE_PATH不是shell的环境变量,而是cmake变量。

要附加模块路径CMAKE_MODULE_PATH

LIST(APPEND CMAKE_MODULE_PATH ${YourPath}) 

或者,如果你perfer你的模块中使用第一

LIST(INSERT CMAKE_MODULE_PATH 0 ${Yourpath}) 
2

我有同样的问题,阅读CMake的include()命令文档后。它指出:

从给定的文件中加载并运行CMake代码。 [...简写为...]如果指定模块而不是文件,则首先在CMAKE_MODULE_PATH中搜索名称为.cmake的文件,然后在CMake模块目录中搜索。

由于CMake模块毕竟是文件系统上的文件,因此这给CMake认为模块与文件之间留下了很多解释。那有什么区别?

CMake源代码是唯一可以找到答案的地方。基本上CMake认为include()的参数是一个文件,如果它看起来像一个绝对路径。这意味着:

  • 在Linux/Unix
    • 的参数以 '/' 或 '〜'
  • 在Windows
    • 争论的第二个字符是“开始: '(如C :)
    • 参数以'\'开头

CMake假设其他任何不符合上述标准的是模块。在这种情况下,它将'.cmake'附加到参数并搜索CMAKE_MODULE_PATH。

相关问题