Обновление MyxCMake

This commit is contained in:
Andrei Astafev 2023-07-30 11:34:36 +03:00
parent 96443f5218
commit cb54741867
10 changed files with 61 additions and 41 deletions

View File

@ -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) if(MYX_CMAKE_PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION)
set(PACKAGE_VERSION_COMPATIBLE FALSE) set(PACKAGE_VERSION_COMPATIBLE FALSE)
else() else()

View File

@ -3,7 +3,9 @@ include_guard(GLOBAL)
if(${CMAKE_VERSION} VERSION_LESS 3.21) if(${CMAKE_VERSION} VERSION_LESS 3.21)
get_property(__parent_directory DIRECTORY PROPERTY PARENT_DIRECTORY) get_property(__parent_directory DIRECTORY PROPERTY PARENT_DIRECTORY)
if(NOT __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() endif()
unset(__parent_directory) unset(__parent_directory)
endif() endif()

View File

@ -12,7 +12,7 @@ myx_add_external_target
Обязательный параметр: `TARGET_NAME` - имя цели, содержащейся во внешнем проекте. Обязательный параметр: `TARGET_NAME` - имя цели, содержащейся во внешнем проекте.
Параметр `MODULES_PATH` содержит имя каталога, в который будут загружаться Параметр `MODULES_PATH` содержит имя каталога, в который будут загружаться
внешние проекты (по умлолчанию `modules`). Параметр `GIT_REPOSITORY` содержит внешние проекты (по умолчанию `modules`). Параметр `GIT_REPOSITORY` содержит
адрес внешнего проекта, который нужно загрузить с помощью git. Параметр `GIT_TAG` адрес внешнего проекта, который нужно загрузить с помощью git. Параметр `GIT_TAG`
содержит используемые метку, идентификатор коммита или ветку в репозитории. содержит используемые метку, идентификатор коммита или ветку в репозитории.
Параметр `LOCAL_PATH` используется для указания пути к подкаталогу, находящемуся Параметр `LOCAL_PATH` используется для указания пути к подкаталогу, находящемуся

View File

@ -8,14 +8,10 @@ myx_add_interface_library
[ PACKAGES packages ] | [ PACKAGES packages ] |
[ LINK_LIBRARIES link_libraries ] | [ LINK_LIBRARIES link_libraries ] |
[ OUTPUT_NAME output_name ] | [ OUTPUT_NAME output_name ] |
[ EXPORT_FILE_NAME file_name ] |
[ EXPORT_BASE_NAME base_name ] |
[ HEADERS headers ]) [ HEADERS headers ])
Обязательные параметры: `TARGET_NAME` - имя библиотеки. Обязательные параметры: `TARGET_NAME` - имя библиотеки.
Параметр `OUTPUT_NAME` определяет базовое имя выходных файлов. Параметр `OUTPUT_NAME` определяет базовое имя выходных файлов.
Параметр `EXPORT_FILE_NAME` задаёт имя заголовочного файла экспортируемых
переменных, а `EXPORT_BASE_NAME` - базовый суффикс для формирования имён переменных.
Все остальные параметры передаются в стандартную функцию `add_library()` Все остальные параметры передаются в стандартную функцию `add_library()`
#]=======================================================================] #]=======================================================================]
@ -23,7 +19,6 @@ myx_add_interface_library
include_guard(GLOBAL) include_guard(GLOBAL)
include(CMakePackageConfigHelpers) include(CMakePackageConfigHelpers)
include(GenerateExportHeader)
if(${CMAKE_VERSION} VERSION_LESS "3.17.0") if(${CMAKE_VERSION} VERSION_LESS "3.17.0")
set(MYX_CMAKE_LIB_DIR_BACKPORT "${CMAKE_CURRENT_LIST_DIR}") set(MYX_CMAKE_LIB_DIR_BACKPORT "${CMAKE_CURRENT_LIST_DIR}")
@ -83,7 +78,11 @@ function(myx_add_interface_library TARGET_NAME)
# При этом сама цель `${TARGET_NAME}` может участвовать в сборке, # При этом сама цель `${TARGET_NAME}` может участвовать в сборке,
# если окажется в перечне зависимостей. # если окажется в перечне зависимостей.
if(NOT PROJECT_IS_TOP_LEVEL) 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() return()
endif() endif()

View File

