распространять зависимости в 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 без сборки (т.е. загрузки / распаковки) каждый раз, чего я не хочу делать. a 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".

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


person Nicolas Holthaus    schedule 25.02.2016    source источник
comment
Пожалуйста, поясните: создайте библиотеку только для заголовков, потому что нет сборки для файлов .lib, .so или .dll. Используйте их напрямую или установите соответствующий путь включения.   -  person knivil    schedule 25.02.2016
comment
@knivil Я обновил заголовок вопроса, убрав слово "сборка". Тем не менее, я думаю, что относительно ясно в вопросе, что я хочу использовать cmake для загрузки / распаковки библиотеки только для заголовков, но таким образом, чтобы он запускал внешний проект только в том случае, если этого требуют зависимости.   -  person Nicolas Holthaus    schedule 25.02.2016
comment
Сообщение об ошибке для импортированной библиотеки выглядит фиктивным. Действительно ли ваша версия cmake поддерживает библиотеки INTERFACE? Каково значение TARGET_NAME?   -  person pmr    schedule 25.02.2016
comment
@pmr обновил вопрос, указав фактическое имя цели и полное сообщение об ошибке. Это не подделка. Я использую cmake версии 3.2.3, и насколько я понимаю, библиотеки интерфейса были введены в 3.0.0.   -  person Nicolas Holthaus    schedule 25.02.2016
comment
Кроме того, я не понимаю, какова цель вызова add_dependencies. Библиотека INTERFACE не может иметь зависимости, потому что в любом случае с ней нечего делать.   -  person pmr    schedule 25.02.2016
comment
Хорошо, теперь я понял. Он нужен вам для запуска загрузки библиотеки для ExternalProject. Звучит как допустимый вариант использования, а ограничение на цель INTERFACE кажется несколько искусственным. Может быть, спросите ML и запросите функцию.   -  person pmr    schedule 25.02.2016
comment
@pmr мой проект состоит из множества сторонних зависимостей, библиотек и исполняемых файлов, все из которых могут быть созданы независимо. Мне нужно иметь возможность привязать зависимость от gsl к целям, которым нужны эти заголовки, чтобы они были доступны, чтобы что-то действительно заставляло gsl загружаться и распаковываться до создания вещей, которые его потребляют.   -  person Nicolas Holthaus    schedule 25.02.2016
comment
@pmr Из-за вашей интуиции, что ошибка кажется ложной, я получил версию 3.4.3, попробовал ее, и она сработала, как и ожидалось. По-видимому, это была ошибка / недосмотр, исправленная в версии 3.3.   -  person Nicolas Holthaus    schedule 25.02.2016


Ответы (1)


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

person Nicolas Holthaus    schedule 25.02.2016