Создание deb пакета с помощью CPack

снова пишу о создании пакетов .deb. Приложение пишу на с++, компилятор Cmake. Мне сказали, что для создания пакета нужно использовать Cpack. Вопрос, как это можно правильно сделать? Пакет нужен для нескольких систем(в этом случае ubuntu и astra linux), об этом слышала тоже нужно позаботиться? но не знаю как. И каким образом его обновлять? Буду рада, если напишете ответ на примере виджетного приложения Qt


Ответы (1 шт):

Автор решения: user207200

Минималистичный пример CMakeLists.txt с переменными для сборки deb-пакета с помощью cpack. Содержимое файлов main.cpp, mainwindow.cpp, mainwindow.h не привожу, так как это стандартная генерация нового проекта через qt-creator. Все пути для файлов пакета можно редактировать под свой дистрибутив и свои нужды. Здесь для примера расположения иконки и файла ярлыка указаны пути актуальные для окружения fly дистрибутива astra-linux.

cmake_minimum_required(VERSION 3.5)

project(qtwdg-cpack-ex VERSION 0.1 LANGUAGES CXX)

# build section

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt5 COMPONENTS Core Widgets REQUIRED)
add_executable(qtwdg-cpack-ex main.cpp mainwindow.cpp)
target_link_libraries(qtwdg-cpack-ex Qt5::Widgets Qt5::Core)

# cpack section

set(CPACK_GENERATOR "DEB")
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_DEBIAN_PACKAGE_SECTION "contrib")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "MaintainerName <maintainer@mail>")
set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "Example cpack deb-package build from qt-widgets project")
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libqt5core5a, libqt5widgets5")

set(CPACK_PACKAGING_INSTALL_PREFIX "/")

set(CPACK_STRIP_FILES ON)

install(TARGETS qtwdg-cpack-ex DESTINATION "opt/usr/bin")

# пример добавления иконки приложения
install(FILES ${CMAKE_SOURCE_DIR}/icon.png DESTINATION "usr/share/pixmaps")

# пример добавления ярлыка на рабочий стол (astra-linux)
install(FILES ${CMAKE_SOURCE_DIR}/qtwdg-cpack-ex.desktop DESTINATION "usr/share/applications/flydesktop")

# пример добавления ярлыка в панель запуска (пуск) (astra-linux)
install(FILES ${CMAKE_SOURCE_DIR}/qtwdg-cpack-ex.desktop DESTINATION "usr/share/applications/flystartmenu")

include(CPack)

Сборка из директории проекта:

mkdir build && cd build && cmake .. && cpack

Результат:

dpkg -I qtwdg-cpack-ex-0.1-Linux.deb
 new Debian package, version 2.0.
 size 8248 bytes: control archive=466 bytes.
     299 байт(а),    11 строк      control              
     306 байт(а),     4 строк      md5sums              
 Architecture: amd64
 Depends: libqt5core5a, libqt5widgets5
 Description: qtwdg-cpack-ex built using CMake
  Example cpack deb-package build from qt-widgets project
 Maintainer: MaintainerName <maintainer@mail>
 Package: qtwdg-cpack-ex
 Priority: optional
 Section: contrib
 Version: 0.1
 Installed-Size: 65
dpkg --contents qtwdg-cpack-ex-0.1-Linux.deb
drwxr-xr-x root/root         0 2025-04-25 10:10 ./opt/
drwxr-xr-x root/root         0 2025-04-25 10:10 ./opt/usr/
drwxr-xr-x root/root         0 2025-04-25 10:10 ./opt/usr/bin/
-rwxr-xr-x root/root     26960 2025-04-25 10:10 ./opt/usr/bin/qtwdg-cpack-ex
drwxr-xr-x root/root         0 2025-04-25 10:10 ./usr/
drwxr-xr-x root/root         0 2025-04-25 10:10 ./usr/share/
drwxr-xr-x root/root         0 2025-04-25 10:10 ./usr/share/applications/
drwxr-xr-x root/root         0 2025-04-25 10:10 ./usr/share/applications/flydesktop/
-rw-r--r-- root/root       157 2025-04-25 10:10 ./usr/share/applications/flydesktop/qtwdg-cpack-ex.desktop
drwxr-xr-x root/root         0 2025-04-25 10:10 ./usr/share/applications/flystartmenu/
-rw-r--r-- root/root       157 2025-04-25 10:10 ./usr/share/applications/flystartmenu/qtwdg-cpack-ex.desktop
drwxr-xr-x root/root         0 2025-04-25 10:10 ./usr/share/pixmaps/
-rw-r--r-- root/root      1718 2025-04-25 10:10 ./usr/share/pixmaps/icon.png

После установки пакета в систему будут созданы два ярлыка с указанной иконкой для запуска оконного приложения: один на рабочем столе, второй в панели запуска (пуск).

P.S. Модуль CPack за счет интеграции в систему сборки CMake позволяет довольно просто и быстро создавать пакеты для целого набора пакетных систем. По сравнению с каноническим способом сборки deb-пакета надо просто задать ряд переменных и указать несколько правил, без создания целого набора файлов (control, rules, changelog и т.д.) и использования специализированных утилит и хелперов. Но у этого метода есть и недостаток - созданный пакет далек от соответствия официальным требованиям от debian. В этом можно убедиться, если запустить утилиту lintian. Для исправления части ошибок и предупреждений иногда приходится писать достаточно нетривиальные cmake-скрипты. Вместо вывода: такой метод сборки пакетов можно использовать для локального распространения/использования, но могут быть трудности при публикации в репозитории, где более строгие правила.

→ Ссылка