@ -6,11 +6,13 @@ myx_add_object_library
myx_add_object_library(TARGET_NAME myx_add_object_library(TARGET_NAME
[ OUTPUT_NAME output_name ] | [ OUTPUT_NAME output_name ] |
[ NO_EXPORT ] |
[ EXPORT_FILE_NAME file_name ] | [ EXPORT_FILE_NAME file_name ] |
[ EXPORT_BASE_NAME base_name ]) [ EXPORT_BASE_NAME base_name ])
Обязательные параметры: `TARGET_NAME` - имя библиотеки. Обязательные параметры: `TARGET_NAME` - имя библиотеки.
Параметр `OUTPUT_NAME` определяет базовое имя выходных файлов. Параметр `OUTPUT_NAME` определяет базовое имя выходных файлов.
Если указана опция `NO_EXPORT`, то файл экспорта не генерируется.
Параметр `EXPORT_FILE_NAME` задаёт имя заголовочного файла экспортируемых Параметр `EXPORT_FILE_NAME` задаёт имя заголовочного файла экспортируемых
переменных, а `EXPORT_BASE_NAME` - базовый суффикс для формирования имён переменных. переменных, а `EXPORT_BASE_NAME` - базовый суффикс для формирования имён переменных.
Все остальные параметры передаются в стандартную функцию `add_library()` Все остальные параметры передаются в стандартную функцию `add_library()`
@ -29,9 +31,8 @@ function(myx_add_object_library TARGET_NAME)
endif() endif()
include(CMakePackageConfigHelpers) include(CMakePackageConfigHelpers)
include(GenerateExportHeader)
set(options) set(options NO_EXPORT)
set(oneValueArgs OUTPUT_NAME EXPORT_FILE_NAME EXPORT_BASE_NAME) set(oneValueArgs OUTPUT_NAME EXPORT_FILE_NAME EXPORT_BASE_NAME)
set(multiValueArgs) set(multiValueArgs)
cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) 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) set_target_properties(${TARGET_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON)
if(NOT EXPORT_BASE_NAME) if(NOT ARG_NO_EXPORT)
set(ARG_EXPORT_BASE_NAME ${__project_name_upper}) include(GenerateExportHeader)
endif() if(NOT EXPORT_BASE_NAME)
set(ARG_EXPORT_BASE_NAME ${__project_name_upper})
endif()
if(NOT ARG_EXPORT_FILE_NAME) if(NOT ARG_EXPORT_FILE_NAME)
set(ARG_EXPORT_FILE_NAME "${PROJECT_SOURCE_DIR}/include/${TARGET_NAME}/${TARGET_NAME}_export.hpp") set(ARG_EXPORT_FILE_NAME "${PROJECT_SOURCE_DIR}/include/${TARGET_NAME}/${TARGET_NAME}_export.hpp")
endif() endif()
generate_export_header(${TARGET_NAME} generate_export_header(${TARGET_NAME}
BASE_NAME ${ARG_EXPORT_BASE_NAME} BASE_NAME ${ARG_EXPORT_BASE_NAME}
EXPORT_MACRO_NAME "EXPORT_${ARG_EXPORT_BASE_NAME}" EXPORT_MACRO_NAME "EXPORT_${ARG_EXPORT_BASE_NAME}"
DEPRECATED_MACRO_NAME "DEPRECATED_${ARG_EXPORT_BASE_NAME}" DEPRECATED_MACRO_NAME "DEPRECATED_${ARG_EXPORT_BASE_NAME}"
NO_DEPRECATED_MACRO_NAME "NO_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}" NO_EXPORT_MACRO_NAME "NO_EXPORT_${ARG_EXPORT_BASE_NAME}"
STATIC_DEFINE "STATIC_DEFINE_${ARG_EXPORT_BASE_NAME}" STATIC_DEFINE "STATIC_DEFINE_${ARG_EXPORT_BASE_NAME}"
EXPORT_FILE_NAME ${ARG_EXPORT_FILE_NAME} EXPORT_FILE_NAME ${ARG_EXPORT_FILE_NAME}
DEFINE_NO_DEPRECATED DEFINE_NO_DEPRECATED
) )
set_property(TARGET ${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}")
endif()
# Цель для создания динамической библиотеки из объектных файлов # Цель для создания динамической библиотеки из объектных файлов
if(${__project_name_upper}_BUILD_SHARED) if(${__project_name_upper}_BUILD_SHARED)

View File

@ -1,13 +1,13 @@
#[=======================================================================[.rst: #[=======================================================================[.rst:
Обёртки для функции `message()`, которые в терминале UNIX Обёртки для функции `message()`, которые в терминале UNIX
подсвечиают сообщения в зависимости от важности. подсвечивают сообщения в зависимости от важности.
#]=======================================================================] #]=======================================================================]
include_guard(GLOBAL) include_guard(GLOBAL)
if(DEFINED ENV{TERM} AND UNIX) if(DEFINED ENV{COLORTERM} AND UNIX)
string(ASCII 27 Esc) string(ASCII 27 Esc)
set(MyxColorReset "${Esc}[m") set(MyxColorReset "${Esc}[m")
set(MyxColorBold "${Esc}[1m") set(MyxColorBold "${Esc}[1m")

View File

@ -19,7 +19,10 @@ function(myx_qt5_target_setup TARGET_NAME)
if(__target_type STREQUAL "EXECUTABLE") if(__target_type STREQUAL "EXECUTABLE")
target_link_libraries(${TARGET_NAME} PRIVATE "Qt5::${iter}") target_link_libraries(${TARGET_NAME} PRIVATE "Qt5::${iter}")
endif() 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}") target_link_libraries(${TARGET_NAME} PUBLIC "Qt5::${iter}")
endif() endif()
endif() endif()
@ -85,9 +88,9 @@ function(myx_qt5_target_setup TARGET_NAME)
# Добавление скомпилированного файла переводов к списку зависимостей для цели # Добавление скомпилированного файла переводов к списку зависимостей для цели
target_sources(${TARGET_NAME} PRIVATE ${qm}) target_sources(${TARGET_NAME} PRIVATE ${qm})
endforeach() endforeach()
# Окончение файла ресурсов # Окончание файла ресурсов
file(APPEND ${PROJECT_BINARY_DIR}/${TARGET_NAME}_l10n.qrc "</qresource></RCC>\n") file(APPEND ${PROJECT_BINARY_DIR}/${TARGET_NAME}_l10n.qrc "</qresource></RCC>\n")
# Комплияция файла ресурсов с переводами # Компиляция файла ресурсов с переводами
qt5_add_resources(qrc_l10n ${PROJECT_BINARY_DIR}/${TARGET_NAME}_l10n.qrc) qt5_add_resources(qrc_l10n ${PROJECT_BINARY_DIR}/${TARGET_NAME}_l10n.qrc)
target_sources(${TARGET_NAME} PRIVATE ${qrc_l10n}) target_sources(${TARGET_NAME} PRIVATE ${qrc_l10n})
endif() endif()

View File

@ -108,6 +108,8 @@ function(myx_target_setup TARGET_NAME)
endif() endif()
endif() endif()
endif() endif()
else()
target_link_libraries(${TARGET_NAME} PRIVATE ${__link_library})
endif() endif()
endforeach() endforeach()
endif() endif()

View File

@ -3,7 +3,7 @@ include_guard(GLOBAL)
macro(myx_find_required_packages) macro(myx_find_required_packages)
set(options) set(options)
set(oneValueArgs) set(oneValueArgs)
set(multiValueArgs PACKAGES Boost Qt5 Qt5Private) set(multiValueArgs PACKAGES Boost Qt5 Qt5Private Qt6 Qt6Private)
cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
foreach(iter ${ARG_PACKAGES}) foreach(iter ${ARG_PACKAGES})
@ -24,6 +24,16 @@ macro(myx_find_required_packages)
endforeach() endforeach()
endif() 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) foreach(__iter IN LISTS oneValueArgs multiValueArgs)
unset(ARG_${__iter}) unset(ARG_${__iter})
endforeach() endforeach()

