From cb54741867bb6bc90cd6488073e6ba8e8fb06cb3 Mon Sep 17 00:00:00 2001 From: Andrey Astafyev Date: Sun, 30 Jul 2023 11:34:36 +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=20MyxCMake?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmake/myx/MyxCMakeConfigVersion.cmake | 2 +- cmake/myx/backports/TopLevelProject.cmake | 4 ++- cmake/myx/lib/AddExternalTarget.cmake | 2 +- cmake/myx/lib/AddInterfaceLibrary.cmake | 11 +++--- cmake/myx/lib/AddObjectLibrary.cmake | 42 +++++++++++++---------- cmake/myx/lib/ColoredMessages.cmake | 4 +-- cmake/myx/lib/Qt5TargetSetup.cmake | 9 +++-- cmake/myx/lib/TargetSetup.cmake | 2 ++ cmake/myx/lib/macro/FindPackages.cmake | 12 ++++++- cmake/myx_setup.cmake | 14 ++++---- 10 files changed, 61 insertions(+), 41 deletions(-) diff --git a/cmake/myx/MyxCMakeConfigVersion.cmake b/cmake/myx/MyxCMakeConfigVersion.cmake index cc0431b..898c71d 100644 --- a/cmake/myx/MyxCMakeConfigVersion.cmake +++ b/cmake/myx/MyxCMakeConfigVersion.cmake @@ -1,4 +1,4 @@ -set(MYX_CMAKE_PACKAGE_VERSION "2.3.1") +set(MYX_CMAKE_PACKAGE_VERSION "2.3.8") if(MYX_CMAKE_PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION) set(PACKAGE_VERSION_COMPATIBLE FALSE) else() diff --git a/cmake/myx/backports/TopLevelProject.cmake b/cmake/myx/backports/TopLevelProject.cmake index 7dbccec..953758f 100644 --- a/cmake/myx/backports/TopLevelProject.cmake +++ b/cmake/myx/backports/TopLevelProject.cmake @@ -3,7 +3,9 @@ include_guard(GLOBAL) if(${CMAKE_VERSION} VERSION_LESS 3.21) get_property(__parent_directory DIRECTORY PROPERTY PARENT_DIRECTORY) if(NOT __parent_directory) - set(PROJECT_IS_TOP_LEVEL true) + set(PROJECT_IS_TOP_LEVEL TRUE) + else() + set(PROJECT_IS_TOP_LEVEL FALSE) endif() unset(__parent_directory) endif() diff --git a/cmake/myx/lib/AddExternalTarget.cmake b/cmake/myx/lib/AddExternalTarget.cmake index 9148a53..b1f562b 100644 --- a/cmake/myx/lib/AddExternalTarget.cmake +++ b/cmake/myx/lib/AddExternalTarget.cmake @@ -12,7 +12,7 @@ myx_add_external_target Обязательный параметр: `TARGET_NAME` - имя цели, содержащейся во внешнем проекте. Параметр `MODULES_PATH` содержит имя каталога, в который будут загружаться -внешние проекты (по умлолчанию `modules`). Параметр `GIT_REPOSITORY` содержит +внешние проекты (по умолчанию `modules`). Параметр `GIT_REPOSITORY` содержит адрес внешнего проекта, который нужно загрузить с помощью git. Параметр `GIT_TAG` содержит используемые метку, идентификатор коммита или ветку в репозитории. Параметр `LOCAL_PATH` используется для указания пути к подкаталогу, находящемуся diff --git a/cmake/myx/lib/AddInterfaceLibrary.cmake b/cmake/myx/lib/AddInterfaceLibrary.cmake index da45c2e..106e5a5 100644 --- a/cmake/myx/lib/AddInterfaceLibrary.cmake +++ b/cmake/myx/lib/AddInterfaceLibrary.cmake @@ -8,14 +8,10 @@ myx_add_interface_library [ PACKAGES packages ] | [ LINK_LIBRARIES link_libraries ] | [ OUTPUT_NAME output_name ] | - [ EXPORT_FILE_NAME file_name ] | - [ EXPORT_BASE_NAME base_name ] | [ HEADERS headers ]) Обязательные параметры: `TARGET_NAME` - имя библиотеки. Параметр `OUTPUT_NAME` определяет базовое имя выходных файлов. -Параметр `EXPORT_FILE_NAME` задаёт имя заголовочного файла экспортируемых -переменных, а `EXPORT_BASE_NAME` - базовый суффикс для формирования имён переменных. Все остальные параметры передаются в стандартную функцию `add_library()` #]=======================================================================] @@ -23,7 +19,6 @@ myx_add_interface_library include_guard(GLOBAL) include(CMakePackageConfigHelpers) -include(GenerateExportHeader) if(${CMAKE_VERSION} VERSION_LESS "3.17.0") set(MYX_CMAKE_LIB_DIR_BACKPORT "${CMAKE_CURRENT_LIST_DIR}") @@ -83,7 +78,11 @@ function(myx_add_interface_library TARGET_NAME) # При этом сама цель `${TARGET_NAME}` может участвовать в сборке, # если окажется в перечне зависимостей. if(NOT PROJECT_IS_TOP_LEVEL) - set_target_properties(${TARGET_NAME} PROPERTIES EXCLUDE_FROM_ALL True) + if(${CMAKE_VERSION} VERSION_GREATER "3.17.0") + set_target_properties(${TARGET_NAME} PROPERTIES EXCLUDE_FROM_ALL True) + else() + set_target_properties(${TARGET_NAME} PROPERTIES INTERFACE_EXCLUDE_FROM_ALL True) + endif() return() endif() diff --git a/cmake/myx/lib/AddObjectLibrary.cmake b/cmake/myx/lib/AddObjectLibrary.cmake index 27de4b7..58b16bf 100644 --- a/cmake/myx/lib/AddObjectLibrary.cmake +++ b/cmake/myx/lib/AddObjectLibrary.cmake @@ -6,11 +6,13 @@ myx_add_object_library myx_add_object_library(TARGET_NAME [ OUTPUT_NAME output_name ] | + [ NO_EXPORT ] | [ EXPORT_FILE_NAME file_name ] | [ EXPORT_BASE_NAME base_name ]) Обязательные параметры: `TARGET_NAME` - имя библиотеки. Параметр `OUTPUT_NAME` определяет базовое имя выходных файлов. +Если указана опция `NO_EXPORT`, то файл экспорта не генерируется. Параметр `EXPORT_FILE_NAME` задаёт имя заголовочного файла экспортируемых переменных, а `EXPORT_BASE_NAME` - базовый суффикс для формирования имён переменных. Все остальные параметры передаются в стандартную функцию `add_library()` @@ -29,9 +31,8 @@ function(myx_add_object_library TARGET_NAME) endif() include(CMakePackageConfigHelpers) - include(GenerateExportHeader) - set(options) + set(options NO_EXPORT) set(oneValueArgs OUTPUT_NAME EXPORT_FILE_NAME EXPORT_BASE_NAME) set(multiValueArgs) cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) @@ -64,25 +65,28 @@ function(myx_add_object_library TARGET_NAME) # для создания динамической библиотеки set_target_properties(${TARGET_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON) - if(NOT EXPORT_BASE_NAME) - set(ARG_EXPORT_BASE_NAME ${__project_name_upper}) - endif() + if(NOT ARG_NO_EXPORT) + include(GenerateExportHeader) + if(NOT 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/${TARGET_NAME}/${TARGET_NAME}_export.hpp") - endif() + if(NOT ARG_EXPORT_FILE_NAME) + set(ARG_EXPORT_FILE_NAME "${PROJECT_SOURCE_DIR}/include/${TARGET_NAME}/${TARGET_NAME}_export.hpp") + endif() - 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}" - NO_DEPRECATED_MACRO_NAME "NO_DEPRECATED_${ARG_EXPORT_BASE_NAME}" - NO_EXPORT_MACRO_NAME "NO_EXPORT_${ARG_EXPORT_BASE_NAME}" - STATIC_DEFINE "STATIC_DEFINE_${ARG_EXPORT_BASE_NAME}" - EXPORT_FILE_NAME ${ARG_EXPORT_FILE_NAME} - DEFINE_NO_DEPRECATED - ) - set_property(TARGET ${TARGET_NAME} APPEND PROPERTY INTERFACE_HEADER_FILES "${ARG_EXPORT_FILE_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}" + NO_DEPRECATED_MACRO_NAME "NO_DEPRECATED_${ARG_EXPORT_BASE_NAME}" + NO_EXPORT_MACRO_NAME "NO_EXPORT_${ARG_EXPORT_BASE_NAME}" + STATIC_DEFINE "STATIC_DEFINE_${ARG_EXPORT_BASE_NAME}" + EXPORT_FILE_NAME ${ARG_EXPORT_FILE_NAME} + DEFINE_NO_DEPRECATED + ) + set_property(TARGET ${TARGET_NAME} APPEND PROPERTY INTERFACE_HEADER_FILES "${ARG_EXPORT_FILE_NAME}") + endif() # Цель для создания динамической библиотеки из объектных файлов if(${__project_name_upper}_BUILD_SHARED) diff --git a/cmake/myx/lib/ColoredMessages.cmake b/cmake/myx/lib/ColoredMessages.cmake index 8517f6c..fb196e5 100644 --- a/cmake/myx/lib/ColoredMessages.cmake +++ b/cmake/myx/lib/ColoredMessages.cmake @@ -1,13 +1,13 @@ #[=======================================================================[.rst: Обёртки для функции `message()`, которые в терминале UNIX -подсвечиают сообщения в зависимости от важности. +подсвечивают сообщения в зависимости от важности. #]=======================================================================] include_guard(GLOBAL) -if(DEFINED ENV{TERM} AND UNIX) +if(DEFINED ENV{COLORTERM} AND UNIX) string(ASCII 27 Esc) set(MyxColorReset "${Esc}[m") set(MyxColorBold "${Esc}[1m") diff --git a/cmake/myx/lib/Qt5TargetSetup.cmake b/cmake/myx/lib/Qt5TargetSetup.cmake index a507e5c..23d0197 100644 --- a/cmake/myx/lib/Qt5TargetSetup.cmake +++ b/cmake/myx/lib/Qt5TargetSetup.cmake @@ -19,7 +19,10 @@ function(myx_qt5_target_setup TARGET_NAME) if(__target_type STREQUAL "EXECUTABLE") target_link_libraries(${TARGET_NAME} PRIVATE "Qt5::${iter}") endif() - if((__target_type STREQUAL "SHARED_LIBRARY") OR (__target_type STREQUAL "OBJECT_LIBRARY")) + if(__target_type STREQUAL "SHARED_LIBRARY") + target_link_libraries(${TARGET_NAME} PUBLIC "Qt5::${iter}") + endif() + if((${CMAKE_VERSION} VERSION_GREATER "3.8.0") AND (__target_type STREQUAL "OBJECT_LIBRARY")) target_link_libraries(${TARGET_NAME} PUBLIC "Qt5::${iter}") endif() endif() @@ -85,9 +88,9 @@ function(myx_qt5_target_setup TARGET_NAME) # Добавление скомпилированного файла переводов к списку зависимостей для цели target_sources(${TARGET_NAME} PRIVATE ${qm}) endforeach() - # Окончение файла ресурсов + # Окончание файла ресурсов file(APPEND ${PROJECT_BINARY_DIR}/${TARGET_NAME}_l10n.qrc "\n") - # Комплияция файла ресурсов с переводами + # Компиляция файла ресурсов с переводами qt5_add_resources(qrc_l10n ${PROJECT_BINARY_DIR}/${TARGET_NAME}_l10n.qrc) target_sources(${TARGET_NAME} PRIVATE ${qrc_l10n}) endif() diff --git a/cmake/myx/lib/TargetSetup.cmake b/cmake/myx/lib/TargetSetup.cmake index 31c6d12..b65b05e 100644 --- a/cmake/myx/lib/TargetSetup.cmake +++ b/cmake/myx/lib/TargetSetup.cmake @@ -108,6 +108,8 @@ function(myx_target_setup TARGET_NAME) endif() endif() endif() + else() + target_link_libraries(${TARGET_NAME} PRIVATE ${__link_library}) endif() endforeach() endif() diff --git a/cmake/myx/lib/macro/FindPackages.cmake b/cmake/myx/lib/macro/FindPackages.cmake index ff57ccc..eecd465 100644 --- a/cmake/myx/lib/macro/FindPackages.cmake +++ b/cmake/myx/lib/macro/FindPackages.cmake @@ -3,7 +3,7 @@ include_guard(GLOBAL) macro(myx_find_required_packages) set(options) set(oneValueArgs) - set(multiValueArgs PACKAGES Boost Qt5 Qt5Private) + set(multiValueArgs PACKAGES Boost Qt5 Qt5Private Qt6 Qt6Private) cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) foreach(iter ${ARG_PACKAGES}) @@ -24,6 +24,16 @@ macro(myx_find_required_packages) endforeach() endif() + if(ARG_Qt6) + find_package(Qt6 COMPONENTS ${ARG_Qt6} REQUIRED) + endif() + + if(ARG_Qt6Private) + foreach(iter ${ARG_Qt6Private}) + find_package("Qt6${iter}" COMPONENTS Private REQUIRED) + endforeach() + endif() + foreach(__iter IN LISTS oneValueArgs multiValueArgs) unset(ARG_${__iter}) endforeach() diff --git a/cmake/myx_setup.cmake b/cmake/myx_setup.cmake index ce2817e..4534a05 100644 --- a/cmake/myx_setup.cmake +++ b/cmake/myx_setup.cmake @@ -4,7 +4,7 @@ По умолчанию предполагается использование версии MyxCMake, файлы которой находятся в каталоге `cmake/myx` текущего проекта. -Для удобства разботки библиотеки MyxCMake можно указать путь +Для удобства разработки библиотеки MyxCMake можно указать путь к её репозиторию с помощью переменной проекта CMake `MYX_CMAKE_DIR` или переменной окружения `MYX_CMAKE_DIR`. @@ -12,7 +12,7 @@ поиск версии в каталогах перечисленных в переменной `CMAKE_MODULES_DIR`. Кроме того выполняется попытка поиска (MyxxCMake)[../../../../myxx] -- -расширения для библиотеки, позволяющиего в режиме разработки программного +расширения для библиотеки, позволяющего в режиме разработки программного проекта использовать дополнительные инструменты для его сопровождения. #]=======================================================================] @@ -20,15 +20,15 @@ if(ENV{MYX_CMAKE_DIR}) set(MYX_CMAKE_DIR $ENV{MYX_CMAKE_DIR}) endif() if(MYX_CMAKE_DIR) - find_package(MyxCMake 2.3.1 REQUIRED CONFIG PATHS ${MYX_CMAKE_DIR} NO_DEFAULT_PATH) - myx_message_notice("=== MyxCMake directory: ${MyxCMake_CONFIG} ===") + find_package(MyxCMake 2.3.8 REQUIRED CONFIG PATHS ${MYX_CMAKE_DIR} NO_DEFAULT_PATH) + myx_message_notice("== MyxCMake directory: ${MyxCMake_CONFIG} ==") else() if(MYX_CMAKE_USE_SYSTEM) - find_package(MyxCMake 2.3.1 REQUIRED) - myx_message_notice("=== MyxCMake directory: ${MyxCMake_CONFIG} ===") + find_package(MyxCMake 2.3.8 REQUIRED) + myx_message_notice("== MyxCMake directory: ${MyxCMake_CONFIG} ==") else() include(${PROJECT_SOURCE_DIR}/cmake/myx/MyxCMakeConfig.cmake) - myx_message_notice("=== MyxCMake directory: ${PROJECT_SOURCE_DIR}/cmake/myx ===") + myx_message_notice("== MyxCMake directory: ${PROJECT_SOURCE_DIR}/cmake/myx ==") endif() endif()