0

我想将所有标题添加到 cmake 项目中。用例是我会得到这个标题列表并在它们上调用一些自定义验证。我真的很希望这是一种查询机制,以减轻监督错误。

我对 globbing 文件系统不感兴趣,因为可能存在不适用于每个平台的标头。这也很糟糕。

这就是我希望使用的样子。

add_library(example_lib
    foo.h
    foo.cpp
    bar.h
    bar.cpp
)

add_executable(example main_example.cpp)
target_link_libraries(example example_lib)

# this is the feature I am interested in
get_target_headers(example_header example)

# alternatively
get_target_headers(example_header example example_lib)

do_custom_thing("${example_header}")

一种更手动的方法如下所示。我只是重用example_header变量来进行自定义验证。

set(example_header
    foo.h
    bar.h
)

set(example_source
    foo.cpp
    bar.cpp
)

add_library(example_lib
    ${example_header}
    ${example_source}
)

add_executable(example main_example.cpp)
target_link_libraries(example example_lib)

do_custom_thing("${example_header}")

这就是我现在正在做的事情并且它有效,我只是想知道是否有更好的方法。

4

1 回答 1

2

如果您的所有标题都有“.h”后缀,您可以使用以下内容:

function(get_target_headers Headers MainTarget)
  # Gather list of MainTarget's dependencies
  get_target_property(Dependencies ${MainTarget} LINK_LIBRARIES)
  set(AllTargets ${MainTarget})
  foreach(Dependency ${Dependencies})
    # If this is a CMake target, add it to the list
    if(TARGET ${Dependency})
      list(APPEND AllTargets ${Dependency})
    endif()
  endforeach()

  # Gather each target's list of source files ending in ".h"
  foreach(Target ${AllTargets})
    get_target_property(Sources ${Target} SOURCES)
    foreach(Source ${Sources})
      string(REGEX MATCH "^.*\\.h$" Header ${Source})
      if(Header)
        list(APPEND AllHeaders ${Header})
      endif()
    endforeach()
  endforeach()

  # Since functions have their own scope, set the list in the parent scope
  set(${Headers} ${AllHeaders} PARENT_SCOPE)
endfunction()

并使用您的首选调用它:

get_target_headers(example_header example)
于 2013-06-03T12:42:43.663 回答