Сборка пакета с нуля
Данное руководство покажет, как правильно собрать пакет RPM в Sisyphus с нуля в инфраструктуре Gear и git.alt, имея только исходный код пакета, и права мейнтейнера на git.alt. В качестве примера опакетим KChildlock, чтобы закрыть запрос на сборку в багзилле: https://bugzilla.altlinux.org/25796.
Введение
Для сборки пакетов подразумеваются следующие начальные условия:
- У вас установлен дистрибутив ALT Linux;
- Есть желание собрать пакет правильно, а не для единичного случая;
- Вы носите гордое звание «мейнтейнер ALT Linux Team», что подразумевает наличие электронных ключей и доступа к инфраструктуре git.alt
Третий пункт необязателен для новичков, которые просто хотят собрать пакет правильно для себя.
В ALT Linux используется формат пакетов RPM, который представляет собой архив, содержащий архив с устанавливаемыми или собираемыми файлами и заголовок с метаинформацией (например, название, версия, группа и т.п.). Различают два вида пакетов RPM:
- Пакет с исходным кодом (имеет расширение .src.rpm). Такой пакет содержит архив (один или несколько) с исходным кодом, файл Spec (далее — просто спек) и, возможно, разнообразные патчи и дополнения. Пакет src.rpm можно использовать только для сборки двоичных пакетов, но не установки. Сборка осуществляется командой:
rpmbuild --rebuild package...src.rpm
- Собранный двоичный пакет (имеет расширение вида <архитектура>.rpm). В качестве архитектуры может быть i586, x86_64 или noarch. Такие пакеты можно устанавливать командой
rpm -Uvh package...rpm
Подробную информацию по структуре RPM и сборке с помощью команды rpm можно найти в Maximum RPM.
Однако для сборки через rpmbuild возникают очевидные сложности:
- Необходимо вручную удовлетворить сборочные зависимости для сборки (поставить компилятор, включаемые файлы, библиотеки). При большом количестве собираемых пакетов система засоряется.
- Для сборки пакета нужно сформировать .src.rpm из файлов, разбросанных по разным каталогам (по умолчанию, это подкаталоги SOURCE, SPECS и подкаталоги для сборки в ~/RPM).
- Файлы с исходным кодом должны лежать в упакованном виде, что делает трудоёмким процесс изготовления патчей.
- На рабочей системе можно упустить необходимое и достаточное количество зависимостей.
Чтобы избежать этих сложностей, в ALT Linux Team было придумано две технологии:
- Hasher для сборки в изолированном окружении. В chroot ставится базовый комплект пакетов и пакеты, необходимые для сборки (поле BuildRequires в спеке). Если какой-то пакет для сборки не указан в спеке, то появится ошибка. Так обеспечивается чистота сборки. Обратной стороной является необходимость иметь доступ к репозиторию, так как пакеты ставятся при каждой сборке в Hasher.
- Gear для сборки пакетов из репозитория Git. В этом случае все файлы лежат в распакованном виде и в src.rpm упаковываются по правилам, определённым в .gear/rules. Это позволяет работать сразу с содержимым, быстро делать патчи, вести историю изменений и обмениваться изменениями при коллективной разработке.
Установка пакетов для сборки
Для сборки нам потребуются следующие компоненты:
- Любой удобный текстовый редактор (наиболее удобными являются Vim и Emacs);
- Система управления версиями Git
- Сборочная среда Hasher
- Инфраструктура Gear
- Доступ к репозиторию пакетов
Для этого настройте репозитории и установите пакеты build-environment и gear:
apt-get install build-environment gear
Будут установлены с зависимостями все необходимые пакеты для опакечивания и сборки N.B. К 2022 году пакет build-environment в репах отсутствует, похоже больше не нужен.
Настройка среды
Окружение Git
Для идентификации Вашего ключа, Вашего имени, адреса электронной почты введите:
git config --global user.name 'Andrey Cherepanov' git config --global user.email 'cas@altlinux.org' git config --global user.signingkey 'A9EBF131'
или
gpg --gen-key
Измените в зависимости от ваших параметров. Третья команда задаёт идентификатор вашего GPG-ключа для подписи:
[cas@cas ~]$ gpg --list-keys | grep -B 1 'Andrey Cherepanov' pub 1024D/A9EBF131 2007-03-13 uid Andrey Cherepanov (ALT Linux Team) <cas@altlinux.ru>
или
[cas@cas ~]$ gpg --list-secret-keys ------------------------------ sec 1024D/A9EBF131 2007-03-13 uid Andrey Cherepanov (ALT Linux Team) <cas@altlinux.ru>
Окружение RPM
Создайте файл ~/.rpmmacros следующего содержания (конечно, заменив ключ и имя мейнтейнера на свои):
%packager Andrey Cherepanov <cas@altlinux.org> %_gpg_name A424A3962331FDD2748BC8B34863C0F4A9EBF131
В %_gpg_name указывается отпечаток ключа (а не краткий идентификатор, как для Git). Получить его можно командой:
[cas@cas ~]$ LANG=C gpg --fingerprint A9EBF131 | grep 'fingerprint =' | tr -d ' ' | cut -d= -f2 A424A3962331FDD2748BC8B34863C0F4A9EBF131
или
[cas@cas ~]$ gpg --fingerprint A9EBF131 | sed -n '/.*=/{s/.*=/%_gpg_name\t/;s/ //gp}' %_gpg_name A424A3962331FDD2748BC8B34863C0F4A9EBF131
Окружение Hasher
Для начала создайте под правами root двух служебных пользователей для сборочницы (среды сборки Hasher):
[cas@ham1 ~]$ su - Password: [root@ham1 ~]# hasher-useradd cas Adding user cas to group cas_a Adding user cas to group cas_b Adding user cas to group hashman
Вместо «cas» нужно указать существующего пользователя на машине, где будет развёрнута сборочная среда.
Далее для простейшей конфигурации Hasher потребуется создать каталог ~/.hasher со следующими файлами:
~/.hasher/config
USER=cas workdir="/tmp/.private/cas/" target=i586 packager="`rpm --eval %packager`" apt_config="$HOME/.hasher/apt.conf" mount=/dev/pts,/proc
Соответственно, USER должен быть такой же, как заведён в hasher-useradd, target — указывать на архитектуру собираемых пакетов.
Подготовка репозитория Git
Репозиторий Git создать очень просто. Для этого создадим каталог (имена пакетов лучше указывать в нижнем регистре, поэтому наш пакет для проекта будет называться kchildlock), перейдём в него и запустим git init:
mkdir kchildlock cd kchildlock git init .
Написание .gear/rules
Импорт исходного кода
Написание спека
Сборка в Hasher
Отправка в git.alt
Ссылки
- Краткое руководство по сборке пакета
- Лекции Георгия Курячего на данную тему
- "Демонстрация сборки пакета" (видео, ogv)
- О стратегии сборки RPM пакетов