From 03da0547874681c7f64f47986cf399888734750d Mon Sep 17 00:00:00 2001 From: Andrey Astafyev Date: Sat, 1 Oct 2022 14:41:38 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- CMakeLists.txt | 20 +++++---- cmake/myx/lib/AddLibrary.cmake | 58 +++++++++++++++++++-------- cmake/myx/lib/ColoredMessages.cmake | 17 +++++++- cmake/myx/lib/DirectoriesGuards.cmake | 15 ++++--- cmake/myx/lib/InstallLibrary.cmake | 19 ++++++--- 6 files changed, 92 insertions(+), 39 deletions(-) diff --git a/.gitignore b/.gitignore index 1e50ba1..538a95c 100644 --- a/.gitignore +++ b/.gitignore @@ -67,7 +67,7 @@ tags ### # -export_autogen.hpp +*_export.hpp # Prerequisites *.d diff --git a/CMakeLists.txt b/CMakeLists.txt index f1f1e26..220dd5e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,19 +9,25 @@ project(pow VERSION 1.1.1 LANGUAGES CXX) ### # Подключение дополнительных функций для CMake +# По умолчанию предполагается использование версии MyxCMake, +# файлы которой находятся в каталоге `cmake/myx` текущего проекта. +# Если определена переменная `MYX_CMAKE_USE_SYSTEM`, то выполняется +# поиск версии в каталогах перечисленных в переменной `CMAKE_MODULES_DIR`. ### -find_package(MyxCMake 1.99.9 PATHS ${PROJECT_SOURCE_DIR}/cmake/myx NO_DEFAULT_PATH QUIET REQUIRED) +if(MYX_CMAKE_USE_SYSTEM) + find_package(MyxCMake 1.99.9 NO_DEFAULT_PATH QUIET REQUIRED) +else() + include(${PROJECT_SOURCE_DIR}/cmake/myx/MyxCMakeConfig.cmake) +endif() # Цель для создания библиотеки, состоящей из заголовочных файлов -myx_add_library(${PROJECT_NAME} - TYPE INTERFACE -) +myx_add_library(${PROJECT_NAME} INTERFACE) +# Настройка свойств цели myx_target_setup(${PROJECT_NAME} SOURCES ${PROJECT_SOURCE_DIR}/include/pow/pow.hpp ) -if(PROJECT_IS_TOP_LEVEL) - myx_install_library(${PROJECT_NAME}) -endif() +# Команды для установки библиотеки +myx_install_library(${PROJECT_NAME}) diff --git a/cmake/myx/lib/AddLibrary.cmake b/cmake/myx/lib/AddLibrary.cmake index 74b1769..75b5ea8 100644 --- a/cmake/myx/lib/AddLibrary.cmake +++ b/cmake/myx/lib/AddLibrary.cmake @@ -1,20 +1,42 @@ +#[=======================================================================[.rst: +myx_add_library +--------------- + +Вспомогательная функция для создания библиотеки:: + + myx_add_library(NAME TYPE) + +Обязательные параметры: `NAME` - имя библиотеки и `TYPE` - тип цели. +Все остальные параметры передаются стандартной функции `add_library()` + +#]=======================================================================] + include_guard(GLOBAL) include(GenerateExportHeader) -function(myx_add_library NAME) +function(myx_add_library NAME TYPE) set(options) - set(oneValueArgs TYPE) - set(multiValueArgs SOURCES) - cmake_parse_arguments(arg "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + set(oneValueArgs) + set(multiValueArgs) - if(NOT arg_TYPE) - set(arg_TYPE "OBJECT") + cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + # Вызов стандартной функции `add_library()` + add_library(${NAME} ${TYPE} ${ARG_UNPARSED_ARGUMENTS}) + + # Если вызов был выполнен не из проекта верхнего уровня, + # то созданная цель исключается из цели `all`. + # При этом сама цель `${NAME}` может участвовать в сборке, + # если окажется в перечне зависимостей. + if(NOT PROJECT_IS_TOP_LEVEL) + set_target_properties(${NAME} PROPERTIES + EXCLUDE_FROM_ALL True + ) endif() - add_library(${NAME} ${arg_TYPE}) - - if(arg_TYPE STREQUAL INTERFACE) + if(TYPE STREQUAL INTERFACE) + # Стандартные пути к заголовочным файлам target_include_directories(${NAME} INTERFACE $ @@ -27,10 +49,12 @@ function(myx_add_library NAME) # Опция для разрешения сборки статической библиотеки option(${PROJECT_NAME_UPPER}_BUILD_STATIC "Build static library" ON) + # Стандартные пути к заголовочным файлам target_include_directories(${NAME} PUBLIC $ PRIVATE + $ $ ) @@ -38,14 +62,14 @@ function(myx_add_library NAME) string(TOUPPER ${NAME} suffix) generate_export_header(${NAME} - BASE_NAME "${suffix}" - EXPORT_MACRO_NAME "EXPORT_${suffix}" - DEPRECATED_MACRO_NAME "DEPRECATED_${suffix}" - NO_DEPRECATED_MACRO_NAME "NO_DEPRECATED_${suffix}" - NO_EXPORT_MACRO_NAME "NO_EXPORT_${suffix}" - STATIC_DEFINE "STATIC_DEFINE_${suffix}" - EXPORT_FILE_NAME "${PROJECT_SOURCE_DIR}/include/${NAME}/export_autogen.hpp" - DEFINE_NO_DEPRECATED + BASE_NAME ${suffix} + EXPORT_MACRO_NAME "EXPORT_${suffix}" + DEPRECATED_MACRO_NAME "DEPRECATED_${suffix}" + NO_DEPRECATED_MACRO_NAME "NO_DEPRECATED_${suffix}" + NO_EXPORT_MACRO_NAME "NO_EXPORT_${suffix}" + STATIC_DEFINE "STATIC_DEFINE_${suffix}" + EXPORT_FILE_NAME "${PROJECT_SOURCE_DIR}/include/${NAME}/${NAME}_export.hpp" + DEFINE_NO_DEPRECATED ) # Цель для создания разделяемой библиотеки из объектных файлов diff --git a/cmake/myx/lib/ColoredMessages.cmake b/cmake/myx/lib/ColoredMessages.cmake index 5ae5f3d..8517f6c 100644 --- a/cmake/myx/lib/ColoredMessages.cmake +++ b/cmake/myx/lib/ColoredMessages.cmake @@ -1,4 +1,9 @@ -# Обёртки для функций вывода сообщений +#[=======================================================================[.rst: + +Обёртки для функции `message()`, которые в терминале UNIX +подсвечиают сообщения в зависимости от важности. + +#]=======================================================================] include_guard(GLOBAL) @@ -22,14 +27,22 @@ if(DEFINED ENV{TERM} AND UNIX) set(MyxColorBoldWhite "${Esc}[1;37m") endif() -function(myx_message_error) +function(myx_message_fatal_error) message(FATAL_ERROR ${MyxColorBoldRed}${ARGV}${MyxColorReset}) endfunction() +function(myx_message_send_error) + message(SEND_ERROR ${MyxColorBoldRed}${ARGV}${MyxColorReset}) +endfunction() + function(myx_message_warning) message(WARNING ${MyxColorRed}${ARGV}${MyxColorReset}) endfunction() +function(myx_message_deprecation) + message(DEPRECATION ${MyxColorBoldMagenta}${ARGV}${MyxColorReset}) +endfunction() + function(myx_message_status) message(STATUS ${MyxColorMagenta}${ARGV}${MyxColorReset}) endfunction() diff --git a/cmake/myx/lib/DirectoriesGuards.cmake b/cmake/myx/lib/DirectoriesGuards.cmake index addab82..459cfbe 100644 --- a/cmake/myx/lib/DirectoriesGuards.cmake +++ b/cmake/myx/lib/DirectoriesGuards.cmake @@ -1,8 +1,12 @@ -# Запись результатов сборки проекта внутрь иерархии каталогов с исходными текстами -# приводит к засорению файлами формируемыми на этапе сборки, которые затрудняют -# разработку, поиск в оригинальных файлах и мешают ориентироваться в проекте. -# При работе с несколькими типами сборки, например, отладка и выпуск, появляется -# необходимость корректного полного удаления результатов предыдущего варианта. +#[=======================================================================[.rst: + +Запись результатов сборки проекта внутрь иерархии каталогов с исходными текстами +приводит к засорению файлами формируемыми на этапе сборки, которые затрудняют +разработку, поиск в оригинальных файлах и мешают ориентироваться в проекте. +При работе с несколькими типами сборки, например, отладка и выпуск, появляется +необходимость корректного полного удаления результатов предыдущего варианта. + +#]=======================================================================] include_guard(GLOBAL) @@ -47,4 +51,3 @@ unset(cmake_binary_dir) unset(project_source_dir) unset(project_binary_dir) unset(cmake_install_prefix) - diff --git a/cmake/myx/lib/InstallLibrary.cmake b/cmake/myx/lib/InstallLibrary.cmake index f2a18d4..3334a5b 100644 --- a/cmake/myx/lib/InstallLibrary.cmake +++ b/cmake/myx/lib/InstallLibrary.cmake @@ -25,12 +25,21 @@ function(myx_install_library NAME) NO_CHECK_REQUIRED_COMPONENTS_MACRO ) - install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/ + install( + DIRECTORY ${PROJECT_SOURCE_DIR}/include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} COMPONENT dev ) - install(EXPORT ${NAME}Targets + install( + TARGETS ${NAME} + EXPORT ${NAME}Targets + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + COMPONENT lib + ) + + install( + EXPORT ${NAME}Targets DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${NAME} COMPONENT dev ) @@ -47,8 +56,7 @@ function(myx_install_library NAME) install( TARGETS ${NAME}_shared EXPORT ${NAME}Targets - LIBRARY - DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT lib ) endif() @@ -57,8 +65,7 @@ function(myx_install_library NAME) install( TARGETS ${NAME}_static EXPORT ${NAME}Targets - ARCHIVE - DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT lib ) endif()