Сборка пакета с нуля: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
 
(не показаны 23 промежуточные версии 15 участников)
Строка 1: Строка 1:
[[Категория:HOWTO]]
[[Категория:Руководства]]
{{Stub}}
{{Stub}}
{{Note|На данной вики есть еще статья [[Сборка пакетов start]] из проекта [[Developer_start|Начинающему разработчику]]}}
{{Note|На данной вики ещё есть статья [[Сборка пакетов (etersoft-build-utils)]], предлагающая минимальный порог вхождения в процесс сборки.}}


Данное руководство покажет, как правильно собрать пакет RPM в [[Sisyphus]] с нуля в инфраструктуре [[Gear]] и [[git.alt]], имея только исходный код пакета, и [[Join|права мейнтейнера]] на '''git.alt'''. В качестве примера опакетим [http://qt.nokia.com/products/qt-addons/mobility/ Qt Mobility], чтобы закрыть запрос на сборку в багзилле: [https://bugzilla.altlinux.org/25111 https://bugzilla.altlinux.org/25111].
Данное руководство покажет, как правильно собрать пакет RPM в [[Sisyphus]] с нуля в инфраструктуре [[Gear]] и [[git.alt]], имея только исходный код пакета, и [[Join|права мейнтейнера]] на '''git.alt'''. В качестве примера опакетим [http://sourceforge.net/projects/kchildlock/ KChildlock], чтобы закрыть запрос на сборку в багзилле: [https://bugzilla.altlinux.org/25796 https://bugzilla.altlinux.org/25796].


== Введение ==
== Введение ==
Строка 11: Строка 11:
# У вас установлен дистрибутив ALT Linux;
# У вас установлен дистрибутив ALT Linux;
# Есть желание собрать пакет правильно, а не для единичного случая;
# Есть желание собрать пакет правильно, а не для единичного случая;
# Вы носите гордое звание «мейнтейнер ALT Linux Team», что подразумевает наличие электронных ключей и доступа к инфраструктуре [[git.alt]]
# Вы носите гордое звание [[Руководство_начинающего_мейнтейнера_ALT_Linux_Team|«мейнтейнер ALT Linux Team»]], что подразумевает наличие электронных ключей и доступа к инфраструктуре [[git.alt]]


Третий пункт необязателен для новичков, которые просто хотят собрать пакет правильно для себя.
Третий пункт необязателен для новичков, которые просто хотят собрать пакет правильно для себя.
Строка 21: Строка 21:
* Собранный двоичный пакет (имеет расширение вида ''<архитектура>.rpm''). В качестве архитектуры может быть i586, x86_64 или noarch. Такие пакеты можно устанавливать командой <pre>rpm -Uvh package...rpm</pre>
* Собранный двоичный пакет (имеет расширение вида ''<архитектура>.rpm''). В качестве архитектуры может быть i586, x86_64 или noarch. Такие пакеты можно устанавливать командой <pre>rpm -Uvh package...rpm</pre>


Подробную информацию по структуре RPM и сборке с помощью команды rpm можно найти в [http://www.rpm.org/max-rpm/ Maximum RPM].
Подробную информацию по структуре RPM и сборке с помощью команды rpm можно найти в [http://ftp.rpm.org/max-rpm/ Maximum RPM].
 


Однако для сборки через rpmbuild возникают очевидные сложности:
Однако для сборки через rpmbuild возникают очевидные сложности:
Строка 32: Строка 31:




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


* [[Hasher]] для сборки в изолированном окружении. В chroot ставится базовый комплект пакетов и пакеты, необходимые для сборки (поле BuildRequires в спеке). Если какой-то пакет для сборки не указан в спеке, то появится ошибка. Так обеспечивается чистота сборки. Обратной стороной является необходимость иметь доступ к репозиторию, так как пакеты ставятся при каждой сборке в Hasher.
* [[Hasher]] для сборки в изолированном окружении. В chroot ставится базовый комплект пакетов и пакеты, необходимые для сборки (поле BuildRequires в спеке). Если какой-то пакет для сборки не указан в спеке, то появится ошибка. Так обеспечивается чистота сборки. Обратной стороной является необходимость иметь доступ к репозиторию, так как пакеты ставятся при каждой сборке в Hasher.
Строка 41: Строка 40:
Для сборки нам потребуются следующие компоненты:
Для сборки нам потребуются следующие компоненты:


* Любой удобный текстовый редактор (наиболее удобными является Vim и Emacs);
* Любой удобный текстовый редактор (наиболее удобными являются Vim и Emacs);
* Система управления версиями [[Git]]
* Система управления версиями [[Git]]
* Сборочная среда [[Hasher]]
* Сборочная среда [[Hasher]]
Строка 47: Строка 46:
* Доступ к [[Branches|репозиторию пакетов]]
* Доступ к [[Branches|репозиторию пакетов]]


Для этого [[Управление пакетами|настройте репозитории]] и установите пакеты build-environment и gear:
Для этого [[Управление пакетами|настройте репозитории]] и установите пакеты:


  apt-get install build-environment gear
  apt-get install rpm-build hasher gear


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


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


=== Окружение Git ===
=== Окружение Git ===
Для идентификации Вашего ключа, Вашего имени, адреса электронной почты введите:


  git config --global user.name 'Andrey Cherepanov'
  git config --global user.name 'Andrey Cherepanov'
  git config --global user.email 'cas@altlinux.org'
  git config --global user.email 'cas@altlinux.org'
  git config --global user.signingkey 'A9EBF131'
  git config --global user.signingkey 'A9EBF131'
или
gpg --gen-key


Измените в зависимости от ваших параметров. Третья команда задаёт идентификатор вашего GPG-ключа для подписи:
Измените в зависимости от ваших параметров. Третья команда задаёт идентификатор вашего GPG-ключа для подписи:
Строка 85: Строка 89:
  [cas@cas ~]$ LANG=C gpg --fingerprint A9EBF131 | grep 'fingerprint =' | tr -d ' ' | cut -d= -f2
  [cas@cas ~]$ LANG=C gpg --fingerprint A9EBF131 | grep 'fingerprint =' | tr -d ' ' | cut -d= -f2
  A424A3962331FDD2748BC8B34863C0F4A9EBF131
  A424A3962331FDD2748BC8B34863C0F4A9EBF131
или
[cas@cas ~]$ gpg --fingerprint A9EBF131 | sed -n '/.*=/{s/.*=/%_gpg_name\t/;s/ //gp}'
%_gpg_name A424A3962331FDD2748BC8B34863C0F4A9EBF131


== Окружение Hasher ==
== Окружение Hasher ==
Строка 110: Строка 117:
  mount=/dev/pts,/proc
  mount=/dev/pts,/proc


Соответственно, USER должен быть такой же, как заведён в ''hasher-useradd'', target — указывать на архитектуру собираемый пакетов.
Соответственно, USER должен быть такой же, как заведён в ''hasher-useradd'', target — указывать на архитектуру собираемых пакетов.


== Подготовка репозитория Git ==
== Подготовка репозитория Git ==
Репозиторий Git создать очень просто. Для этого создадим каталог (имена пакетов лучше указывать в нижнем регистре, поэтому наш пакет для проекта будет называться '''kchildlock'''), перейдём в него и запустим '''git init''':
mkdir kchildlock
cd kchildlock
git init .


== Написание .gear/rules ==
== Написание .gear/rules ==
Строка 127: Строка 140:


* [[Краткое руководство по сборке пакета]]
* [[Краткое руководство по сборке пакета]]
* Лекция Георгия Курячего "Демонстрация сборки пакета" (видео, ogv): [http://esyr.name/video/uneex/uneex_09_12_16.ogv ]
* [http://uneex.ru/LecturesCMC/PackageMaintaining2009/Video Лекции Георгия Курячего] на данную тему
** [http://esyr.name/video/uneex/uneex_09_12_16.ogv "Демонстрация сборки пакета"] (видео, ogv)
* [[О стратегии сборки RPM пакетов]]
{{Category navigation|title=Сборка пакетов|category=Сборка пакетов|sortkey={{SUBPAGENAME}}}}

Текущая версия от 22:42, 16 октября 2024

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

Ссылки