Linux сборка rpm пакета

Технология сборки пакетов RPM

Во многом эта статья повторяет статью Сборка_пакета_с_нуля, и возможно со временем их надо объединить.

Классическая сборка пакета rpm состоит из следующих этапов:

Нахождение исходного текста пакета

Обычно мы находим исходный текст программы. Часто исходный текст программы можно получить на официальном сайте программы.

Это может быть готовый архив в виде tar, упакованный каким-нибудь компрессором, типа gzip, bzip и т.п. Также, это может быть репозиторий git, cvs, меркурий и т.п.

В любом случае мы получаем каталог с текстом программы и инструкцией, как можно программу собрать.

Отдельным источником можно назвать пакет src.rpm или deb-src из другого дистрибутива. В этом случае можно «подсмотреть» как собирают этот пакет другие.

На этом этапе надо понять как в принципе собирается данный пакет.

Написание инструкции сборки пакета

На втором этапе, зная алгоритм сборки пакета, мы записываем алгоритм в виде spec-файла.

Сборку пакета из исходников можно разделить на следующие основные этапы:

  • распаковка исходного текста пакета и наложение патчей на него (например, исправляющие makefile пакета, чтобы он собирался не куда-нибудь в /opt , а каталог предназначенный для сборки пакета) (секция %prep);
  • компиляция и линковка программ пакета (секция %build);
  • размещение программ в каталог, который будет упаковываться в rpm (секция %install);
  • написание скриптов нестандартных действий, которые выполняются при установке и удалении пакета (секции %post и %postust);
  • сама упаковка пакета и проверка его «правильности» (верификация пакета).

Для тренировки сборки пакета, советую попробовать взять готовый пакет [1], готовый src.rpm можно взять из репозитория, например из Сизифа (ссылка скоро может устареть, в случае смены версии пакета) [2].

Непосредственная сборка пакета

Кстати, для генерации основы spec-файла, установите пакет genspec , запустите скрипт gensprec и ответьте на вопросы. А скрипт из пакета github2spec умеет создавать полный gear репозиторий для сборки пакета.

После того как вы написали спек и подготовили исходники, можно переходить непосредственно к сборке пакета.

Это лучше делать внутри хэшера, так как установка кучи необходимых для сборки программ, во-первых грозит безопасности вашей операционной системы, а во-вторых, засоряет её ненужными вам в дальнейшем пакетами.

Каждому этапу сборки можно привести опцию rpm, которая это выполняет:

rpmbuild -bp имя_спек_файла.spec 
rpm -bc имя_спек_файла.spec 
rpm -bc --short-circuit имя_спек_файла.spec 

разница состоит в том, что если запустить с ключом -bc, то rpm заново повторит распаковку пакета, а потом уже начнёт компиляцию. Если вы собираете пакет первый раз по шагам, то вы могли внести в исходный текст пакета исправления, которые можно потом оформить в патчи, то распаковка исходников заново уничтожит ваши исправления.

rpm -bi --short-circuit имя_спек_файла.spec 
rpm -ba --short-circuit имя_спек_файла.spec 
rpm -bs - имя_спек_файла.spec 

Для ключа bs не требуется параметр —short-circuit, так как он непосредственно упаковывает ваши исходники и патчи в src.rpm, не выполняя действий по распаковке, компиляции и установке пакета.

Читайте также:  Linux elementary os iso

Пример классической сборки пакета

Для всех примеров мы будем использовать пакет hello . Он есть и в репозитории и в git.altlinux.org https://git.altlinux.org/gears/h/hello.git.

Готовый src.rpm можно взять их сорцов Сизифа http://ftp.altlinux.org/pub/distributions/ALTLinux/Sisyphus/files/SRPMS/hello-2.10-alt1.1.src.rpm — ссылка может устареть с выходом новой версии пакета, поэтому текущую версию пакета, всегда можно найти здесь: https://packages.altlinux.org/ru/sisyphus/srpms/hello/rpms/

Допустим, мы скачали hello-2.10-alt1.1.src.rpm , устанавливаем его от имени пользователя:

$ rpm -ihv путь_до_каталога_с_файлом/hello-2.10-alt1.1.src.rpm 

В результате в каталоге пользователя ~/RPM/SPEC/ [2] появляется файл hello.spec, а в ~/RPM/SOURCE файл hello-2.10.tar.gz.

Теперь зайдем в каталог ~/RPM/SPEC/ и изучим содержание файла spec:

Шапка пакета — его описание, лицензия, откуда можно скачать исходник, или домашняя страница проекта, параметр BuildRequires указывает какой «нестандартный» пакет требуется для сборки:

