Я пытаюсь создать библиотеку только для заголовков, используя 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».
Можно ли как-то использовать интерфейсную библиотеку (или что-то еще) для распространения зависимости от внешнего проекта?
Запретить зависимости от INTERFACE
библиотеки было упущение, которое было исправлено в CMake версии 3.3. После обновления до последней стабильной версии я смог использовать методологию, описанную в вопросе, и она работала точно так, как хотелось бы.
Других решений пока нет …