代码之家  ›  专栏  ›  技术社区  ›  Steve314

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

  •  30
  • Steve314  · 技术社区  · 14 年前

    我使用一些我不希望作为每个使用它们的项目的一部分构建的库。一个很容易理解的例子是LLVM,它有78个静态库。甚至让cmake代码在每个cmake文件中查找和导入这些代码也是多余的。

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

    只是普通的不行。cmake找不到我在include命令中指定的文件。

    在偶然的情况下,我甚至尝试在环境变量中以多种方式指定路径-一次使用反斜杠,一次使用正斜杠…-我每次都重新启动命令提示符,并检查环境变量是否存在和正确。

    在cmake手册中,它有点暗示“文件”与“模块”不同——只有模块自动添加扩展名并搜索路径处理。但是没有任何解释来解释这两者之间的区别。我猜想丢失的扩展可能足够了(与标准模块一样),但显然不是。

    搜索手册中的“模块”并没有多大帮助,因为这个词似乎超载了。例如,模块也是使用loadlibrary/dl_open加载的动态库。

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

    我在Windows上使用cmake 2.8.1。

    编辑

    我很有信心,这里的问题是不理解cmake应该如何工作。我想我 应该 正在做的就是写一些 find_package 可以一起工作。

    尽管如此,我还是有办法回答我自己的问题。

    3 回复  |  直到 7 年前
        1
  •  31
  •   mbauman    14 年前

    我相信cmake“module”只是一个可以与 find_package 指令。也就是说,当你跑步时 find_package(Module) ,它在模块路径中搜索名为 FindModule.cmake .

    也就是说,如果你 include 没有扩展名的文件,它也会在模块路径中搜索 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
    

    也许您的问题是您正试图从环境中定义模块路径。相反,尝试简单地附加到它上面 在内部 您试图访问模块/文件的关键列表。

        2
  •  7
  •   mshildt    7 年前

    我在读了电影后也有同样的问题 include() 命令文档。它指出:

    从给定的文件加载并运行cmake代码。[…snip for brevity…]如果指定模块而不是文件,则首先在cmake_module_path中搜索名为.cmake的文件,然后在cmake module目录中搜索。

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

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

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

    cmake假设任何不符合上述标准的东西都是一个模块。在这种情况下,它将“.cmake”附加到参数并搜索cmake_模块_路径。

        3
  •  4
  •   Ding-Yi Chen    9 年前

    文件是cmake listfile,例如cmakelists.txt。使用以下命令获取中使用的命令列表

    cmake --help-command-list 
    

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

    正如Matt B.所说,cmake_模块路径不是shell的环境变量,而是cmake变量。

    将模块路径附加到cmake_模块路径

    LIST(APPEND CMAKE_MODULE_PATH ${YourPath})
    

    或者如果你先执行你的模块

    LIST(INSERT CMAKE_MODULE_PATH 0 ${Yourpath})