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

Ste*_*314 37 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可以使用的东西.

事实上,我仍然可以回答我自己的问题.

Mat*_* B. 39

我相信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/
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

也许您的问题是您正在尝试从环境中定义模块路径.相反,尝试您尝试访问模块/文件的CMakeList中简单地附加到它.

  • 现在回头看看那段代码,我注意到我没有附加到`CMAKE_MODULE_PATH`; 我完全破坏了它.你可能想做更多的事情:`set(CMAKE_MODULE_PATH"$ {CMAKE_MODULE_PATH}; $ {CMAKE_CURRENT_SOURCE_DIR}/cmake")` (8认同)
  • 更好的是:`list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")`。 (3认同)

msh*_*ldt 8

阅读CMake include()命令文档后,我遇到了同样的问题.它指出:

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

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

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

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

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


Din*_*hen 5

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

cmake --help-command-list 
Run Code Online (Sandbox Code Playgroud)

模块是一个cmake文件(* .cmake),其中包含cmake命令。

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

要将模块路径附加到CMAKE_MODULE_PATH

LIST(APPEND CMAKE_MODULE_PATH ${YourPath})
Run Code Online (Sandbox Code Playgroud)

或者,如果您希望先使用模块

LIST(INSERT CMAKE_MODULE_PATH 0 ${Yourpath})
Run Code Online (Sandbox Code Playgroud)