View File

@ -4,7 +4,7 @@
По умолчанию предполагается использование версии MyxCMake, По умолчанию предполагается использование версии MyxCMake,
файлы которой находятся в каталоге `cmake/myx` текущего проекта. файлы которой находятся в каталоге `cmake/myx` текущего проекта.
Для удобства разботки библиотеки MyxCMake можно указать путь Для удобства разработки библиотеки MyxCMake можно указать путь
к её репозиторию с помощью переменной проекта CMake `MYX_CMAKE_DIR` к её репозиторию с помощью переменной проекта CMake `MYX_CMAKE_DIR`
или переменной окружения `MYX_CMAKE_DIR`. или переменной окружения `MYX_CMAKE_DIR`.
@ -12,7 +12,7 @@
поиск версии в каталогах перечисленных в переменной `CMAKE_MODULES_DIR`. поиск версии в каталогах перечисленных в переменной `CMAKE_MODULES_DIR`.
Кроме того выполняется попытка поиска (MyxxCMake)[../../../../myxx] -- Кроме того выполняется попытка поиска (MyxxCMake)[../../../../myxx] --
расширения для библиотеки, позволяющиего в режиме разработки программного расширения для библиотеки, позволяющего в режиме разработки программного
проекта использовать дополнительные инструменты для его сопровождения. проекта использовать дополнительные инструменты для его сопровождения.
#]=======================================================================] #]=======================================================================]
@ -20,15 +20,15 @@ if(ENV{MYX_CMAKE_DIR})
set(MYX_CMAKE_DIR $ENV{MYX_CMAKE_DIR}) set(MYX_CMAKE_DIR $ENV{MYX_CMAKE_DIR})
endif() endif()
if(MYX_CMAKE_DIR) if(MYX_CMAKE_DIR)
find_package(MyxCMake 2.3.1 REQUIRED CONFIG PATHS ${MYX_CMAKE_DIR} NO_DEFAULT_PATH) find_package(MyxCMake 2.3.8 REQUIRED CONFIG PATHS ${MYX_CMAKE_DIR} NO_DEFAULT_PATH)
myx_message_notice("=== MyxCMake directory: ${MyxCMake_CONFIG} ===") myx_message_notice("== MyxCMake directory: ${MyxCMake_CONFIG} ==")
else() else()
if(MYX_CMAKE_USE_SYSTEM) if(MYX_CMAKE_USE_SYSTEM)
find_package(MyxCMake 2.3.1 REQUIRED) find_package(MyxCMake 2.3.8 REQUIRED)
myx_message_notice("=== MyxCMake directory: ${MyxCMake_CONFIG} ===") myx_message_notice("== MyxCMake directory: ${MyxCMake_CONFIG} ==")
else() else()
include(${PROJECT_SOURCE_DIR}/cmake/myx/MyxCMakeConfig.cmake) 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()
endif() endif()