После того как мы освоили создание пакетов с отладочными символами (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
Лучшие практики и рекомендации
- Версионирование: Используйте семантическое версионирование для пакетов
- Зависимости: Тщательно тестируйте зависимости на разных системах
- Подписи: Рассмотрите возможность подписи пакетов для официальных репозиториев
- Тестирование: Всегда тестируйте пакеты в чистых окружениях
Заключение
CPack предоставляет мощный и гибкий способ создания DEB пакетов для C++/Qt приложений. Современные возможности CMake в сочетании с Qt6 и стандартом C++17 позволяют создавать качественные пакеты, готовые к распространению. Освоив эти техники, вы сможете эффективно доставлять свои приложения пользователям Debian-based систем.
Следующим шагом может стать настройка автоматической сборки пакетов в CI/CD системе и создание собственного репозитория для распространения вашего приложения.
Последние статьи
Домашний инференс — достижимо?
В настоящее время использование LLM для генерации кода, как на работе, так и в пет проектах становится нормой. LLM перестают…
Построение модульных проектов на C#: от монолита к гибкой архитектуре
Введение: Почему модульность — не роскошь, а необходимость Модульная архитектура в C# — это не просто модный тренд, а практический подход…
Кросплатформенные CLI приложения на C#: выбор инструментов, особенности и сравнение с альтернативами
Введение: Почему C# для кросплатформенных CLI? В первую очередь — это из-за минимального порога входа. Ну нужно разбираться в GUI-фреймворках,…