Создание deb пакета с помощью CPack
снова пишу о создании пакетов .deb. Приложение пишу на с++, компилятор Cmake. Мне сказали, что для создания пакета нужно использовать Cpack. Вопрос, как это можно правильно сделать? Пакет нужен для нескольких систем(в этом случае ubuntu и astra linux), об этом слышала тоже нужно позаботиться? но не знаю как. И каким образом его обновлять? Буду рада, если напишете ответ на примере виджетного приложения Qt
Ответы (1 шт):
Минималистичный пример 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-скрипты. Вместо вывода: такой метод сборки пакетов можно использовать для локального распространения/использования, но могут быть трудности при публикации в репозитории, где более строгие правила.