【问题标题】:Listing include_directories in CMake在 CMake 中列出 include_directories
【发布时间】:2011-10-17 15:29:28
【问题描述】:

我有一个 cmake 构建,我正在其中搜索一堆依赖项,即我有很多实例:

FIND_PACKAGE(SomePackage)
if(SOMEPACKAGE_FOUND)
  include_directories(${SOMEPACKAGE_INCLUDE_DIR})
  link_libraries(${SOMEPACKAGE_LIBRARIES})
endif(SOMEPACKAGE_FOUND)

现在,我想添加一个自定义命令来构建一个预编译的头文件,但要做到这一点,我需要知道我的include_directories 调用添加的所有路径。如何获取这些目录的列表(最好使用正确的 -I/path/to/directory 格式),以便将它们添加到我的自定义命令中?

【问题讨论】:

    标签: cmake


    【解决方案1】:

    您可以使用 get_property 命令检索目录属性的值 INCLUDE_DIRECTORIES

    类似这样的:

    get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
    foreach(dir ${dirs})
      message(STATUS "dir='${dir}'")
    endforeach()
    

    此目录属性的值仅跟踪先前出现在同一 CMakeLists 文件中的 include_directories 命令,或者从父 CMakeLists 文件中的先前出现继承而来的 include_directories 命令。如果您的 find_package 和 include_directories 命令分散在许多子目录中,这将成为一个具有挑战性的问题。

    如果你达到了这一点,你可以考虑用你自己的函数或宏覆盖 include_directories 命令,并自己跟踪传递给它的值。或者,只需在每次调用 include_directories 的同时将它们累积到全局属性或内部缓存变量中。

    在此处查看文档:

    http://cmake.org/cmake/help/v2.8.8/cmake.html#command:get_property

    http://cmake.org/cmake/help/v2.8.8/cmake.html#prop_dir:INCLUDE_DIRECTORIES

    【讨论】:

    • 有没有办法让系统包含而不是每个包含?例如:include_directories(SYSTEM system/include)include_directories(local/include)get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY ????)
    • 我不知道有什么方法,但可能有。可能值得自己提出一个问题。我将不得不深入研究 CMake 源代码,看看我是否能找到一种方法,如果 Googs 不容易揭示一个......
    • GET_DIRECTORY_PROPERTY(output INCLUDE_DIRECTORIES) MESSAGE(WARNING ${output}) 这将打印所有-I 目录,例如:/usr/local/include/
    • 某些目录可以通过编译器标志包含,因此额外打印 CMAKE_C_LINK_FLAGS 变量(或您的语言的相应变量)会很有用: message(STATUS "CMAKE_C_LINK_FLAGS=${CMAKE_C_LINK_FLAGS}")
    • @DLRdave “如果您的 find_package 和 include_directories 命令分散在许多子目录中,这将成为一个具有挑战性的问题。”有人可以更详细地解释一下吗?
    【解决方案2】:

    我们将 conan 添加的包含目录写入文件的解决方案

    function(output_conan_include_dirs)
        set(include_dir_str "")
        foreach(DIR ${CONAN_INCLUDE_DIRS})
            set(include_dir_str "${include_dir_str}${DIR}\n")
        endforeach()
    
        set(pth "${CMAKE_BINARY_DIR}/conan-includes.txt")
        file(WRITE "${pth}" "${include_dir_str}")
        message(STATUS "Conan include directories written to: ${pth}")
    endfunction()
    
    output_conan_include_dirs()
    

    【讨论】:

      【解决方案3】:

      DLRdave 在答案中建议的代码有效,谢谢!今天我遇到了同样的问题,包括问题中的括号:(最好使用正确的 -I/path/to/directory 格式)。

      尽管 cmake 一定会在内部某处执行此操作,但我没有找到直接的解决方案。我能想到的最好的事情是

      get_directory_property (inc_dirs INCLUDE_DIRECTORIES)
      list(TRANSFORM inc_dirs PREPEND "-I ")
      list(JOIN inc_dirs " " INCLUDE_STRING)
      

      有没有办法避免中间变量??

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-13
        • 2016-01-24
        • 2017-05-01
        相关资源
        最近更新 更多