Name: hello Version: 2.10 Release: alt1.1 Summary: GNU hello, THE greeting printing program Group: Development/C License: GPLv3+ Url: ftp://ftp.gnu.org/gnu/hello/ Source: %name-%version.tar.gz # explicitly added texinfo for info files BuildRequires: texinfo %description The GNU `hello' program produces a familiar, friendly greeting. It allows nonprogrammers to use a classic computer science tool which would otherwise be unavailable to them. Because it is protected by the GNU General Public License, users are free to share and change it. 

Описание распаковки исходников и наложение патчей (этап rpmbuild -bp):

Распаковывается первый исходник (Source — hello-2.10.targz) в каталог ~/RPM/BUILD/hello-2.10 .

Этап построения пакета (этап rpm -bc —short-circuit), выполняются команды autoreconf , configure , make с параметрами по умолчанию для сборки пакетов rpm:

%build %autoreconf %configure %make_build 

Этап перемещения пакетов в каталог упаковки (rpm -bi —short-circuit), выполняются команды make install и поиск файлов перевода на различные языки:

%install %makeinstall %find_lang %name 

Перечень файлов, которые должны войти в пакет (этап rpm -ba —short-circuit):

%files -f %name.lang %doc AUTHORS ChangeLog ChangeLog.O NEWS README THANKS TODO %doc %name-%version %_bindir/* %_infodir/* %_mandir/man?/* 

Перечень людей пересобиравших пакет и изменения в пакете:

%changelog * Thu Dec 03 2015 Igor Vlasenko 2.10-alt1.1 - NMU: added BR: texinfo . * Thu Oct 23 2003 Andrey Rahmatullin 2.1.1-alt1 - initial build 

Расшифровку макросов входящих в spec файл, можно получить выдав команду [3] :

Читайте также:  Linux подключить диск usb

Теперь попробуем собрать пакет hello в вашем текущем бранче, даём команду:

Скорей всего в вам выскочит сообщение, что для сборки пакета, нужно установить пакет texinfo :

# apt-get install texinfo 

Это просто для одного недостающего пакета, сложнее для установки «кучи» необходимых для сборки пакетов.

Для этого можно применить интересный приём:

результат сборки вы увидите в ~/RPM/SRPMS/ .

Далее настраиваем свой конфиг apt, что-бы он умел ставить пакеты, необходимые для сборки пакета указываем, где лежат пакеты src.rpm.

Например, у меня локальное зеркало Сизифа с источниками установки прописаны в файле /etc/apt/sources.list.d/10-local.list c следующим содержанием:

# local (ALT Linux) rpm [p10] file:/mnt/Arhiv_ext/Branch-p10/ x86_64 classic gostcrypto rpm [p10] file:/mnt/Arhiv_ext/Branch-p10/ noarch classic rpm [p10] file:/mnt/Arhiv_ext/Branch-p10/ x86_64-i586 classic rpm-src [p10] file:/mnt/Arhiv_ext/Branch-p10/ x86_64 classic rpm-src [p10] file:/mnt/Arhiv_ext/Branch-p10/ noarch classic 

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

Тогда можно установить пакеты, необходимые для сборки пакета hello , одной из команд:

(требуется установить etersoft-build-utils )

# apt-get build-dep hello.src.rpm 

Сборка внутри хэшера

Описанный выше способ сборки пакета, как уже описано выше, имеет один существенный недостаток — в живую систему приходится устанавливать пакеты, не нужные в обычной жизни, например для сборки пакета hello , требуется пакет texinfo .

Для сборки внутри хэшера, надо установить и настроить пакет hasher, кратко смотри Hasher быстрый старт, Hasher Faq.

Классическое использование хэшера

Классическое использование хэшера, это запуск его командой:

Возьмём для примера наш hello. src.rpm

Для начала настроим работу хэшера:

# hasher-useradd имя_вашего_пользователя 

В домашнем каталоге пользователя создаём каталог, имя которого начинается с точки [7] :

$ cd$ mkdir .hasher $ cd .hasher $ > config $ mcedit config

В файле ~.hasher/config прописываются значения опций пользователя по умолчанию. Эти опции можно изменить, указав их непосредственно в самой команде вызова хэшера, например:

def_repo=/home/$USER/hasher-repo install -d /tmp/private/$HOME/hasher ln -fs /tmp/private/$HOME/hasher /home/$HOME/hasher known_mountpoints=/dev/pts lock_nowait=1 apt-config=$HOME/apt/apt.conf.s64 if [ ! `uname -m` = x86_64 ]; then def_target=i586; fi 

Создаём файл ~/apt/apt.conf.s64 такого содержания:

Dir::Etc::main "/dev/null"; Dir::Etc::parts "/var/empty"; Dir::Etc::SourceParts "/var/empty"; Dir::Etc::sourcelist "/home/$USER/apt/sources.list.s64"; RPM::Ignore < "vim-plugin-vimruby"; >; 

И файл apt/sources.list.s64 , например, такого содержания:

rpm [p10] file:/mnt/Arhiv/Branch-p10/ x86_64 classic gostcrypto rpm [p10] file:/mnt/Arhiv/Branch-p10/ x86_64-i586 classic rpm [p10] file:/mnt/Arhiv/Branch-p10/ noarch classic 

Здесь /mnt/Arhiv/Branch-p10/ — путь для локального репозитория p10.

Создаем символьную ссылку на расположение хэшера, например, так:

$ ln -fs /tmp/private/$USER/hasher /home/$USER/hasher 

И теперь запускаем саму сборку в хэшере, заходим в каталог с файлом и даём команду:

В результате этой команды внутри хэшера соберётся пакет hello-2.10-alt1.1.x86_64.rpm , который мы увидим (при приведённом выше конфиге) в ~/hasher_repo .

В качестве примера приведу команду сбора 32 разрядного приложения в хэшере на 64-битной машине:

$ setarch i586 hsh -v --apt-config=$HOME/apt/apt.conf.s32 $HOME/hasher 

где apt/apt.conf.s32 — описание 32 битного репозитория.

Читайте также:  Canon lbp 1120 драйвер astra linux

Использование хэшера как изолированной среды сборки

То есть для сборки пакета hello , со своими патчами, мы можем собрать свою версию src.rpm командой:

И дальше собираем свой вариант hello:

Но гораздо интереснее, использовать хэшер на этапе изучения пакета. Устанавливаем «чистый» хэшер:

$ hsh --initroot --pkg-build-list=+mc,rpm-utils 

Кладём в hasher/in нужные исходники, заходим внутрь хэшера:

$ hsh-shell --mount=/dev/pts shell=mc 

Теперь копируем эти файлы в /usr/src/RPM/BUILD хэшера, и начинаем экспериментировать со сборкой пакета.

Расположив спек в /src/RPM/SPECS , а исходники в /src/RPM/SOURCE , можно внутри хэшера собирать пакеты «классическим» способом.

Для установки пакета внутрь пакета, нужно выйти из хэшера:

Сборка с использованием инструментов работы с git репозиториями

Git репозиторий, это удобное место для хранения исходного кода пакетов. Для работы с ними и для сборки из них rpm существует пакет gear.

Для примера рассмотрим сборку пакета hello из git репозитория https://git.altlinux.org/gears/h/hello.git.

Для начала склонируем git репозиторий в то место, где вы будете хранить свои рабочие исходники, например:

$ mkdir My_Repo (необязательно) $ cd My_Repo $ git clone https://git.altlinux.org/gears/h/hello.git

Заходим в каталог hello и изучаем его.

$ cd hello $ ls -al итого 24 drwxr-xr-x 5 writer writer 4096 мая 15 19:58 . drwxr-xr-x 32 writer writer 4096 мая 15 19:58 .. drwxr-xr-x 2 writer writer 4096 мая 15 19:58 .gear drwxr-xr-x 8 writer writer 4096 мая 15 19:58 .git drwxr-xr-x 11 writer writer 4096 мая 15 19:58 hello -rw-r--r-- 1 writer writer 1680 мая 15 19:58 hello.spec
$ cd .gear $ cat rules tar.gz: hello

Правило tar.gz: hello, указывает, что каталог hello упаковывается в hello.tar.gz.

И дадим команду из каталога hello:

И у нас в хэшере собирается пакет (для 64 битной архитектуры) hello-2.10-alt1.1.x86_64.rpm .

Примечания

  1. ↑ Для совсем начинающих две ссылкм
    • RPM-HOWTO
    • RPM-HOWTO перевод на русский
  2. ↑ в .rpmmacros прописаны стандартные для ALT пути: %_topdir %homedir/RPM %_tmppath %homedir/tmp
  3. ↑ нужно установить пакет rpm-utils
  4. ↑ Дальше для простоты, я не буду указывать путь до файла, подразумевая, что вы предварительно перешли в каталог с файлом
  5. ↑ смотри bugzilla.altlinux.org
  6. ↑ # — это не комментарий, а знак что для выполнения команды apt-get нужно получить права root
  7. ↑ $ — это знак, что команду cd надо выполнять вашим обычным пользователем

Ссылки

  • RPM-HOWTO
  • RPM-HOWTO перевод на русский
  • Сборка_пакета_с_нуля
  • О_стратегии_сборки_RPM_пакетов
  • Руководство по написанию спек файла для rpm
  • Краткая инструкция по сборке пакетов с помощью etersoft-build-utils
  • Краткое_руководство_по_сборке_с_gear
  • Макросы RPM
  • git
  • gear
  • hasher

Источник

Оцените статью
Adblock
detector