⚙️ Сборочная система и rpmbuild
🎯 Цель раздела
В этом разделе вы:
- узнаете, как работает процесс сборки RPM-пакета;
- поймёте назначение каждой секции в SPEC-файле;
- освоите макросы и структуру buildroot;
- научитесь собирать и проверять пакеты в изолированной среде.
🧩 Что делает rpmbuild
Утилита rpmbuild — центральный инструмент инженера сопровождения.
Она:
- читает SPEC-файл,
- извлекает исходники из SOURCES,
- выполняет сборку, установку и упаковку,
- создаёт SRPM и RPM пакеты.
Схематично процесс выглядит так:
SOURCES + SPEC → rpmbuild → SRPM → RPM
📁 Структура рабочего дерева
После выполнения rpmdev-setuptree создаётся стандартное дерево:
~/rpmbuild/
├── BUILD # Временные файлы сборки
├── RPMS # Готовые бинарные пакеты
├── SOURCES # Исходники (tar.gz, патчи)
├── SPECS # SPEC-файлы
└── SRPMS # Исходные пакеты (SRPM)
Каждая директория участвует в цикле сборки.
🔧 Основные этапы сборки
rpmbuild проходит по секциям SPEC-файла в строгом порядке:
-
%prep — подготовка исходников
Распаковка архива, применение патчей:
%prep
%setup -q
%patch0 -p1 -
%build — сборка
Здесь выполняются команды компиляции:
%build
./configure --prefix=/usr
make -
%install — установка в buildroot
Установка файлов в изолированный каталог:
%install
make install DESTDIR=%{buildroot} -
%files — описание содержимого пакета
Что попадёт в итоговый RPM:
%files
/usr/bin/hello
/usr/share/doc/hello/*
%changelog — история изменений.
🧰 Макросы RPM
RPM использует макросы — переменные, которые упрощают SPEC-файл.
| Макрос | Значение |
|---|---|
%{name} | Имя пакета |
%{version} | Версия |
%{buildroot} | Каталог установки при сборке |
%{_bindir} | /usr/bin |
%{_libdir} | /usr/lib64 |
%{_sysconfdir} | /etc |
Пример:
install -m 0755 myapp %{buildroot}%{_bindir}/myapp
💡 Макросы позволяют писать переносимые и читаемые SPEC-файлы.
🧪 Практическая сборка и отладка
Попробуем собрать пакет в “отладочном” режиме:
rpmbuild -ba SPECS/hello.spec --clean --define "_smp_mflags -j$(nproc)"
-ba— собрать всё (SRPM + RPM),--clean— очистить временные каталоги после сборки,--define— переопределить макросы (например, количество потоков сборки).
🧱 Buildroot и изоляция
Buildroot — временный каталог, где устанавливается пакет перед упаковкой. Он обеспечивает:
- чистоту сборки (никаких файлов из системы);
- предсказуемость результата;
- совместимость с ABF.
Расположение buildroot:
/home/user/rpmbuild/BUILDROOT/<имя>-<версия>-<релиз>.<арх>
⚙️ Именно buildroot архивируется и превращается в
.rpm.
🧰 Проверка и тестирование сборки
После сборки проверьте:
rpm -qlp RPMS/x86_64/hello-1.0-1.x86_64.rpm
Проверьте установку “вхолостую”:
sudo rpm -Uvh --test RPMS/x86_64/hello-1.0-1.x86_64.rpm
Если всё прошло без ошибок, можно устанавливать:
sudo dnf install RPMS/x86_64/hello-1.0-1.x86_64.rpm
🧩 Частые ошибки при сборке
| Ошибка | Причина | Решение |
|---|---|---|
File not found: /usr/bin/... | Файл не установлен в buildroot | Добавить установку в %install |
Unknown tag: %something | Неправильный макрос | Проверить синтаксис и документацию |
missing buildid | Отсутствует сборка с debug-инфо | Добавить %global debug_package %{nil} при тестах |
rpmbuild failed | Ошибка в секции %build | Проверить логи в ~/rpmbuild/BUILD/ |
🧠 Мини-тест для самопроверки
| Вопрос | Ответ |
|---|---|
Что делает секция %prep? | Распаковывает исходники и применяет патчи |
| Где располагается buildroot? | В ~/rpmbuild/BUILDROOT/ |
Для чего нужны макросы %{_bindir} и %{buildroot}? | Для унификации путей и изоляции сборки |
Чем отличается %build от %install? | %build компилирует, %install устанавливает файлы |
| Как проверить состав пакета без установки? | rpm -qlp <путь>.rpm |
🧭 Итого
Теперь вы:
- освоили
rpmbuildи структуру SPEC-файла на практике; - поняли назначение макросов и buildroot;
- умеете читать, собирать и проверять пакеты;
- готовы перейти к следующему шагу — работе с патчами, версиями и исходниками, чтобы адаптировать пакеты под ROSA Linux.
Следующий документ — “Патчи, исходники и версии” — раскроет, как модифицировать исходный код и управлять обновлениями в SRPM.