Внимание!
Сайт Jurik-Phys.Net сменил адрес: Jurik-Phys.Net.Ru
Сборка deb пакета на примере сервиса pingfinder-msgd
Пакет pingfinder-msgd должен устанавливать:
/usr/bin/pingfinder-msgd
/usr/lib/systemd/system/pingfinder-msgd.service
/usr/share/doc/pingfinder-msgd/examples/
/var/lib/pingfinder/msgd/
Также в систему должен быть добавлен пользователь pingfinder для выполнения сервиса, пакет должен иметь зависимость от используемой библиотеки Qt.
На Debian:
# apt install debhelper dpkg-dev devscripts
debian/ ├── source │ └── format ├── changelog ├── control ├── install ├── pingfinder-msgd.postinst ├── pingfinder-msgd.postrm ├── pingfinder-msgd.service └── rules
Если Debian packaging не найдёт файл debian/source/format, то будет использовать формат исходного пакета 1.0, для современного Debian-пакета предпочтительно использовать 3.0 (quilt)
3.0 (quilt)
Важно. Формат 3.0 (quilt) предполагает наличие исходного архива проекта .orig.tar.xz, без него сборка не состоится. На первых этапах можно обойтись версией исходного пакета 1.0:
1.0
Для автоматического формирования файла debian/changelog используется скрипт generate-changelog.sh, который формирует changelog на основании истории Git, а версию пакета берёт из CMakeLists.txt.
Это один из главных файлов пакета. В нём описываются сам пакет и его зависимости.
Source: pingfinder-msgd
Section: misc
Priority: optional
Maintainer: Yury Ovsyannikov <jurik.phys@gmail.com>
Build-Depends: debhelper-compat (= 13),
cmake,
qt6-base-dev
Standards-Version: 4.7.0
Rules-Requires-Root: no
Package: pingfinder-msgd
Architecture: any
Depends: ${shlibs:Depends},
${misc:Depends}
adduser
Description: PingFinder message daemon
Background service for scheduling and sending SMS messages to
PingFinder clients.
Здесь:
Build-Depends - зависимости, необходимые для сборки пакета.Depends: ${shlibs:Depends} - зависимости установленного бинарника. Debian автоматически подставит необходимые runtime-библиотеки, включая Qt, если они действительно используются ELF-бинарником.Standards-Version: 4.7.0 - декларация о том, какой версии стандартов Debian Policy соответствует пакет.adduser нужен для корректного создания системного пользователя Debian-способомВ этом файле необходимо указать, какие дополнительные файлы требуется поместить в пакет.
examples/config/clients.json usr/share/doc/pingfinder-msgd/examples examples/config/transport.json usr/share/doc/pingfinder-msgd/examples
Необходимо отметить, что в общем случае запись вида debian/pingfinder-msgd.service usr/lib/systemd/system не требуется для помещения systemd юнита в нужное место т.к., dh_installsystemd сам его обработает и поместит в требуемое место файловой иерархии.
В противном случае, один и тот же service-файл попадает в .deb дважды, вызывая проблемы при установке пакета:
dpkg-deb -c pingfinder-msgd_0.0.3-1_amd64.deb | grep 'pingfinder-msgd.service' -rw-r--r-- root/root 230 2026-09-24 15:06 ./lib/systemd/system/pingfinder-msgd.service -rw-r--r-- root/root 230 2026-09-24 15:06 ./usr/lib/systemd/system/pingfinder-msgd.service
Исполняемый скрипт debian/pingfinder-msgd.postinst выполняет настройку окружения pingfinder-msgd после установки или обновления пакета:
pingfinder, если они ещё не существуют;.msgd-user-created, позволяющий определить, был ли пользователь создан данным пакетом;/etc/pingfinder/msgd/ — конфигурация сервиса;/var/lib/pingfinder/msgd/ — постоянные данные;▸ Исходный код pingfinder-msgd.postinst
▾ Исходный код скрипта pingfinder-msgd.postinst
#!/bin/sh set -e USER_NAME="pingfinder" CONFIG_DIR="/etc/pingfinder/msgd" RUNTIME_DIR="/var/lib/pingfinder/msgd" STATE_DIR="/var/lib/pingfinder" USER_CREATED_MARKER="${STATE_DIR}/.msgd-user-created" case "$1" in configure) if ! getent passwd "$USER_NAME" >/dev/null 2>&1; then adduser \ --system \ --group \ --no-create-home \ --disabled-login \ "$USER_NAME" mkdir -p "$STATE_DIR" touch "$USER_CREATED_MARKER" chmod 600 "$USER_CREATED_MARKER" fi install -d \ -o "$USER_NAME" \ -g "$USER_NAME" \ -m 700 \ "$CONFIG_DIR" install -d \ -o "$USER_NAME" \ -g "$USER_NAME" \ -m 700 \ "$RUNTIME_DIR" ;; esac exit 0
Исполняемый скрипт debian/pingfinder-msgd.postrm выполняет действия после удаления или полного удаления (purge) пакета:
/var/lib/pingfinder/msgd/;/etc/pingfinder/msgd/;pingfinder, только если они были созданы этим пакетом;.msgd-user-created;/var/lib/pingfinder, если после этого он пуст;▸ Исходный код pingfinder-msgd.posrm
▾ Исходный код скрипта pingfinder-msgd.postrm
#!/bin/sh set -e USER_NAME="pingfinder" CONFIG_DIR="/etc/pingfinder/msgd" RUNTIME_DIR="/var/lib/pingfinder/msgd" STATE_DIR="/var/lib/pingfinder" USER_CREATED_MARKER="${STATE_DIR}/.msgd-user-created" case "$1" in remove) # Runtime data is not preserved. rm -rf "$RUNTIME_DIR" ;; purge) # Configuration is removed only on purge. rm -rf "$CONFIG_DIR" # Remove the user only if this package created it. if [ -f "$USER_CREATED_MARKER" ]; then if getent passwd "$USER_NAME" >/dev/null 2>&1; then deluser --system "$USER_NAME" fi if getent group "$USER_NAME" >/dev/null 2>&1; then delgroup --system "$USER_NAME" fi fi rm -f "$USER_CREATED_MARKER" # Remove the state directory if it is now empty. rmdir "$STATE_DIR" 2>/dev/null || true ;; esac exit 0
Systemd-юнит pingfinder-msgd.service служит для запуска и управления демоном pingfinder-msgd:
/usr/bin/pingfinder-msgd от имени пользователя и группы pingfinder;▸ Исходный код pingfinder-msgd.service
▾ Исходный код скрипта pingfinder-msgd.service
[Unit] Description=PingFinder Message Daemon After=network.target [Service] Type=simple User=pingfinder Group=pingfinder ExecStart=/usr/bin/pingfinder-msgd Restart=on-failure RestartSec=600 [Install] WantedBy=multi-user.target
Это основной сценарий сборки Debian-пакета. Для CMake современный минимальный вариант:
#!/usr/bin/make -f %: dh $@
Необходимо помнить, что перед dh $@ должен быть TAB, а не пробел. Также файл необходимо сделать исполняемым:
chmod +x debian/rules
На этом этапе debhelper сам выполнит стандартные этапы с использованием CMake:
configure build install strip generate dependencies build .deb ...
Чтобы Debian packaging смог установить приложение, CMake должен иметь install rules:
install(TARGETS pingfinder-msgd RUNTIME DESTINATION bin )
Поскольку для сборки пакета уже требуется наличие файла changelog, то генерацию этого файла надо вызывать до основного этапа сборки deb пакета.
Реализовать это можно с помощью скрипта scripts/build-deb.sh:
#!/bin/bash REPO_ROOT=$(git rev-parse --show-toplevel) "${REPO_ROOT}/scripts/generate-changelog.sh" cd "$REPO_ROOT" dpkg-buildpackage -us -uc
Сделать исполняемым:
chmod +x build-deb.sh
В корне проекта необходимо выполнить:
dpkg-buildpackage -T clean