我使用一些我不想构建的库作为每个使用它们的项目的一部分.一个非常容易理解的例子是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 include()
命令文档后,我遇到了同样的问题.它指出:
从给定的文件加载并运行CMake代码.[...为了简洁起见......]如果指定了模块而不是文件,则首先在CMAKE_MODULE_PATH中搜索名为.cmake的文件,然后在CMake模块目录中搜索.cmake.
这留下了很多关于CMake认为模块与文件的关系的解释,因为CMake模块毕竟是文件系统上的文件.那有什么区别?
CMake源代码是我能找到答案的唯一地方.基本上,CMake认为参数include()
是一个文件,如果它看起来像一个绝对路径.这意味着:
CMake假设任何不符合上述标准的内容都是模块.在这种情况下,它将'.cmake'附加到参数并在CMAKE_MODULE_PATH中搜索它.
文件是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)
归档时间: |
|
查看次数: |
39306 次 |
最近记录: |