распространять зависимости в заголовок 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».

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

3

Решение

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

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]