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 — пакеты, необходимые для сборки. Так как исходный код написан на python3, необходимо указать пакет 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.
Аналогично создается каталог %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:
%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 и hasher:
$ gear-hsh ~/.hasher --no-sisyphus-check --commit –v

Примечание

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