#[=======================================================================[.rst: FetchContent_Add ---------------- Вспомогательная функция для `FetchContent_Declare()`:: FetchContent_Add(NAME [ GIT_REPOSITORY repo ] | [ GIT_REMOTE remote ] | [ GIT_PATH path ]) Обязательные параметры: `NAME` - идентификатор загружаемого ресурса. Параметр `GIT_REPOSITORY` определяет имя репозитория по умолчанию. Если указана пара параметров `GIT_REMOTE` и `GIT_PATH` и у git-репозитория основного проекта указан удалённый репозиторий с именем, определяемым переменной `GIT_REMOTE`, то адрес репозитория для получения проекта изменяется. В этом случае загрузка будет производиться с сервера, определяемого из адреса с меткой `GIT_REMOTE`, и по пути `GIT_PATH`. #]=======================================================================] include_guard(GLOBAL) # Обязательно в глобальной области find_package(Git) function(FetchContent_Add NAME) set(options "") set(oneValueArgs GIT_REPOSITORY GIT_REMOTE GIT_PATH) set(multiValueArgs "") cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if(GIT_FOUND AND ARG_GIT_REMOTE AND ARG_GIT_PATH) execute_process(COMMAND ${GIT_EXECUTABLE} config --get remote.${ARG_GIT_REMOTE}.url OUTPUT_VARIABLE REMOTE_URL ERROR_QUIET) if(REMOTE_URL) string(REGEX REPLACE ":.*" "" SERVER ${REMOTE_URL}) string(FIND ${SERVER} "http" POS) if(NOT POS EQUAL 0) if(NOT SERVER STREQUAL REMOTE_URL) set(ARG_GIT_REPOSITORY "${SERVER}:${ARG_GIT_PATH}") endif() endif() endif() endif() FetchContent_Declare( ${NAME} ${ARG_UNPARSED_ARGUMENTS} GIT_REPOSITORY ${ARG_GIT_REPOSITORY} GIT_SHALLOW 1 ) if(NOT ${NAME}_POPULATED) FetchContent_Populate(${NAME}) add_subdirectory(${${NAME}_SOURCE_DIR} ${${NAME}_BINARY_DIR}) endif() endfunction()