Я пытаюсь создать библиотеку только для заголовков с помощью 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".
Есть ли способ использовать библиотеку интерфейса (или что-то еще) для распространения зависимости от внешнего проекта?