Распространять зависимости в заголовок ExternalProject с помощью cmake

Я пытаюсь создать библиотеку только для заголовков, используя CMake ( Microsoft / GSL), таким образом, чтобы я мог использовать такие переменные, как GSL_INCLUDE_DIRS а также GSL_LIBRARIES связать с целью и распространить соответствующие зависимости.

Проект, над которым я работаю, имеет ТОННУЮ подкаталоги, и все внешние проекты построены в своих собственных подкаталогах, поэтому переменные важны.

Я использую CMake 3.2.3

Обычно (для библиотеки с фактическим.lib или.a) я бы сделал что-то вроде:

SET(TARGET_NAME gsl)

include(ExternalProject)
ExternalProject_Add(
    ${TARGET_NAME}-ext
    URL "http://target/url"
    CONFIGURE_COMMAND ""
    BUILD_COMMAND ""
    INSTALL_COMMAND ""
)   # download/unzip the header-only project

# Specify include dir
SET(${TARGET_NAME}_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/include CACHE STRING "${TARGET_NAME} include directory")

# Library
add_library(${TARGET_NAME} SHARED IMPORTED GLOBAL)
SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES 
    IMPORTED_LOCATION "some/path/to/some/lib"
)
add_dependencies(${TARGET_NAME} ${TARGET_NAME}-ext)
SET(${TARGET_NAME}_LIBRARIES ${TARGET_NAME} CACHE STRING "${TARGET_NAME} library location")

MARK_AS_ADVANCED(${TARGET_NAME_UPPER}_DIR ${TARGET_NAME_UPPER}_INCLUDE_DIRS ${TARGET_NAME_UPPER}_LIBRARIES)

Проблема здесь в том, что в библиотеке только для заголовка нет библиотеки для установки импортируемого пути, поэтому я не могу использовать IMPORTED библиотека. Если я вообще не использую библиотеку, то я не могу установить зависимости в других модулях на GSL без сборки (т.е. загрузки / распаковки) каждый раз, что я не хочу делать. custom_target будет та же проблема, так что это не ходи.

Я думаю, что я хочу, это интерфейсная библиотека, что-то вроде

add_library(${TARGET_NAME} INTERFACE)
add_dependencies(${TARGET_NAME} ${TARGET_NAME}-ext)

но тогда cmake жалуется, что

CMake Ошибка в 3rdParty/gsl/CMakeLists.txt:33 (add_dependencies): add_dependencies Невозможно добавить зависимости целевого уровня к целевой библиотеке INTERFACE "gsl".

Можно ли как-то использовать интерфейсную библиотеку (или что-то еще) для распространения зависимости от внешнего проекта?

1 ответ

Решение

Запретить зависимости от INTERFACE Библиотеки были упущением, которое было исправлено в CMake версии 3.3. После обновления до последней стабильной версии я смог использовать методологию, описанную в вопросе, и она работала точно так, как хотелось бы.

Другие вопросы по тегам