2013-06-01 2 views
0

Я хотел бы добавить все заголовки в проект cmake. Вариант использования заключается в том, что я получаю этот список заголовков и вызываю некоторые пользовательские проверки на них. Я бы очень хотел, чтобы это было механизмом запросов для устранения ошибок в надзоре.Добавлены заголовки запросов к проекту cmake

Я не заинтересован в подгонке файловой системы, поскольку могут существовать заголовки, которые не подходят для каждой платформы. Это тоже плохо.

Это то, что я хотел бы, чтобы использование выглядело.

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}") 

Это то, что я сейчас делаю, и это работает, мне просто интересно, есть ли лучший способ.

+0

Обычно я делаю это, как ваш второй пример. – drescherjm

ответ

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) 
+0

Будет ли это тянуть внешние зависимости? Например, например, заголовки ускорителей? У меня возникают проблемы с поиском, где поддерживаются все свойства, которые 'get_target_property' поддерживает. –

+0

Он будет работать только для реальных целей CMake, т. Е. Вещей, добавленных через 'add_library',' add_executable' и т. Д. Поэтому, если boost включается через 'find_package', он не будет работать для повышения. – Fraser

+0

Документ зарегистрирован в списке свойств, применимых к объектам [здесь] (http://www.cmake.org/cmake/help/v2.8.11/cmake.html#section_PropertiesonTargets) – Fraser

Смежные вопросы