我使用一些我不想构建的库作为每个使用它们的项目的一部分。一个非常容易理解的例子是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
可以使用的东西。
尽管如此,我仍然可以回答自己的问题。
答案 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()
的参数是一个文件,如果它看起来像一个绝对路径。这意味着:
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})