Функция для загрузки необходимого содержимого
This commit is contained in:
		@@ -50,8 +50,7 @@ include(${MYX_CMAKE_LIB_DIR}/NinjaGeneratorWarning.cmake)
 | 
			
		||||
include(${MYX_CMAKE_LIB_DIR}/DirectoriesGuards.cmake)
 | 
			
		||||
include(${MYX_CMAKE_LIB_DIR}/SemanticProjectVersion.cmake)
 | 
			
		||||
include(${MYX_CMAKE_LIB_DIR}/NinjaGeneratorWrapper.cmake)
 | 
			
		||||
include(${MYX_CMAKE_LIB_DIR}/AddExternalTarget.cmake)
 | 
			
		||||
include(${MYX_CMAKE_LIB_DIR}/FetchContentAdd.cmake)
 | 
			
		||||
include(${MYX_CMAKE_LIB_DIR}/DownloadContent.cmake)
 | 
			
		||||
 | 
			
		||||
set(MYX_CMAKE_TOOLCHAINS_DIR "${MYX_CMAKE_LIB_DIR}/toolchains")
 | 
			
		||||
include(${MYX_CMAKE_LIB_DIR}/Toolchains.cmake)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,79 +0,0 @@
 | 
			
		||||
#[=======================================================================[.rst:
 | 
			
		||||
myx_add_external_target
 | 
			
		||||
-----------------------
 | 
			
		||||
 | 
			
		||||
Функция для подключения целей из внешних проектов::
 | 
			
		||||
 | 
			
		||||
  myx_add_external_target(TARGET_NAME
 | 
			
		||||
    [ MODULES_PATH modules_path ] |
 | 
			
		||||
    [ GIT_REPOSITORY url ] |
 | 
			
		||||
    [ GIT_TAG tag ] |
 | 
			
		||||
    [ LOCAL_PATH local_path ] )
 | 
			
		||||
 | 
			
		||||
Обязательный параметр: `TARGET_NAME` - имя цели, содержащейся во внешнем проекте.
 | 
			
		||||
Параметр `MODULES_PATH` содержит имя каталога, в который будут загружаться
 | 
			
		||||
внешние проекты (по умолчанию `modules`). Параметр `GIT_REPOSITORY` содержит
 | 
			
		||||
адрес внешнего проекта, который нужно загрузить с помощью git. Параметр `GIT_TAG`
 | 
			
		||||
содержит используемые метку, идентификатор коммита или ветку в репозитории.
 | 
			
		||||
Параметр `LOCAL_PATH` используется для указания пути к подкаталогу, находящемуся
 | 
			
		||||
вне текущего проекта. Его следует указывать только при вызове функции из
 | 
			
		||||
вспомогательного файла `external_targets.cmake`.
 | 
			
		||||
 | 
			
		||||
#]=======================================================================]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
find_package(Git)
 | 
			
		||||
 | 
			
		||||
