Ранее мы уже многократно описывали алгоритмы сборки RPM пакетов, однако делали это непосредственно внутри установленной системы при помощи прямого вызова инструмента rpmbuild. Существует и другой, более правильный, на наш взгляд, метод — mock.
Подготовка среды
Для начала нам потребуется установить и подготовить среду к работе. Установим сам mock, а также ряд необязательных, но необходимых для наших целей компонентов:
sudo dnf install mock rpmdevtools rpm-build
Если для сборки пакета нам потребуются не только базовые репозитории Fedora, но и RPMFusion, потребуется добавить готовые конфиги и для этого сценария:
sudo dnf install mock-rpmfusion-free
Получение прав на сборку
По умолчанию использовать mock имеют право только те пользователи, которые состоят в одноимённой группе, созданной при установке среды.
Первым делом необходимо добавить свою учётную запись в группу mock. Это можно сделать при помощи usermod:
sudo usermod -a -G mock $(whoami)
Теперь выполним повторную инициализацию пользовательского сеанса с регистрацией в новой группе (в качестве альтернативы можно просто выйти и повторно войти в систему):
newgrp mock
Подготовка пакета к сборке
Для запуска сборки в mock, мы должны использовать пакет с исходными текстами *.src.rpm (SRPM).
При отсутствии готового к сборке SRPM и наличии только SPEC-файла, нам потребуется сначала его сгенерировать.
Создадим базовую структуру каталогов rpmbuild для текущего пользователя:
rpmdev-setuptree
Загрузим все исходники, указанные внутри SPEC-файла, улититой spectool (они будут загружены в каталог ~/rpmbuild/SOURCES/):
spectool -g -R имя_пакета.spec
Создадим SRPM-пакет:
rpmbuild -bs имя_пакета.spec
Итоговый SRPM будет лежать в каталоге ~/rpmbuild/SRPMS/.
Запуск сборки пакета в mock
Итак, у нас есть пакет с исходниками и спеком — SRPM — поэтому приступим непосредственно к сборке:
mock -r fedora-$(rpm -E %fedora)-$(uname -m)-rpmfusion_free --rebuild ~/rpmbuild/SRPMS/имя_пакета*.src.rpm
В этом примере мы собираем пакет для текущей используемой версии Fedora ($(rpm -E %fedora)), текущей платформы ($(uname -m)) с добавлением поддержки репозитория RPMFusion во время сборки (-rpmfusion_free).
Сборка для иных версий Fedora и платформ
Если необходимо собрать пакет для другой версии Fedora или другой архитектуры, то сделать это очень просто. Для начала узнаем какие файлы конфигурации у нас установлены:
ls -l /etc/mock/*.cfg
Данные файлы конфигурации содержат список репозиториев и тулчейнов, которые будут использоваться при сборке. Необходимый конфигурационный файл следует указать после параметра -r без расширения. Если он не указан, то будет использоваться /etc/mock/default.cfg, который является симлинком. Допускается удалить данный симлинк и создать на его месте свой собственный конфиг по умолчанию (в качестве примера можно взять любой из существующих (это обычные текстовые файлы)).
Для Fedora 25 для архитектуры i386 (32-бита) без подключения RPMFusion:
mock -r fedora-25-i386 --rebuild ~/rpmbuild/SRPMS/имя_пакета*.src.rpm
Для Fedora 25 для архитектуры x86_64 (64-бита) с подключением RPMFusion:
mock -r fedora-25-x86_64-rpmfusion_free --rebuild ~/rpmbuild/SRPMS/имя_пакета*.src.rpm
Получение результата
Сборка будет происходить внутри создаваемого chroot окружения и никак не затронет основную систему. По её окончании временные файлы будут уничтожены.
Mock располагает свои файлы в следующих каталогах:
- /etc/mock — конфигурационные файлы;
- /var/cache/mock — кэш пакетов dnf (может быть очищен пользователем);
- /var/lib/mock — каталог хранения chroot окружений и результатов сборки (также может быть очищен пользователем).
По окончании работы собранные RPM пакеты, а также полные логи могут быть найдены в каталоге /var/lib/mock/ID_окружения/result/.
Чем конкретно этот способ сборки лучше старого?
Основные отличия: