62 lines
2.3 KiB
CMake
62 lines
2.3 KiB
CMake
#[=======================================================================[.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
|
||
)
|
||
|
||
string(TOLOWER ${NAME} lower_name)
|
||
FetchContent_GetProperties(${NAME})
|
||
if(NOT ${lower_name}_POPULATED)
|
||
FetchContent_Populate(${NAME})
|
||
add_subdirectory(${${NAME}_SOURCE_DIR} ${${NAME}_BINARY_DIR})
|
||
endif()
|
||
|
||
endfunction()
|