function(myx_add_external_target TARGET_NAME)
 | 
			
		||||
  set(options)
 | 
			
		||||
  set(oneValueArgs)
 | 
			
		||||
  set(multiValueArgs MODULES_PATH GIT_REPOSITORY GIT_TAG LOCAL_PATH)
 | 
			
		||||
  cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
 | 
			
		||||
 | 
			
		||||
  if(TARGET ${TARGET_NAME})
 | 
			
		||||
    return()
 | 
			
		||||
  endif()
 | 
			
		||||
 | 
			
		||||
  if(ARG_LOCAL_PATH)
 | 
			
		||||
    myx_message_notice("Using directory ${ARG_LOCAL_PATH} to build target ${TARGET_NAME}")
 | 
			
		||||
    add_subdirectory(${ARG_LOCAL_PATH} ${CMAKE_BINARY_DIR}/${TARGET_NAME} EXCLUDE_FROM_ALL)
 | 
			
		||||
    return()
 | 
			
		||||
  endif()
 | 
			
		||||
 | 
			
		||||
  if(NOT ARG_MODULES_PATH)
 | 
			
		||||
    set(ARG_MODULES_PATH modules)
 | 
			
		||||
  endif()
 | 
			
		||||
 | 
			
		||||
  if(CMAKE_SCRIPT_MODE_FILE)
 | 
			
		||||
    set(PROJECT_SOURCE_DIR ${CMAKE_SOURCE_DIR})
 | 
			
		||||
  endif()
 | 
			
		||||
  set(ARG_MODULES_PATH ${PROJECT_SOURCE_DIR}/${ARG_MODULES_PATH})
 | 
			
		||||
 | 
			
		||||
  if(NOT IS_DIRECTORY ${ARG_MODULES_PATH})
 | 
			
		||||
    execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${ARG_MODULES_PATH})
 | 
			
		||||
  endif()
 | 
			
		||||
 | 
			
		||||
  if(GIT_EXECUTABLE)
 | 
			
		||||
    if(NOT IS_DIRECTORY ${ARG_MODULES_PATH}/${TARGET_NAME})
 | 
			
		||||
      execute_process(COMMAND ${GIT_EXECUTABLE} clone ${ARG_GIT_REPOSITORY} ${TARGET_NAME}
 | 
			
		||||
        WORKING_DIRECTORY ${ARG_MODULES_PATH})
 | 
			
		||||
    else()
 | 
			
		||||
      execute_process(COMMAND ${GIT_EXECUTABLE} fetch
 | 
			
		||||
        WORKING_DIRECTORY ${ARG_MODULES_PATH}/${TARGET_NAME})
 | 
			
		||||
    endif()
 | 
			
		||||
    execute_process(COMMAND ${GIT_EXECUTABLE} checkout ${ARG_GIT_TAG}
 | 
			
		||||
      WORKING_DIRECTORY ${ARG_MODULES_PATH}/${TARGET_NAME})
 | 
			
		||||
  endif()
 | 
			
		||||
 | 
			
		||||
  if(NOT CMAKE_SCRIPT_MODE_FILE)
 | 
			
		||||
    add_subdirectory(${ARG_MODULES_PATH}/${TARGET_NAME} EXCLUDE_FROM_ALL)
 | 
			
		||||
  endif()
 | 
			
		||||
 | 
			
		||||
  if(NOT TARGET ${TARGET_NAME})
 | 
			
		||||
    myx_message_fatal_error("Target ${TARGET_NAME} is not found.")
 | 
			
		||||
  endif()
 | 
			
		||||
 | 
			
		||||
endfunction(myx_add_external_target)
 | 
			
		||||
 | 
			
		||||
include("${PROJECT_SOURCE_DIR}/external_targets.cmake" OPTIONAL)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										72
									
								
								MyxCMake/lib/DownloadContent.cmake
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								MyxCMake/lib/DownloadContent.cmake
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,72 @@
 | 
			
		||||
#[=======================================================================[.rst:
 | 
			
		||||
myx_download_content
 | 
			
		||||
-----------------------
 | 
			
		||||
 | 
			
		||||
Функция для загрузки дополнительных репозиториев::
 | 
			
		||||
 | 
			
		||||
  myx_download_content(NAME
 | 
			
		||||
    [ DOWNLOAD_DIR dir ] |
 | 
			
		||||
    [ GIT_REPOSITORY url ] |
 | 
			
		||||
    [ GIT_TAG tag ] )
 | 
			
		||||
 | 
			
		||||
Обязательный параметр: `NAME` - имя целевого каталога.
 | 
			
		||||
Параметр `DOWNLOAD_DIR` содержит имя каталога, в который будет загружаться
 | 
			
		||||
содержимое (по умолчанию `downloads`).
 | 
			
		||||
Параметр `GIT_REPOSITORY` содержит адрес внешнего проекта, который нужно
 | 
			
		||||
загрузить с помощью git.
 | 
			
		||||
Параметр `GIT_TAG` содержит используемые метку, идентификатор коммита или
 | 
			
		||||
ветку в загружаемом репозитории.
 | 
			
		||||
 | 
			
		||||
#]=======================================================================]
 | 
			
		||||
 | 
			
		||||
find_package(Git QUIET)
 | 
			
		||||
 | 
			
		||||
