📄

Продвинутая сборка: Создание и распространение DEB пакетов для C++/Qt приложения с помощью CPack

04.10.2025 CMake

После того как мы освоили создание пакетов с отладочными символами (dbgsym), логичным продолжением становится изучение сборки основных пакетов для распространения вашего C++/Qt приложения. В этой статье мы подробно рассмотрим, как использовать CPack для создания DEB пакетов, готовых к установке в Debian-based системах.

CPack — это мощный инструмент, входящий в состав CMake, который позволяет генерировать пакеты для различных систем распространения (DEB, RPM, TGZ и др.). Для C++/Qt разработчиков, работающих с современными стандартами C++17 и Qt6, CPack предлагает удобный способ упаковки приложений.

Базовая настройка CMakeLists.txt

Начнем с минимальной конфигурации CMake для Qt6 проекта:

cmake_minimum_required(VERSION 3.16)
project(MyQtApp VERSION 1.0.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Поиск необходимых компонентов Qt6
find_package(Qt6 REQUIRED COMPONENTS Core Widgets)

# Настройка автоматического подключения Qt модулей
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

# Создание исполняемого файла
add_executable(myqtapp
    src/main.cpp
    src/mainwindow.cpp
    src/mainwindow.h
    resources/resources.qrc
)

# Подключение Qt модулей
target_link_libraries(myqtapp
    Qt6::Core
    Qt6::Widgets
)

# Установка целевых файлов
install(TARGETS myqtapp
    RUNTIME DESTINATION bin
    BUNDLE DESTINATION bin
)

Расширенная настройка для CPack

Добавим секцию CPack в наш CMakeLists.txt:

# Базовая информация о пакете
set(CPACK_PACKAGE_NAME "myqtapp")
set(CPACK_PACKAGE_VENDOR "My Company")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Modern Qt6 Application")
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR})
set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH})

# Настройки для DEB пакетов
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Developer <dev@example.com>")
set(CPACK_DEBIAN_PACKAGE_SECTION "utils")
set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional")
set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)

# Архитектура
if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
    set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
    set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "arm64")
else()
    set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE ${CMAKE_SYSTEM_PROCESSOR})
endif()

# Включение CPack
include(CPack)

Указание зависимостей

Для корректной работы вашего Qt6 приложения необходимо указать зависимости:

# Зависимости времени выполнения
set(CPACK_DEBIAN_PACKAGE_DEPENDS 
    "libc6 (>= 2.28), 
     libstdc++6 (>= 9), 
     libgcc-s1 (>= 4.2), 
     libqt6core6 (>= 6.2), 
     libqt6gui6 (>= 6.2), 
     libqt6widgets6 (>= 6.2),
     libgl1,
     libx11-6"
)

# Рекомендуемые пакеты (опционально)
set(CPACK_DEBIAN_PACKAGE_RECOMMENDS "qt6-qpa-plugins, libqt6svg6")

Работа с .desktop-файлами и иконками

.desktop-файл — это конфигурационный файл в системах Linux, который используется для создания и управления ярлыками приложений в графическом интерфейсе пользователя. Он содержит всю необходимую информацию для корректного отображения и запуска программы.

Основные функции

  • Создание ярлыков приложений
  • Управление отображением программ в меню
  • Настройка иконок приложений
  • Определение способов запуска
  • Организация категорий приложений

Структура файла

Файл .desktop имеет четкую структуру и содержит следующие основные элементы:

  • [Desktop Entry] — заголовок основного раздела
  • Name — название приложения
  • Comment — краткое описание
  • Exec — команда для запуска
  • Icon — путь к иконке
  • Type — тип записи (например, Application)
  • Categories — категории приложения
  • Terminal — необходимость запуска в терминале
  • StartupNotify — отображение уведомления о запуске

Как интегрировать .desktop файл в CMake:

# Создание .desktop файла
configure_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/packaging/myqtapp.desktop.in
    ${CMAKE_CURRENT_BINARY_DIR}/myqtapp.desktop
    @ONLY
)

# Установка .desktop файла
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/myqtapp.desktop
    DESTINATION share/applications
)

# Установка иконок
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/icons/myqtapp.png
    DESTINATION share/icons/hicolor/48x48/apps
)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/icons/myqtapp.svg
    DESTINATION share/icons/hicolor/scalable/apps
)

Шаблон .desktop файла (myqtapp.desktop.in):

[Desktop Entry]
Version=1.0
Type=Application
Name=@CPACK_PACKAGE_NAME@
Comment=@CPACK_PACKAGE_DESCRIPTION_SUMMARY@
Exec=myqtapp
Icon=myqtapp
Categories=Utility;
Terminal=false
StartupWMClass=myqtapp

Генерация пакета

Теперь можно сгенерировать DEB пакет:

# Сборка проекта
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j$(nproc)

# Генерация пакета
cpack -G DEB

Лучшие практики и рекомендации

  1. Версионирование: Используйте семантическое версионирование для пакетов
  2. Зависимости: Тщательно тестируйте зависимости на разных системах
  3. Подписи: Рассмотрите возможность подписи пакетов для официальных репозиториев
  4. Тестирование: Всегда тестируйте пакеты в чистых окружениях

Заключение

CPack предоставляет мощный и гибкий способ создания DEB пакетов для C++/Qt приложений. Современные возможности CMake в сочетании с Qt6 и стандартом C++17 позволяют создавать качественные пакеты, готовые к распространению. Освоив эти техники, вы сможете эффективно доставлять свои приложения пользователям Debian-based систем.

Следующим шагом может стать настройка автоматической сборки пакетов в CI/CD системе и создание собственного репозитория для распространения вашего приложения.

Последние статьи