在CMake中列出include_directories

78

我有一个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格式),以便我可以将它们添加到我的自定义命令中?

3个回答

131
您可以使用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文件中继承的命令。如果您的find_package和include_directories命令分散在许多子目录中,这将成为一个具有挑战性的问题。
如果遇到这种情况,您可以考虑使用自己的函数或宏覆盖include_directories命令,并自行跟踪传递给它的值。或者,只需在每次调用include_directories时将它们累积到全局属性或内部缓存变量中。
请参阅此处的文档:

https://cmake.org/cmake/help/latest/command/get_property.html

https://cmake.org/cmake/help/latest/prop_dir/INCLUDE_DIRECTORIES.html


2
有没有办法获取系统包含路径而不是所有的包含路径?示例: include_directories(SYSTEM system/include) include_directories(local/include) get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY ????) - mchiasson
1
我不知道有没有方法,但可能存在一种。这可能值得提出一个问题。如果谷歌不能轻易地揭示一个方法,我将不得不深入挖掘CMake源代码来看看是否能找到一种方法... - DLRdave
6
GET_DIRECTORY_PROPERTY(output INCLUDE_DIRECTORIES) MESSAGE(WARNING ${output})这将打印所有的-I目录,如:/usr/local/include/ - Gelldur
一些目录可以通过编译器标志进行包含,因此打印CMAKE_C_LINK_FLAGS变量(或您语言的相应变量)可能会很有用: message(STATUS“CMAKE_C_LINK_FLAGS = $ {CMAKE_C_LINK_FLAGS}”) - quent
@DLRdave:“如果您的find_package和include_directories命令分散在许多子目录中,这将成为一个具有挑战性的问题。” 有人能否详细解释一下这个问题? - John

1
我们的解决方案是将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()

0

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)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接