#[=======================================================================[.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)