Подтвердить что ты не робот

Как иметь заголовки заголовков CMake, которые не являются частью какой-либо бинарной цели, в среде IDE?

В нашем рабочем процессе мы можем иметь модуль A, состоящий из нескольких файлов заголовков, модуль A, не создающий двоичный файл (сторона примечания: очевидно, он будет использоваться другими модулями, которые включают некоторые заголовки из модуля A в создавать двоичные файлы).

Хорошим примером будет библиотека только для заголовков, для которой CMake 3 обеспечивает хорошую поддержку благодаря понятию библиотеки INTERFACE (см. этот ответ SO)., и CMake документация об этой функции).

Мы можем сделать целевую библиотеку интерфейса из модуля A:

add_library(module_A INTERFACE)

Это дает нам все приятные черты целей CMakes (можно использовать его как другую целевую зависимость, экспортировать ее, передавать транзитные требования и т.д.).

Но в этом случае заголовки в модуле A не отображаются в нашей среде IDE (Xcode, но мы ожидаем, что она будет одинаковой с большинством/каждой другой IDE).

Это является серьезным недостатком в рабочем процессе, так как нам нужны файлы, составляющие модуль A, который будет показан в среде IDE для издания. Можно ли это достичь?

4b9b3361

Ответ 1

Несколько месяцев спустя, я не нашел способ напрямую перечислить файлы заголовков для библиотеки INTERFACE.

Поскольку у вопроса все еще есть некоторые взгляды, вот что я в итоге сделал (то есть, что похоже на меньший взлом, доступный в настоящее время).

Представьте, что модуль A является библиотекой только заголовка. В CMakeLists.txt, объявляющем свою цель:

# Define 'modA_headers' variable to list all the header files
set(modA_headers 
  utility.h
  moreUtilities.h
  ...)

add_library(moduleA INTERFACE) # 'moduleA' is an INTERFACE pseudo target

#
# From here, the target 'moduleA' can be customised
#
target_include_directories(moduleA ...) # Transitively forwarded
install(TARGETS moduleA ...)

#
#  HACK: have the files showing in the IDE, under the name 'moduleA_ide'
#
add_custom_target(moduleA_ide SOURCES ${modA_headers})

Я не принимаю этот ответ, так как я ожидаю, что дальнейшие релизы CMake будут предлагать более семантически правильный подход, который затем будет принят:)

Ответ 2

Вы можете использовать новую команду target_sources в CMake 3.1.

add_library(moduleA INTERFACE)
target_include_directories(moduleA INTERFACE ...)
target_sources(moduleA INTERFACE 
  ${CMAKE_CURRENT_SOURCE_DIR}/utility.h
  ${CMAKE_CURRENT_SOURCE_DIR}/moreUtilities.h
)

Он также транзитивен.

http://www.cmake.org/cmake/help/v3.1/command/target_sources.html#command:target_sources

Ограничение невозможности экспорта целей, для которых INTERFACE_SOURCES был снят для CMake 3.3.