2022-10-14 14:50:39 +00:00
|
|
|
|
function(myx_create_packages TARGET_NAME)
|
2022-10-19 13:58:22 +00:00
|
|
|
|
if(NOT ${PROJECT_BINARY_DIR} STREQUAL ${CMAKE_BINARY_DIR})
|
|
|
|
|
return()
|
|
|
|
|
endif()
|
2022-10-14 14:50:39 +00:00
|
|
|
|
|
2022-10-09 01:23:55 +00:00
|
|
|
|
set(options)
|
|
|
|
|
set(oneValueArgs DEBIAN_PACKAGE_TYPE CPACK_DEBIAN_PACKAGE_SECTION CPACK_DEBIAN_PACKAGE_PRIORITY
|
2022-10-19 11:39:26 +00:00
|
|
|
|
CMAKE_INSTALL_DEFAULT_COMPONENT_NAME CPACK_PACKAGE_CONTACT CPACK_PACKAGING_INSTALL_PREFIX)
|
|
|
|
|
set(multiValueArgs CPACK_SOURCE_GENERATOR CPACK_GENERATOR CPACK_SOURCE_IGNORE_FILES)
|
2022-10-09 01:23:55 +00:00
|
|
|
|
cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
|
|
|
|
|
|
|
|
|
# Общие настройки для пакета: организация, автор, версия
|
2022-10-14 14:50:39 +00:00
|
|
|
|
if(NOT ${PROJECT_NAME}_CONTACT)
|
2022-10-15 07:14:08 +00:00
|
|
|
|
if(${PROJECT_NAME}_AUTHOR_NAME AND ${PROJECT_NAME}_AUTHOR_EMAIL)
|
|
|
|
|
set(CPACK_PACKAGE_CONTACT "${${PROJECT_NAME}_AUTHOR_NAME} <${${PROJECT_NAME}_AUTHOR_EMAIL}>")
|
2022-10-14 14:50:39 +00:00
|
|
|
|
else()
|
|
|
|
|
set(CPACK_PACKAGE_CONTACT "unknown maintainer <nonexistent@mailbox>")
|
|
|
|
|
myx_message_warning("\${PROJECT_NAME}_CONTACT variable is required for packaging but unset")
|
|
|
|
|
endif()
|
2022-10-09 01:23:55 +00:00
|
|
|
|
else()
|
2022-10-14 14:50:39 +00:00
|
|
|
|
set(CPACK_PACKAGE_CONTACT ${${PROJECT_NAME}_CONTACT})
|
2022-10-09 01:23:55 +00:00
|
|
|
|
endif()
|
|
|
|
|
|
2022-10-14 14:50:39 +00:00
|
|
|
|
if(NOT ${PROJECT_NAME}_VENDOR)
|
2022-10-15 07:14:08 +00:00
|
|
|
|
if(${PROJECT_NAME}_AUTHOR_NAME)
|
|
|
|
|
set(CPACK_PACKAGE_VENDOR "${${PROJECT_NAME}_AUTHOR_NAME}")
|
2022-10-14 14:50:39 +00:00
|
|
|
|
else()
|
|
|
|
|
set(CPACK_PACKAGE_VENDOR "unknown vendor")
|
|
|
|
|
myx_message_warning("\${PROJECT_NAME}_VENDOR variable is required for packaging but unset")
|
|
|
|
|
endif()
|
2022-10-09 01:23:55 +00:00
|
|
|
|
else()
|
2022-10-14 14:50:39 +00:00
|
|
|
|
set(CPACK_PACKAGE_VENDOR ${${PROJECT_NAME}_VENDOR})
|
2022-10-09 01:23:55 +00:00
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
string(TOLOWER ${PROJECT_NAME} PN)
|
|
|
|
|
set(CPACK_PACKAGE_NAME ${PN})
|
|
|
|
|
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
|
|
|
|
|
|
2022-10-19 11:39:26 +00:00
|
|
|
|
if(NOT CPACK_PACKAGING_INSTALL_PREFIX)
|
|
|
|
|
set(CPACK_PACKAGING_INSTALL_PREFIX "/usr")
|
|
|
|
|
endif()
|
|
|
|
|
|
2022-10-09 01:23:55 +00:00
|
|
|
|
# Параметры для архива исходных текстов
|
|
|
|
|
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)
|
2022-10-20 08:50:52 +00:00
|
|
|
|
# TODO
|
|
|
|
|
#list(REMOVE_DUPLICATES CPACK_COMPONENTS_ALL)
|
2022-10-09 01:23:55 +00:00
|
|
|
|
|
|
|
|
|
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)
|
2022-10-14 14:50:39 +00:00
|
|
|
|
add_dependencies(deb ${TARGET_NAME})
|
2022-10-09 01:23:55 +00:00
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# Подключение модуля, выполняющего сборку архивов и пакетов
|
|
|
|
|
include(CPack)
|
2022-10-15 07:14:08 +00:00
|
|
|
|
endfunction(myx_create_packages TARGET_NAME)
|