diff --git a/MyxCMake/MyxCMakeConfig.cmake b/MyxCMake/MyxCMakeConfig.cmake index 5a38ac2..f9b8868 100644 --- a/MyxCMake/MyxCMakeConfig.cmake +++ b/MyxCMake/MyxCMakeConfig.cmake @@ -59,6 +59,7 @@ include(${MYX_CMAKE_LIB_DIR}/doc/Doxygen.cmake) include(${MYX_CMAKE_LIB_DIR}/generators/PrivateConfigHeader.cmake) include(${MYX_CMAKE_LIB_DIR}/generators/GitInfoHeader.cmake) +include(${MYX_CMAKE_LIB_DIR}/CreatePackages.cmake) include(${MYX_CMAKE_LIB_DIR}/Uninstall.cmake) unset(MYX_CMAKE_SOURCE_DIR) diff --git a/MyxCMake/MyxCMakeConfigVersion.cmake b/MyxCMake/MyxCMakeConfigVersion.cmake index e846621..111ec30 100644 --- a/MyxCMake/MyxCMakeConfigVersion.cmake +++ b/MyxCMake/MyxCMakeConfigVersion.cmake @@ -1,4 +1,4 @@ -set(MYX_CMAKE_PACKAGE_VERSION "2.0.16") +set(MYX_CMAKE_PACKAGE_VERSION "2.0.17") if(MYX_CMAKE_PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION) set(PACKAGE_VERSION_COMPATIBLE FALSE) else() diff --git a/MyxCMake/lib/AddLibrary.cmake b/MyxCMake/lib/AddLibrary.cmake index 6a14f8c..d1d0250 100644 --- a/MyxCMake/lib/AddLibrary.cmake +++ b/MyxCMake/lib/AddLibrary.cmake @@ -148,7 +148,7 @@ function(myx_add_library NAME TYPE) install(EXPORT ${NAME}Targets DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${NAME} - COMPONENT dev + COMPONENT DEV ) install( @@ -156,7 +156,7 @@ function(myx_add_library NAME TYPE) ${PROJECT_BINARY_DIR}/${NAME}ConfigVersion.cmake ${PROJECT_BINARY_DIR}/${NAME}Config.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${NAME} - COMPONENT dev + COMPONENT DEV ) # Формирование файла для pkg-config @@ -187,7 +187,7 @@ function(myx_add_library NAME TYPE) # Установка файла для pkg-config install( FILES "${PROJECT_BINARY_DIR}/${NAME}.pc" - COMPONENT dev + COMPONENT DEV DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") if(TYPE STREQUAL "OBJECT") @@ -197,7 +197,7 @@ function(myx_add_library NAME TYPE) TARGETS ${NAME}_shared EXPORT ${NAME}Targets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - COMPONENT lib + COMPONENT LIB ) endif() @@ -207,7 +207,7 @@ function(myx_add_library NAME TYPE) TARGETS ${NAME}_static EXPORT ${NAME}Targets ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - COMPONENT static + COMPONENT STATIC ) endif() endif() @@ -218,7 +218,7 @@ function(myx_add_library NAME TYPE) install( TARGETS ${NAME} EXPORT ${NAME}Targets - COMPONENT lib + COMPONENT LIB ) endif() endfunction() diff --git a/MyxCMake/lib/CreatePackages.cmake b/MyxCMake/lib/CreatePackages.cmake new file mode 100644 index 0000000..6172c97 --- /dev/null +++ b/MyxCMake/lib/CreatePackages.cmake @@ -0,0 +1,180 @@ +include_guard(GLOBAL) + +function(myx_create_packages NAME) + set(options) + set(oneValueArgs DEBIAN_PACKAGE_TYPE CPACK_DEBIAN_PACKAGE_SECTION CPACK_DEBIAN_PACKAGE_PRIORITY + CMAKE_INSTALL_DEFAULT_COMPONENT_NAME CPACK_PACKAGE_CONTACT) + set(multiValueArgs CPACK_SOURCE_GENERATOR CPACK_GENERATOR CPACK_SOURCE_IGNORE_FILES + CPACK_PACKAGING_INSTALL_PREFIX) + cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + # Общие настройки для пакета: организация, автор, версия + if(NOT ${PROJECT_NAME}_VENDOR) + set(CPACK_PACKAGE_VENDOR "unknown vendor") + myx_message_warning("\${PROJECT_NAME}_VENDOR variable is required for packaging but unset") + else() + set(CPACK_PACKAGE_VENDOR ${${PROJECT_NAME}_VENDOR}) + endif() + + if(NOT ${PROJECT_NAME}_CONTACT) + set(CPACK_PACKAGE_CONTACT "unknown maintainer") + myx_message_warning("\${PROJECT_NAME}_CONTACT variable is required for packaging but unset") + else() + set(CPACK_PACKAGE_CONTACT ${${PROJECT_NAME}_CONTACT}) + endif() + + string(TOLOWER ${PROJECT_NAME} PN) + set(CPACK_PACKAGE_NAME ${PN}) + set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION}) + + # Параметры для архива исходных текстов + if(NOT ARG_CPACK_SOURCE_GENERATOR) + set(CPACK_SOURCE_GENERATOR "TXZ") + else() + set(ARG_CPACK_SOURCE_GENERATOR ${CPACK_SOURCE_GENERATOR}) + endif() + set(CPACK_SOURCE_PACKAGE_FILE_NAME "${PN}-${CPACK_PACKAGE_VERSION}") + + # Типы генераторов для бинарных архивов + if(NOT ARG_CPACK_GENERATOR) + set(CPACK_GENERATOR "TXZ" "DEB") + else() + set(CPACK_GENERATOR ${ARG_CPACK_GENERATOR}) + endif() + if(CMAKE_SYSTEM_NAME STREQUAL Windows) + list(REMOVE_ITEM CPACK_GENERATOR "DEB") + endif() + + # Параметры для архива собранного проекта + set(CPACK_TARGET_ARCH ${CMAKE_SYSTEM_PROCESSOR}) + if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") + set(CPACK_TARGET_ARCH "amd64") + endif() + set(CPACK_PACKAGE_FILE_NAME "${PN}_${CPACK_PACKAGE_VERSION}") + + # Список масок для исключения из архива исходных текстов + set(CPACK_SOURCE_IGNORE_FILES + ${ARG_CPACK_SOURCE_IGNORE_FILES} + ${CMAKE_BINARY_DIR} + "^${CMAKE_SOURCE_DIR}/.?build.?/" + "^${CMAKE_SOURCE_DIR}/.?output.?/" + "^${CMAKE_SOURCE_DIR}/files/var" + "^${CMAKE_SOURCE_DIR}/files/log" + "CMakeLists.txt.user.*" + ".*.autosave" + ".*.status" + "~$" + "\\\\.swp$") + + option(MYX_COMPACT_SOURCE_PACKAGE "Make compact source package" ON) + if(MYX_COMPACT_SOURCE_PACKAGE) + # Список масок для исключения из архива исходных текстов для более компактного архива + set(CPACK_SOURCE_IGNORE_FILES + ${CPACK_SOURCE_IGNORE_FILES} + "\\\\.git" + "/\\\\.git/" + "/\\\\.gitlab-ci/" + "\\\\.clang-tidy$" + "\\\\.cmake-format$" + "\\\\.gitignore$" + "\\\\.gitattributes$" + "\\\\.gitmodules$" + "\\\\.gitlab-ci.yml$") + endif() + + if("TXZ" IN_LIST CPACK_GENERATOR) + set(CPACK_ARCHIVE_COMPONENT_INSTALL OFF) + set(CPACK_ARCHIVE_FILE_NAME "${PN}_${CPACK_TARGET_ARCH}_${CPACK_PACKAGE_VERSION}") + endif() + + if("DEB" IN_LIST CPACK_GENERATOR) + set(CPACK_DEB_MONOLITHIC_INSTALL OFF) + set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) + + # По умолчанию пакет собирается для дистрибутива unstable + if(NOT ARG_DEBIAN_PACKAGE_TYPE) + set(DEBIAN_PACKAGE_TYPE "unstable") + endif() + + if(NOT ARG_CPACK_DEBIAN_PACKAGE_SECTION) + set(CPACK_DEBIAN_PACKAGE_SECTION "misc") + endif() + + if(NOT ARG_CPACK_DEBIAN_PACKAGE_PRIORITY) + set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional") + endif() + + # По умолчанию пакет для Debian делится на компоненты + if(NOT ARG_CPACK_DEB_COMPONENT_INSTALL) + set(CPACK_DEB_COMPONENT_INSTALL ON) + endif() + + # Если имя компонента по умолчанию не определено, то устанавливается main + if(NOT CMAKE_INSTALL_DEFAULT_COMPONENT_NAME) + set(CMAKE_INSTALL_DEFAULT_COMPONENT_NAME MAIN) + endif() + + # В списке компонентов обязательно должны быть main, lib, dev, static и doc + #list(APPEND CPACK_COMPONENTS_ALL main lib dev static doc) + list(REMOVE_DUPLICATES CPACK_COMPONENTS_ALL) + + set(deb_arch_suffix "${CPACK_PACKAGE_VERSION}_${CPACK_TARGET_ARCH}.deb") + # Правило формирования имени пакета и файла для компонента main + set(CPACK_DEBIAN_MAIN_PACKAGE_NAME "${PN}") + set(CPACK_DEBIAN_MAIN_FILE_NAME ${CPACK_DEBIAN_MAIN_PACKAGE_NAME}_${deb_arch_suffix}) + + # Правило формирования имени пакета и файла для компонента lib + set(CPACK_DEBIAN_LIB_PACKAGE_NAME "lib${PN}${PROJECT_VERSION_MAJOR}") + set(CPACK_DEBIAN_LIB_FILE_NAME ${CPACK_DEBIAN_LIB_PACKAGE_NAME}_${deb_arch_suffix}) + + # Правило формирования имени пакета и файла для компонента dev + set(CPACK_DEBIAN_DEV_PACKAGE_NAME "lib${PN}-dev") + set(CPACK_DEBIAN_DEV_FILE_NAME ${CPACK_DEBIAN_DEV_PACKAGE_NAME}_${deb_arch_suffix}) + + # Правило формирования имени пакета и файла для компонента static + set(CPACK_DEBIAN_STATIC_PACKAGE_NAME "lib${PN}${PROJECT_VERSION_MAJOR}-static-dev") + set(CPACK_DEBIAN_STATIC_FILE_NAME ${CPACK_DEBIAN_STATIC_PACKAGE_NAME}_${deb_arch_suffix}) + set(CPACK_DEBIAN_STATIC_PACKAGE_DEPENDS "lib${PN}-dev") + + # Правило формирования имени пакета и файла для компонента doc + set(CPACK_DEBIAN_DOC_PACKAGE_NAME "${PN}-doc") + set(CPACK_DEBIAN_DOC_FILE_NAME ${PN}-doc_${CPACK_PACKAGE_VERSION}_all.deb) + + foreach(iter ${CPACK_COMPONENTS_ALL}) + string(TOLOWER ${iter} _cl) + string(TOUPPER ${iter} _cu) + # Правила формирования имени пакета и файла для остальных компонентов + if((NOT ${_cu} STREQUAL MAIN) AND + (NOT ${_cu} STREQUAL LIB) AND + (NOT ${_cu} STREQUAL DEV) AND + (NOT ${_cu} STREQUAL STATIC) AND + (NOT ${_cu} STREQUAL DOC)) + set(CPACK_DEBIAN_${_cu}_PACKAGE_NAME "${PN}-${_cl}") + set(CPACK_DEBIAN_${_cu}_FILE_NAME "${CPACK_DEBIAN_${_cu}_PACKAGE_NAME}_${deb_arch_suffix}") + endif() + + # Если в каталоге ${CMAKE_SOURCE_DIR}/cmake/deb/${_cl} находятся сценарии сопровождающего + # postinst, preinst, postrm и prerm, то они будут добавлены к пакету. + if(EXISTS "${CMAKE_SOURCE_DIR}/cmake/deb/${_cl}/preinst") + list(APPEND CPACK_DEBIAN_${_cu}_PACKAGE_CONTROL_EXTRA "${CMAKE_SOURCE_DIR}/cmake/deb/${_cl}/preinst") + endif() + if(EXISTS "${CMAKE_SOURCE_DIR}/cmake/deb/${_cl}/postinst") + list(APPEND CPACK_DEBIAN_${_cu}_PACKAGE_CONTROL_EXTRA "${CMAKE_SOURCE_DIR}/cmake/deb/${_cl}/postinst") + endif() + if(EXISTS "${CMAKE_SOURCE_DIR}/cmake/deb/${_cl}/prerm") + list(APPEND CPACK_DEBIAN_${_cu}_PACKAGE_CONTROL_EXTRA "${CMAKE_SOURCE_DIR}/cmake/deb/${_cl}/prerm") + endif() + if(EXISTS "${CMAKE_SOURCE_DIR}/cmake/deb/${_cl}/postrm") + list(APPEND CPACK_DEBIAN_${_cu}_PACKAGE_CONTROL_EXTRA "${CMAKE_SOURCE_DIR}/cmake/deb/${_cl}/postrm") + endif() + endforeach() + + if(UNIX AND NOT TARGET deb) + add_custom_target(deb WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMAND cpack -G DEB) + add_dependencies(deb ${NAME}) + endif() + endif() + + # Подключение модуля, выполняющего сборку архивов и пакетов + include(CPack) +endfunction(myx_create_packages NAME) diff --git a/MyxCMake/lib/Qt5TargetSetup.cmake b/MyxCMake/lib/Qt5TargetSetup.cmake index 48ecbf8..71d3680 100644 --- a/MyxCMake/lib/Qt5TargetSetup.cmake +++ b/MyxCMake/lib/Qt5TargetSetup.cmake @@ -94,7 +94,7 @@ function(myx_qt5_target_setup NAME) myx_install_relative(${PROJECT_SOURCE_DIR} FILES ${ARG_PUBLIC_MOC} DESTINATION ${CMAKE_INSTALL_PREFIX} - COMPONENT dev + COMPONENT DEV ) endif() endfunction() diff --git a/MyxCMake/lib/TargetSetup.cmake b/MyxCMake/lib/TargetSetup.cmake index d26bae7..0365025 100644 --- a/MyxCMake/lib/TargetSetup.cmake +++ b/MyxCMake/lib/TargetSetup.cmake @@ -70,7 +70,7 @@ function(myx_target_setup NAME) if(CMAKE_CXX_COMPILE_OPTIONS_PIE) target_compile_options(${NAME} PUBLIC ${CMAKE_CXX_COMPILE_OPTIONS_PIE}) endif() - install(TARGETS ${NAME} COMPONENT main RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + install(TARGETS ${NAME} COMPONENT MAIN RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) endif() if(${target_type} STREQUAL "INTERFACE_LIBRARY") @@ -123,7 +123,7 @@ function(myx_target_setup NAME) myx_install_relative(${PROJECT_SOURCE_DIR} FILES ${ARG_PUBLIC_HEADERS} ${ARG_INTERFACE_HEADERS} DESTINATION ${CMAKE_INSTALL_PREFIX} - COMPONENT dev + COMPONENT DEV ) endif() endfunction() diff --git a/MyxCMake/lib/doc/Doxygen.cmake b/MyxCMake/lib/doc/Doxygen.cmake index 5d97ac0..f68b462 100644 --- a/MyxCMake/lib/doc/Doxygen.cmake +++ b/MyxCMake/lib/doc/Doxygen.cmake @@ -63,7 +63,7 @@ function(myx_doc_doxygen NAME) COMMENT "Generating API documentation with Doxygen") if(ARG_HTML) install(DIRECTORY ${CMAKE_BINARY_DIR}/doc/doxygen/html/ - COMPONENT doc OPTIONAL + COMPONENT DOC OPTIONAL DESTINATION ${CMAKE_INSTALL_DATADIR}/doc/doxygen) endif() if(NOT TARGET myx-doc-doxygen) diff --git a/README.md b/README.md index 19d73bb..807217d 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ## Установка В корневом каталоге проекта создать каталог `cmake` и распаковать в него -[архив](../../../releases/download/2.0.16/myx-cmake-local-2.0.16.tar.xz ). +[архив](../../../releases/download/2.0.17/myx-cmake-local-2.0.17.tar.xz ). ## Использование diff --git a/VERSION b/VERSION index a14da29..a6e7bcb 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.0.16 +2.0.17 diff --git a/debian/CMakeLists.txt b/debian/CMakeLists.txt index acabcb3..7aa693f 100644 --- a/debian/CMakeLists.txt +++ b/debian/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.6 FATAL_ERROR) -project(myx-cmake VERSION 2.0.16 LANGUAGES) +project(myx-cmake VERSION 2.0.17 LANGUAGES) include(GNUInstallDirs) file(WRITE ${CMAKE_SOURCE_DIR}/MyxCMake/MyxCMakeConfigVersion.cmake diff --git a/debian/changelog b/debian/changelog index 5fa2803..1fb57e4 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -myx-cmake (2.0.16) unstable; urgency=medium +myx-cmake (2.0.17) unstable; urgency=medium * New version. diff --git a/myx_setup.cmake b/myx_setup.cmake index 0f819e3..67abcfe 100644 --- a/myx_setup.cmake +++ b/myx_setup.cmake @@ -20,11 +20,11 @@ if(ENV{MYX_CMAKE_DIR}) set(MYX_CMAKE_DIR $ENV{MYX_CMAKE_DIR}) endif() if(MYX_CMAKE_DIR) - find_package(MyxCMake 2.0.16 REQUIRED CONFIG PATHS ${MYX_CMAKE_DIR} NO_DEFAULT_PATH) + find_package(MyxCMake 2.0.17 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.0.16 REQUIRED) + find_package(MyxCMake 2.0.17 REQUIRED) myx_message_notice("=== MyxCMake directory: ${MyxCMake_CONFIG} ===") else() include(${PROJECT_SOURCE_DIR}/cmake/myx/MyxCMakeConfig.cmake)