Thank you for reading this post, don't forget to subscribe!
Для работы по сборке пакетов лучше использовать отдельный компьютер, виртуальную машину или контейнер Docker.
1. Установим пакеты:
yum install rpmdevtools rpmlint
* где:
- rpmdevtools — позволит нам использовать утилиту rpmdev-setuptree, с помощью которой мы сможем создать рабочую среду в виде каталогов для сборки.
- rpmlint — позволяет протестировать пакет RPM.
А также ставим:
yum group install "Development Tools"
* данная группа пакетов включает все необходимое для сборки. Ее не рекомендуется ставить на рабочий компьютер, так как устанавливается много ненужного для стандартной системы мусора.
2. Создаем пользователя.
Делать готовые установочные сборки пакетов очень опасно от пользователя root. Если мы допустим ошибку с путями, файлы могут перетереть или удалить важные для работы директории. Стоит создать отдельного пользователя и работать под ним. Однако, если мы работаем в виртуальной среде или контейнере Docker, нам это не страшно. Тогда данный пункт можно пропустить и работать из под root.
Выполняем команду:
useradd builder -m
* в данном примере мы создадим пользователя builder. Опция -m сразу создаст домашний каталог для пользователя.
Теперь заходим под данным пользователем — последующие команды мы будем выполнять от него:
su - builder
3. Создадим структуру каталогов для сборки:
rpmdev-setuptree
В нашей текущем каталоге должна появиться папка rpmbuild — а в ней:
- BUILD — содержит все файлы, которые появляются при создании пакета.
- RPMS — сюда будут складываться готовые пакеты.
- SOURCES — для исходников, из которых и будут собираться RPM-пакеты.
- SPECS — для файлов с описанием процесса сборки.
- SRPMS — для исходников RPM-файлов.
Мы готовы к сборке.
Сборка из исходников
Рассмотрим пример создания RPM из пакета, который нужно собирать из исходников с помощью команды make. Например, возьмем данную программу: github.com/brettlaforge/pg_redis_pubsub.
Создадим файл spec:
rpmdev-newspec rpmbuild/SPECS/pg_redis_pubsub.spec
Теперь откроем его и приведем к виду:
vi rpmbuild/SPECS/pg_redis_pubsub.spec
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
Name: pg_redis_pubsub Version: 1.0.2 Release: 1%{?dist} Summary: Redis Publish from PostgreSQL License: X11 License URL: https://github.com/brettlaforge/pg_redis_pubsub Source0: %{name}-%{version}.tar.gz BuildRequires: postgresql-devel postgresql-server-devel BuildRequires: hiredis-devel Requires: postgresql %if 0%{?rhel} < 8 Requires: hiredis-last >= 0.13.3-1 %else Requires: hiredis %endif %define _build_id_links none %description Redis Publish from PostgreSQL %prep %{__rm} -rf %{name}-%{version} %{__mkdir} -p %{name}-%{version} %{__tar} -xzvf %{SOURCE0} -C %{_builddir}/%{name}-%{version} --strip-components 1 %build cd %{name}-%{version} %{__make} %install cd %{name}-%{version} %{__make} install DESTDIR=%{buildroot} %clean %{__rm} -rf $RPM_BUILD_ROOT %{__rm} -rf $RPM_BUILD_DIR/* %files %defattr(-,root,root) /%{_libdir}/pgsql/redis.so /%{_datadir}/pgsql/extension/redis.control /%{_datadir}/pgsql/extension/redis--0.0.1.sql %changelog * Fri Jul 9 2021 root - |
* чтобы понять, как заполнить spec-файл, рекомендуется для начала собрать и установить приложение вручную с помощью make и make install. Также необходимо изучить документацию устанавливаемого пакета или (при наличие возможности) поговорить с разработчиками программного обеспечения.
Установим зависимости, которые необходимы для сборки (BuildRequires). В данном примере это:
yum install epel-release
yum install postgresql-devel postgresql-server-devel hiredis-devel
* конкретно, в моем примере для установки hiredis-devel необходимо поставить репозиторий epel-release. Список пакетов, необходимый для сборки конкретного пакета необходимо уточнить в документации.
Теперь копируем исходник на свой компьютер. В моем примере клонируем репозиторий:
git clone https://github.com/brettlaforge/pg_redis_pubsub.git
Готовим архив и помещаем его в каталог rpmbuild/SOURCES:
tar -czvf rpmbuild/SOURCES/pg_redis_pubsub-1.0.2.tar.gz pg_redis_pubsub
Проверяем корректность SPEC-файла:
rpmlint rpmbuild/SPECS/pg_redis_pubsub.spec
В моем примере команда вернула ответ:
rpmbuild/SPECS/pg_redis_pubsub.spec: W: invalid-url Source0: pg_redis_pubsub-1.0.2.tar.gz
0 packages and 1 specfiles checked; 0 errors, 1 warnings.
Данное предупреждение можно проигнорировать.
Выполняем сборку:
rpmbuild -bb rpmbuild/SPECS/pg_redis_pubsub.spec
Если она пройдет без ошибок, мы должны найти RPM-пакет в каталоге rpmbuild/RPMS/x86_64, где x86_64 — архитектура пакета.
Описание файла SPEC
Данный файл является инструкцией по сборке пакета. В нем мы описываем сам пакет, задаем метаданные и указываем, как извлекать файлы и куда их копировать при установке пакета. Синтаксис файла включает такие элементы, как разделы, макросы, операторы, опции. Рассмотрим их отдельно.
Опции заголовка
Определяют описание пакета, а также некоторые важные для сборки параметры.
Опция | Описание | Пример |
---|---|---|
Name | Название для пакета RPM | pg_redis_pubsub |
Version | Версия собираемого пакета | 1.0.2 |
Release | Релиз или версия программы | 1%{?dist} ?dist обозначение версии доработки |
Summary | Краткое описание пакета | Redis Publish from PostgreSQL |
License | Способ лицензирования | X11 License |
URL | Адрес источника пакета | https://github.com/brettlaforge/pg_redis_pubsub |
Source0 | Источник данных, из которых должен собираться пакет. Можно указать несколько источников: Source1, Source2 … SourceN |
%{name}-%{version}.tar.gz Данная запись означает, что сборщик будет искать архив pg_redis_pubsub-1.0.2.tar.gz в каталоге rpmbuild/SOURCES/ |
BuildRequires | Требования к пакетам, которые нужны для сборки пакета. Можно написать большим списком, а можно добавить несколько отдельных строк BuildRequires. Также мы можем задать требование к версии пакета. |
postgresql-devel postgresql-server-devel hiredis-devel |
Requires | Требования к пакетам, которые нужны для установки собранного пакета. Можно написать большим списком, а можно добавить несколько отдельных строк Requires. Также мы можем задать требование к версии пакета. |
hiredis >= 0.13.3-1 |
Разделы (теги)
В каждом разделе описывается своя часть логики процесса сборки пакета.
Раздел | Описание |
---|---|
%description | Описание пакета. Может состоять из нескольких строк, но каждая строка должна содержать до 73 символов. |
%prep | Предварительная обработка. Используется для подготовки исходников. Как правило, в данном разделе происходит их распаковка. Также на данном этапе могут применяться патчи. |
%build | Этап сборки пакета. Как правило, это make. |
%install | Установка пакета. Это может быть make install или копирование конкретных файлов в конкретные директории или запуск произвольного скрипта. |
%clean | Раздел содержит инструкции по удалению устаревших файлов, которые больше не нужны. |
%files | Перечисляем файлы, которые должны попасть в конечную систему при установке пакета. |
%changelog | Список изменений в работе программного обеспечения. |
Макросы для команд
Некоторые системные команды лучше писать не напрямую, а через макросы. Это позволит добиться большей стабильности при сборке на различных системах. Приведем в пример данные команды:
Макрос | Команда | Описание |
---|---|---|
%{__rm} | rm | Удаление файлов |
%{__mv} | mv | Перенос файлов |
%{__tar} | tar | Распаковка или создание архивов |
* полный список макросов можно получить командой rpm --showrc.
Макросы для каталогов
Каталоги лучше писать не буквально, а через макросы:
Макрос | Путь |
---|---|
%{_prefix} | /usr |
%{_libdir} | %{_prefix}/lib64 |
%{_datarootdir} | %{_prefix}/share |
%{_datadir} | %{_datarootdir} |
* обратите внимание, что некоторые макросы ведут не на конкретные пути, а на другие макросы.
* полный список макросов можно получить командой rpm --showrc.
Операторы сравнения
SPEC файл позволяет задавать логику с помощью операторов сравнения. Приведем примеры их использования:
Пример | Описание |
---|---|
%if 0%{?rhel} < 8 Requires: hiredis-last >= 0.13.3-1 %else Requires: hiredis %endif |
В данном примере мы проверяем версию системы, на которой идет сборка. Если rhel (релиз системы) меньше 8, то мы указываем в качестве требования hiredis-last. В данном примере это имеет смысл, так как в CentOS 8 пакет hiredis-last переименовали в hiredis. |