This commit is contained in:
2022-10-09 21:14:12 +03:00
parent 703b8045ed
commit 48377e27ec
21 changed files with 83 additions and 321 deletions

View File

@ -4,7 +4,7 @@ myx_add_executable
Вспомогательная функция для создания исполняемого файла::
myx_add_executable(NAME)
myx_add_executable(TARGET_NAME)
Используется для совместимости с версиями CMake раньше 3.11,
в которых было необходимо указать хотя бы один файл с исходными текстами.
@ -13,10 +13,10 @@ myx_add_executable
include_guard(GLOBAL)
function(myx_add_executable NAME)
function(myx_add_executable TARGET_NAME)
if(${CMAKE_VERSION} VERSION_LESS "3.11.0")
add_executable(${NAME} ${ARGN} "")
add_executable(${TARGET_NAME} ${ARGN} "")
else()
add_executable(${NAME} ${ARGN})
add_executable(${TARGET_NAME} ${ARGN})
endif()
endfunction()

View File

@ -4,12 +4,12 @@ myx_add_library
Вспомогательная функция для создания библиотеки::
myx_add_library(NAME TYPE
myx_add_library(TARGET_NAME TARGET_TYPE
[ OUTPUT_NAME output_name ] |
[ EXPORT_FILE_NAME file_name ] |
[ EXPORT_BASE_NAME base_name ])
Обязательные параметры: `NAME` - имя библиотеки и `TYPE` - тип цели.
Обязательные параметры: `TARGET_NAME` - имя библиотеки и `TARGET_TYPE` - тип цели.
Параметр `OUTPUT_NAME` определяет базовое имя выходных файлов.
Параметр `EXPORT_FILE_NAME` задаёт имя заголовочного файла экспортируемых
переменных, а `EXPORT_BASE_NAME` - базовый суффикс для формирования имён переменных.
@ -26,7 +26,7 @@ if(${CMAKE_VERSION} VERSION_LESS "3.17.0")
set(MYX_CMAKE_LIB_DIR_BACKPORT "${CMAKE_CURRENT_LIST_DIR}")
endif()
function(myx_add_library NAME TYPE)
function(myx_add_library TARGET_NAME TARGET_TYPE)
if(${CMAKE_VERSION} VERSION_LESS "3.17.0")
set(CMAKE_CURRENT_FUNCTION_LIST_DIR ${MYX_CMAKE_LIB_DIR_BACKPORT})
endif()
@ -37,27 +37,28 @@ function(myx_add_library NAME TYPE)
cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(NOT ARG_OUTPUT_NAME)
set(ARG_OUTPUT_NAME ${NAME})
set(ARG_OUTPUT_NAME ${TARGET_NAME})
endif()
# Вызов стандартной функции `add_library()`
add_library(${NAME} ${TYPE} ${ARG_UNPARSED_ARGUMENTS})
add_library(${TARGET_NAME} ${TARGET_TYPE} ${ARG_UNPARSED_ARGUMENTS})
if(TYPE STREQUAL "INTERFACE")
if(TARGET_TYPE STREQUAL "INTERFACE")
# Библиотека, состоящая только из заголовочных файлов не требует сборки.
# Стандартные пути к заголовочным файлам
target_include_directories(${NAME} INTERFACE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>)
target_include_directories(${TARGET_NAME} INTERFACE
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>)
else()
string(TOUPPER ${NAME} PROJECT_NAME_UPPER)
string(TOUPPER ${TARGET_NAME} __project_name_upper)
# Опция для разрешения сборки динамической библиотеки
cmake_dependent_option(${PROJECT_NAME_UPPER}_BUILD_SHARED
"Build shared library for ${NAME}" ON "BUILD_SHARED_LIBS" OFF)
cmake_dependent_option(${__project_name_upper}_BUILD_SHARED
"Build shared library for ${TARGET_NAME}" ON "BUILD_SHARED_LIBS" OFF)
# Опция для разрешения сборки статической библиотеки
cmake_dependent_option(${PROJECT_NAME_UPPER}_BUILD_STATIC
"Build static library for ${NAME}" ON "NOT BUILD_SHARED_LIBS" OFF)
cmake_dependent_option(${__project_name_upper}_BUILD_STATIC
"Build static library for ${TARGET_NAME}" ON "NOT BUILD_SHARED_LIBS" OFF)
# Стандартные пути к заголовочным файлам
target_include_directories(${NAME}
target_include_directories(${TARGET_NAME}
PUBLIC
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
PRIVATE
@ -67,17 +68,18 @@ function(myx_add_library NAME TYPE)
# Сборка позиционно-независимых объектных файлов нужна
# для создания динамической библиотеки
set_target_properties(${NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON)
set_target_properties(${TARGET_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON)
if(NOT EXPORT_BASE_NAME)
string(TOUPPER ${NAME} ARG_EXPORT_BASE_NAME)
set(ARG_EXPORT_BASE_NAME ${__project_name_upper})
endif()
if(NOT ARG_EXPORT_FILE_NAME)
set(ARG_EXPORT_FILE_NAME "${PROJECT_SOURCE_DIR}/include/${NAME}/${NAME}_export.hpp")
set(ARG_EXPORT_FILE_NAME
"${PROJECT_SOURCE_DIR}/include/${TARGET_NAME}/${TARGET_NAME}_export.hpp")
endif()
generate_export_header(${NAME}
generate_export_header(${TARGET_NAME}
BASE_NAME ${ARG_EXPORT_BASE_NAME}
EXPORT_MACRO_NAME "EXPORT_${ARG_EXPORT_BASE_NAME}"
DEPRECATED_MACRO_NAME "DEPRECATED_${ARG_EXPORT_BASE_NAME}"
@ -87,45 +89,45 @@ function(myx_add_library NAME TYPE)
EXPORT_FILE_NAME ${ARG_EXPORT_FILE_NAME}
DEFINE_NO_DEPRECATED
)
set_property(TARGET ${NAME} APPEND PROPERTY INTERFACE_HEADER_FILES "${ARG_EXPORT_FILE_NAME}")
set_property(TARGET ${TARGET_NAME} APPEND PROPERTY
INTERFACE_HEADER_FILES "${ARG_EXPORT_FILE_NAME}")
# Цель для создания динамической библиотеки из объектных файлов
if(${PROJECT_NAME_UPPER}_BUILD_SHARED)
# Для создания динамической библиотеки используются объектные файлы цели ${NAME}
add_library(${NAME}_shared SHARED $<TARGET_OBJECTS:${NAME}>)
# Установка дополнительных свойств для цели ${NAME}_shared
if(${__project_name_upper}_BUILD_SHARED)
# Для создания динамической библиотеки используются объектные файлы цели ${TARGET_NAME}
add_library(${TARGET_NAME}_shared SHARED $<TARGET_OBJECTS:${TARGET_NAME}>)
# Установка дополнительных свойств для цели ${TARGET_NAME}_shared
# VERSION: версия библиотеки
# SOVERSION: мажорная версия библиотеки
# LIBRARY_OUTPUT_DIRECTORY: каталог для записи результатов сборки
# OUTPUT_NAME: базовое имя выходного файла (без учёта расширения)
set_target_properties(${NAME}_shared
PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION ${PROJECT_VERSION_MAJOR}
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}
OUTPUT_NAME ${ARG_OUTPUT_NAME})
set_target_properties(${TARGET_NAME}_shared PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION ${PROJECT_VERSION_MAJOR}
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}
OUTPUT_NAME ${ARG_OUTPUT_NAME})
endif()
# Цель для создания статической библиотеки из объектных файлов
if(${PROJECT_NAME_UPPER}_BUILD_STATIC)
# Для создания статической библиотеки используются объектные файлы цели ${NAME}
add_library(${NAME}_static STATIC $<TARGET_OBJECTS:${NAME}>)
# Установка дополнительных свойств для цели ${NAME}_static
if(${__project_name_upper}_BUILD_STATIC)
# Для создания статической библиотеки используются
# объектные файлы цели ${TARGET_NAME}
add_library(${TARGET_NAME}_static STATIC $<TARGET_OBJECTS:${TARGET_NAME}>)
# Установка дополнительных свойств для цели ${TARGET_NAME}_static
# ARCHIVE_OUTPUT_DIRECTORY: каталог для записи результатов сборки
# OUTPUT_NAME: базовое имя выходного файла (без учёта расширения)
set_target_properties(${NAME}_static
PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}
OUTPUT_NAME ${ARG_OUTPUT_NAME})
set_target_properties(${TARGET_NAME}_static PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}
OUTPUT_NAME ${ARG_OUTPUT_NAME})
endif()
endif()
# Если вызов был выполнен не из проекта верхнего уровня,
# то созданная цель исключается из цели `all`.
# При этом сама цель `${NAME}` может участвовать в сборке,
# При этом сама цель `${TARGET_NAME}` может участвовать в сборке,
# если окажется в перечне зависимостей.
if(NOT PROJECT_IS_TOP_LEVEL)
set_target_properties(${NAME} PROPERTIES EXCLUDE_FROM_ALL True)
set_target_properties(${TARGET_NAME} PROPERTIES EXCLUDE_FROM_ALL True)
return()
endif()
@ -133,91 +135,91 @@ function(myx_add_library NAME TYPE)
# Если вызов был выполнен не из проекта верхнего уровня,
# то эти правила не обрабатываются.
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/${NAME}ConfigVersion.cmake
${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}ConfigVersion.cmake
VERSION ${PROJECT_VERSION}
COMPATIBILITY AnyNewerVersion
)
configure_package_config_file(
${CMAKE_CURRENT_FUNCTION_LIST_DIR}/library-config.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/${NAME}Config.cmake
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${NAME}
${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}Config.cmake
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${TARGET_NAME}
NO_SET_AND_CHECK_MACRO
NO_CHECK_REQUIRED_COMPONENTS_MACRO
)
install(EXPORT ${NAME}Targets
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${NAME}
install(EXPORT ${TARGET_NAME}Targets
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${TARGET_NAME}
COMPONENT DEV
)
install(
FILES
${PROJECT_BINARY_DIR}/${NAME}ConfigVersion.cmake
${PROJECT_BINARY_DIR}/${NAME}Config.cmake
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${NAME}
${PROJECT_BINARY_DIR}/${TARGET_NAME}ConfigVersion.cmake
${PROJECT_BINARY_DIR}/${TARGET_NAME}Config.cmake
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${TARGET_NAME}
COMPONENT DEV
)
# Формирование файла для pkg-config
file(WRITE "${PROJECT_BINARY_DIR}/${NAME}.pc"
file(WRITE "${PROJECT_BINARY_DIR}/${TARGET_NAME}.pc"
"prefix=${CMAKE_INSTALL_PREFIX}\n"
"exec_prefix=${CMAKE_INSTALL_PREFIX}\n"
"includedir=${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}\n")
if(NOT TYPE STREQUAL "INTERFACE")
file(APPEND "${PROJECT_BINARY_DIR}/${NAME}.pc"
if(NOT TARGET_TYPE STREQUAL "INTERFACE")
file(APPEND "${PROJECT_BINARY_DIR}/${TARGET_NAME}.pc"
"libdir=${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}\n")
endif()
file(APPEND "${PROJECT_BINARY_DIR}/${NAME}.pc"
file(APPEND "${PROJECT_BINARY_DIR}/${TARGET_NAME}.pc"
"\n"
"Name: ${NAME}\n"
"Description: ${NAME} library\n"
"Name: ${TARGET_NAME}\n"
"Description: ${TARGET_NAME} library\n"
"Version: ${PROJECT_VERSION}\n"
"\n"
"Requires:\n"
"Cflags: -I${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}\n")
if(NOT TYPE STREQUAL "INTERFACE")
file(APPEND "${PROJECT_BINARY_DIR}/${NAME}.pc"
"Libs: -L${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR} -l${NAME}\n")
if(NOT TARGET_TYPE STREQUAL "INTERFACE")
file(APPEND "${PROJECT_BINARY_DIR}/${TARGET_NAME}.pc"
"Libs: -L${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR} -l${TARGET_NAME}\n")
endif()
# Установка файла для pkg-config
install(
FILES "${PROJECT_BINARY_DIR}/${NAME}.pc"
FILES "${PROJECT_BINARY_DIR}/${TARGET_NAME}.pc"
COMPONENT DEV
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
if(TYPE STREQUAL "OBJECT")
if(TARGET_TYPE STREQUAL "OBJECT")
# Установка динамической библиотеки
if(TARGET ${NAME}_shared)
if(TARGET ${TARGET_NAME}_shared)
install(
TARGETS ${NAME}_shared
EXPORT ${NAME}Targets
TARGETS ${TARGET_NAME}_shared
EXPORT ${TARGET_NAME}Targets
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
COMPONENT LIB
)
endif()
if(TARGET ${NAME}_static)
if(TARGET ${TARGET_NAME}_static)
# Установка статической библиотеки
install(
TARGETS ${NAME}_static
EXPORT ${NAME}Targets
TARGETS ${TARGET_NAME}_static
EXPORT ${TARGET_NAME}Targets
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
COMPONENT STATIC
)
endif()
endif()
if(TYPE STREQUAL "INTERFACE")
if(TARGET_TYPE STREQUAL "INTERFACE")
# Установка библиотеки из заголовочных файлов
target_include_directories(${NAME} SYSTEM INTERFACE $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
target_include_directories(${TARGET_NAME} SYSTEM INTERFACE $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
install(
TARGETS ${NAME}
EXPORT ${NAME}Targets
TARGETS ${TARGET_NAME}
EXPORT ${TARGET_NAME}Targets
COMPONENT LIB
)
endif()

View File

@ -17,7 +17,7 @@ function(myx_create_packages NAME)
endif()
if(NOT ${PROJECT_NAME}_CONTACT)
set(CPACK_PACKAGE_CONTACT "unknown maintainer")
set(CPACK_PACKAGE_CONTACT "unknown maintainer <nonexistent@mailbox")
myx_message_warning("\${PROJECT_NAME}_CONTACT variable is required for packaging but unset")
else()
set(CPACK_PACKAGE_CONTACT ${${PROJECT_NAME}_CONTACT})

View File

@ -11,13 +11,13 @@ function(myx_uncrustify NAME)
set(CMAKE_CURRENT_FUNCTION_LIST_DIR ${MYX_CMAKE_LIB_UNCRUSTIFY_DIR_BACKPORT})
endif()
myx_skip_external_target(${NAME})
set(options)
set(oneValueArgs CONFIG)
set(multiValueArgs)
cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
myx_skip_external_target(${NAME})
if(NOT ARG_CONFIG)
set(ARG_CONFIG "${PROJECT_SOURCE_DIR}/.uncrustify.cfg")
if(NOT EXISTS ${ARG_CONFIG})