Сборка пакета с нуля

Материал из ALT Linux Wiki
Stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.
Примечание: На данной вики есть еще статья Сборка пакетов start из проекта Начинающему разработчику
Примечание: На данной вики ещё есть статья Сборка пакетов (etersoft-build-utils), предлагающая минимальный порог вхождения в процесс сборки.


Данное руководство покажет, как правильно собрать пакет RPM в Sisyphus с нуля в инфраструктуре Gear и git.alt, имея только исходный код пакета, и права мейнтейнера на git.alt. В качестве примера опакетим KChildlock, чтобы закрыть запрос на сборку в багзилле: https://bugzilla.altlinux.org/25796.

Введение

Для сборки пакетов подразумеваются следующие начальные условия:

  1. У вас установлен дистрибутив ALT Linux;
  2. Есть желание собрать пакет правильно, а не для единичного случая;
  3. Вы носите гордое звание «мейнтейнер 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 возникают очевидные сложности:

  1. Необходимо вручную удовлетворить сборочные зависимости для сборки (поставить компилятор, включаемые файлы, библиотеки). При большом количестве собираемых пакетов система засоряется.
  2. Для сборки пакета нужно сформировать .src.rpm из файлов, разбросанных по разным каталогам (по умолчанию, это подкаталоги SOURCE, SPECS и подкаталоги для сборки в ~/RPM).
  3. Файлы с исходным кодом должны лежать в упакованном виде, что делает трудоёмким процесс изготовления патчей.
  4. На рабочей системе можно упустить необходимое и достаточное количество зависимостей.


Чтобы избежать этих сложностей, в ALT Linux Team было придумано две технологии:

  • Hasher для сборки в изолированном окружении. В chroot ставится базовый комплект пакетов и пакеты, необходимые для сборки (поле BuildRequires в спеке). Если какой-то пакет для сборки не указан в спеке, то появится ошибка. Так обеспечивается чистота сборки. Обратной стороной является необходимость иметь доступ к репозиторию, так как пакеты ставятся при каждой сборке в Hasher.
  • Gear для сборки пакетов из репозитория Git. В этом случае все файлы лежат в распакованном виде и в src.rpm упаковываются по правилам, определённым в .gear/rules. Это позволяет работать сразу с содержимым, быстро делать патчи, вести историю изменений и обмениваться изменениями при коллективной разработке.

Установка пакетов для сборки

Для сборки нам потребуются следующие компоненты:

  • Любой удобный текстовый редактор (наиболее удобными являются Vim и Emacs);
  • Система управления версиями Git
  • Сборочная среда Hasher
  • Инфраструктура Gear
  • Доступ к репозиторию пакетов

Для этого настройте репозитории и установите пакеты:

apt-get install rpm-build hasher gear

Будут установлены с зависимостями все необходимые пакеты для опакечивания и сборки.

Настройка среды

Окружение 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

Ссылки