Product SiteDocumentation Site

Глава 9. Примеры сборки пакетов

9.1. Пакет с исходными текстами на Python
9.1.1. Подготовка пространства
9.1.2. Написание spec-файла и правил gear
9.2. Пакет с исходными текстами на C++
Для примера сборки пакета используется программа для вывода системных уведомлений о текущей дате и времени. Ссылки на GitHub-репозитории с исходными текстами программ:
  • C++: Notification — https://github.com/MakDaffi/notification;
  • Python: DBusTimer_Example — https://github.com/danila-Skachedubov/DBusTimer_example.
Структура репозиториев для программ Notification и DBusTimer_Example идентична: главный файл (.cpp или .py) и два юнита systemd (.service и .timer):
  • файл .timer — юнит systemd, который при истечении заданного времени вызывает скрипт .py, выводящий уведомление о дате и времени. После срабатывания таймер снова начинает отсчет времени до запуска скрипта;
  • файл .service — содержит описание, расположение скрипта .py и интерпретатора, который будет его обрабатывать.

9.1. Пакет с исходными текстами на Python

9.1.1. Подготовка пространства

В первую очередь необходимо склонировать репозиторий в рабочий каталог, используя команду git clone:
$ git clone https://github.com/danila-Skachedubov/DBusTimer_example.git

remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (9/9), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 9 (delta 1), reused 8 (delta 1), pack-reused 0
Receiving objects: 100% (9/9), done.
Resolving deltas: 100% (1/1), done
В рабочем каталоге появится каталог с названием проекта: DBusTimer_Example.
Перейдите в каталог DBusTimer_Example и создайте в нем каталог .gear:
$ cd DBusTimer_example
$ mkdir .gear
В каталоге .gear создайте два файла: файл правил для gear — rules и spec-файл — dbustimer.spec:
$ touch .gear/rules .gear/dbustimer.spec
Содержимое каталога DBusTimer_Example в результате выполненных действий:
$ ls -a1
.
..
.gear
.git
script_dbus.py
script_dbus.service
script_dbus.timer

9.1.2. Написание spec-файла и правил gear

Следующий этап сборки — это написание spec-файла и правил для gear.
Заполните файл .gear/rules следующим содержимым:
tar: .
spec: .gear/dbustimer.spec
Первая строка указывает, что проект будет упакован в .tar архив. Вторая строка задаёт путь к spec-файлу.
Далее необходимо заполнить spec-файл.
В заголовке spec-файла находятся секции Name, Version, Release, Summary, License, Group, BuildArch, BuildRequires, Source0.
Для данного примера можно заполнить секции заголовка следующим образом:
Name: dbustimer
Version: 0.4
Release: alt1

Summary: Display system time
License: GPLv3+
Group: Other
BuildArch: noarch

BuildRequires: rpm-build-python3
Стандартная схема Name-Version-Release, содержит имя пакета, его версию и релиз сборки. Поле Summary содержит краткое описание пакета. License — лицензия, под которой распространяется ПО (в данном случае — GPLv3+). Group — категория пакета. Так как это тестовый пакет, можно указать группу «Other». BuildRequires — пакеты, необходимые для сборки. Поскольку исходный код написан на Python 3, требуется пакет rpm-build-python3, который содержит макросы для сборки скриптов Python. Source0 — путь к архиву с исходниками (%name-%version.tar).
В основной части spec-файла описываются процесс сборки и преобразование исходных файлов.
В секции %description приводится краткое описание программы.
Секция %prep отвечает за подготовку к сборке. Макрос %setup распаковывает исходный код перед компиляцией. Пример заполнения полей %description и %prep:
%description
This program displays notifications about the system time with a frequency of one hour.

%prep
%setup -q
В секции %install указываются пути установки файлов. Чтобы не указывать пути установки файлов вручную, можно использовать предопределенные макросы. Например, %python3_sitelibdir_noarch раскрывается в путь /usr/lib/python3/site-packages. По этому пути будет создан каталог с именем пакета, в который будет помещен файл script_dbus.py с правами доступа 755. Аналогичная операция будет проведена с файлами script_dbus.timer и script_dbus.service. Они должны быть скопированы в каталог /etc/xdg/systemd/user. Так как макроса, раскрывающегося в данный каталог нет, можно использовать макрос %_sysconfdir, который раскрывается в путь /etc. Пример заполнения секции %install:
%install


mkdir -p \
    %buildroot%python3_sitelibdir_noarch/%name/
install -Dm0755 script_dbus.py \
    %buildroot%python3_sitelibdir_noarch/%name/

mkdir -p \
    %buildroot%_sysconfdir/xdg/systemd/user/
cp script_dbus.timer script_dbus.service \
    %buildroot%_sysconfdir/xdg/systemd/user/
Команда mkdir -p \ %buildroot%python3_sitelibdir_noarch/%name/ создает каталог dbustimer в окружении buildroot по пути /usr/lib/python3/site-packages.
Далее файл script_dbus.py копируется с правами 755 в каталог /usr/lib/python3/site-packages/dbustimer/ в окружении buildroot.
Аналогично создается каталог для systemd-юнитов %buildroot%_sysconfdir/xdg/systemd/user/, в который копируются файлы .service и .timer.
В секции %files описывается, какие файлы и каталоги с соответствующими атрибутами должны быть скопированы из дерева сборки в rpm-пакет, а затем будут копироваться в целевую систему при установке этого пакета. Все три файла из пакета будут распакованы по путям, описанным в секции %install. Пример заполнения секции %files:
%files
%python3_sitelibdir_noarch/%name/script_dbus.py
/etc/xdg/systemd/user/script_dbus.service
/etc/xdg/systemd/user/script_dbus.timer
В секции %changelog фиксируются изменения:
%changelog
* Thu Apr 13 2023 Danila Skachedubov <dan@altlinux.org> 0.4-alt1
- Update system
- Changed access rights
Итоговый spec-файл:
Name: dbustimer
Version: 0.4
Release: alt1

Summary: Display system time
License: GPLv3+
Group: Other
BuildArch: noarch

BuildRequires: rpm-build-python3

Source0: %name-%version.tar

%description
This program displays notifications about the system time with a frequency of one hour.

%prep
%setup

%install

mkdir -p \
    %buildroot%python3_sitelibdir_noarch/%name/
install -Dm0755 script_dbus.py \
    %buildroot%python3_sitelibdir_noarch/%name/

mkdir -p \
    %buildroot%_sysconfdir/xdg/systemd/user/
cp script_dbus.timer script_dbus.service \
    %buildroot%_sysconfdir/xdg/systemd/user/


%files
%python3_sitelibdir_noarch/%name/script_dbus.py
/etc/xdg/systemd/user/script_dbus.service
/etc/xdg/systemd/user/script_dbus.timer

%changelog
* Thu Apr 13 2023 Danila Skachedubov <dan@altlinux.org> 0.4-alt1
- Update system
- Changed access rights
После заполнения файлов добавьте их в git:
$ git add .gear/rules .gear/dbustimer.spec
После добавления файлов необходимо запустить сборку:
$ gear-hsh ~/.hasher --no-sisyphus-check --commit –v

Примечание

Hasher и git должны быть предварительно настроены.
Если сборка прошла успешно, пакет dbustimer-0.4-alt1.noarch.rpm будет находиться в каталоге ~/.hasher/repo/x86_64/RPMS.hasher/.