Как иметь заголовки заголовков CMake, которые не являются частью какой-либо бинарной цели, в среде IDE?
В нашем рабочем процессе мы можем иметь модуль A, состоящий из нескольких файлов заголовков, модуль A, не создающий двоичный файл (сторона примечания: очевидно, он будет использоваться другими модулями, которые включают некоторые заголовки из модуля A в создавать двоичные файлы).
Хорошим примером будет библиотека только для заголовков, для которой CMake 3 обеспечивает хорошую поддержку благодаря понятию библиотеки INTERFACE
(см. этот ответ SO)., и CMake документация об этой функции).
Мы можем сделать целевую библиотеку интерфейса из модуля A:
add_library(module_A INTERFACE)
Это дает нам все приятные черты целей CMakes (можно использовать его как другую целевую зависимость, экспортировать ее, передавать транзитные требования и т.д.).
Но в этом случае заголовки в модуле A не отображаются в нашей среде IDE (Xcode, но мы ожидаем, что она будет одинаковой с большинством/каждой другой IDE).
Это является серьезным недостатком в рабочем процессе, так как нам нужны файлы, составляющие модуль A, который будет показан в среде IDE для издания. Можно ли это достичь?
Ответы
Ответ 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.