对于cmake“include”命令,文件和模块之间有什么区别?

时间:2010-07-14 18:56:06

标签: cmake

我使用一些我不想构建的库作为每个使用它们的项目的一部分。一个非常容易理解的例子是LLVM,它有78个静态库。即使使用cmake代码在每个cmakefile中查找和导入这些代码也是过分的。

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

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

在off-chance上,我甚至尝试用几种方式在环境变量中指定路径 - 一次使用反斜杠,一次使用正斜杠... - 每次都重新启动命令提示符并检查环境变量是否存在并且正确。

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

搜索手册中的“模块”没什么帮助,因为这个词似乎过载了。例如,模块也是使用LoadLibrary / dl_open加载的动态库。

任何人都可以解释一下这个上下文中文件和模块之间的区别,以及我如何创建自己的模块以便cmake include命令可以找到并使用它?

我在Windows上使用cmake 2.8.1。

修改

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

尽管如此,我仍然可以回答自己的问题。

3 个答案:

答案 0 :(得分:32)

我相信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_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中。

答案 1 :(得分:8)

在阅读CMake include()命令文档后,我遇到了同样的问题。它声明:

  

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

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

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

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

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

答案 2 :(得分:5)

文件是CMake列表文件,例如CMakeLists.txt。使用以下命令获取

中使用的命令列表
cmake --help-command-list 

Module是一个包含cmake命令的cmake文件(* .cmake)。

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

将模块路径附加到CMAKE_MODULE_PATH

LIST(APPEND CMAKE_MODULE_PATH ${YourPath})

或者如果您首先使用您的模块

LIST(INSERT CMAKE_MODULE_PATH 0 ${Yourpath})