include_guard(GLOBAL) function(myx_create_packages TARGET_NAME) if(NOT ${PROJECT_BINARY_DIR} STREQUAL ${CMAKE_BINARY_DIR}) return() endif() set(options) set(oneValueArgs DEBIAN_PACKAGE_TYPE CPACK_DEBIAN_PACKAGE_SECTION CPACK_DEBIAN_PACKAGE_PRIORITY CMAKE_INSTALL_DEFAULT_COMPONENT_NAME CPACK_PACKAGE_CONTACT CPACK_PACKAGING_INSTALL_PREFIX) set(multiValueArgs CPACK_SOURCE_GENERATOR CPACK_GENERATOR CPACK_SOURCE_IGNORE_FILES) cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) # Общие настройки для пакета: организация, автор, версия if(NOT ${PROJECT_NAME}_CONTACT) if(${PROJECT_NAME}_AUTHOR_NAME AND ${PROJECT_NAME}_AUTHOR_EMAIL) set(CPACK_PACKAGE_CONTACT "${${PROJECT_NAME}_AUTHOR_NAME} <${${PROJECT_NAME}_AUTHOR_EMAIL}>") else() set(CPACK_PACKAGE_CONTACT "unknown maintainer ") myx_message_warning("\${PROJECT_NAME}_CONTACT variable is required for packaging but unset") endif() else() set(CPACK_PACKAGE_CONTACT ${${PROJECT_NAME}_CONTACT}) endif() if(NOT ${PROJECT_NAME}_VENDOR) if(${PROJECT_NAME}_AUTHOR_NAME) set(CPACK_PACKAGE_VENDOR "${${PROJECT_NAME}_AUTHOR_NAME}") else() set(CPACK_PACKAGE_VENDOR "unknown vendor") myx_message_warning("\${PROJECT_NAME}_VENDOR variable is required for packaging but unset") endif() else() set(CPACK_PACKAGE_VENDOR ${${PROJECT_NAME}_VENDOR}) endif() string(TOLOWER ${PROJECT_NAME} PN) set(CPACK_PACKAGE_NAME ${PN}) set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION}) if(NOT CPACK_PACKAGING_INSTALL_PREFIX) set(CPACK_PACKAGING_INSTALL_PREFIX "/usr") endif() # Параметры для архива исходных текстов 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 ${TARGET_NAME}) endif() endif() # Подключение модуля, выполняющего сборку архивов и пакетов include(CPack) endfunction(myx_create_packages TARGET_NAME)