列出CMake中的include_directories

时间:2011-08-01 17:33:49

标签: cmake

我有一个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 个答案:

答案 0 :(得分:88)

您可以使用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

答案 1 :(得分: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()

答案 2 :(得分: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)

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