option(ENABLE_DONWLOAD_CONTENT "Enable download content" ON)
 | 
			
		||||
 | 
			
		||||
function(myx_download_content NAME)
 | 
			
		||||
  set(options)
 | 
			
		||||
  set(oneValueArgs)
 | 
			
		||||
  set(multiValueArgs DOWNLOAD_DIR GIT_REPOSITORY GIT_TAG)
 | 
			
		||||
  cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
 | 
			
		||||
 | 
			
		||||
  if(NOT CMAKE_SCRIPT_MODE_FILE)
 | 
			
		||||
    if(TARGET myx-download-${NAME})
 | 
			
		||||
      return()
 | 
			
		||||
    else()
 | 
			
		||||
      add_custom_target(myx-download-${NAME})
 | 
			
		||||
    endif()
 | 
			
		||||
    if(NOT TARGET myx-download-content)
 | 
			
		||||
      add_custom_target(myx-download-content)
 | 
			
		||||
    endif()
 | 
			
		||||
  endif()
 | 
			
		||||
 | 
			
		||||
  if(NOT ARG_DOWNLOAD_DIR)
 | 
			
		||||
    set(ARG_DOWNLOAD_DIR downloads)
 | 
			
		||||
  endif()
 | 
			
		||||
 | 
			
		||||
  if(CMAKE_SCRIPT_MODE_FILE)
 | 
			
		||||
    set(PROJECT_SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR})
 | 
			
		||||
  endif()
 | 
			
		||||
  set(ARG_DOWNLOAD_DIR ${PROJECT_SOURCE_DIR}/${ARG_DOWNLOAD_DIR})
 | 
			
		||||
 | 
			
		||||
  if(NOT IS_DIRECTORY ${ARG_DOWNLOAD_DIR})
 | 
			
		||||
    execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${ARG_DOWNLOAD_DIR})
 | 
			
		||||
  endif()
 | 
			
		||||
 | 
			
		||||
  if(ENABLE_DOWNLOAD_CONTENT AND GIT_EXECUTABLE AND ARG_GIT_REPOSITORY)
 | 
			
		||||
    if(NOT IS_DIRECTORY ${ARG_DOWNLOAD_DIR}/${NAME})
 | 
			
		||||
      execute_process(COMMAND ${GIT_EXECUTABLE} clone ${ARG_GIT_REPOSITORY} ${NAME}
 | 
			
		||||
                      WORKING_DIRECTORY ${ARG_DOWNLOAD_DIR})
 | 
			
		||||
    else()
 | 
			
		||||
      execute_process(COMMAND ${GIT_EXECUTABLE} fetch
 | 
			
		||||
                      WORKING_DIRECTORY ${ARG_DOWNLOAD_DIR}/${NAME})
 | 
			
		||||
    endif()
 | 
			
		||||
    execute_process(COMMAND ${GIT_EXECUTABLE} checkout ${ARG_GIT_TAG}
 | 
			
		||||
                    WORKING_DIRECTORY ${ARG_DOWNLOAD_DIR}/${NAME})
 | 
			
		||||
  endif()
 | 
			
		||||
 | 
			
		||||
  if(NOT CMAKE_SCRIPT_MODE_FILE)
 | 
			
		||||
    add_subdirectory(${ARG_DOWNLOAD_DIR}/${NAME} EXCLUDE_FROM_ALL)
 | 
			
		||||
  endif()
 | 
			
		||||
endfunction()
 | 
			
		||||
 | 
			
		||||
@@ -1,56 +0,0 @@
 | 
			
		||||
#[=======================================================================[.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 TARGET_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(
 | 
			
		||||
    ${TARGET_NAME}
 | 
			
		||||
    ${ARG_UNPARSED_ARGUMENTS}
 | 
			
		||||
    GIT_REPOSITORY ${ARG_GIT_REPOSITORY}
 | 
			
		||||
    GIT_SHALLOW 1
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
  set(FETCHCONTENT_QUIET off)
 | 
			
		||||
  FetchContent_MakeAvailable(${TARGET_NAME})
 | 
			
		||||
endfunction()
 | 
			
		||||
		Reference in New Issue
	
	Block a user