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)
|
|||
|
|