80 lines
3.1 KiB
CMake
80 lines
3.1 KiB
CMake
#[=======================================================================[.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)
|
||
|