myx-cmake-example-features/cmake/myx/lib/AddExternalTarget.cmake
2023-02-17 14:36:44 +03:00

80 lines
3.1 KiB
CMake
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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