Структура ~/rpmbuild
Каталоги BUILD, RPMS, SOURCES, SPECS, SRPMS и их назначение.
На этой странице
Сборка RPM происходит в стандартной структуре каталогов. Понимание назначения каждого каталога важно для эффективной работы.
Общая структура
~/rpmbuild/
├── BUILD/ # Распакованные исходники, здесь происходит компиляция
├── BUILDROOT/ # Временный корень ФС для установки
├── RPMS/ # Готовые бинарные пакеты
│ ├── x86_64/
│ ├── noarch/
│ └── ...
├── SOURCES/ # Архивы исходников, патчи, дополнительные файлы
├── SPECS/ # SPEC-файлы
└── SRPMS/ # Исходные пакеты (SRPM)
Каталоги подробно
SOURCES — исходные материалы
Здесь хранятся:
- Архивы с исходным кодом (
*.tar.gz,*.tar.xz,*.zip) - Патчи (
*.patch) - Дополнительные файлы (конфиги, unit-файлы, скрипты)
ls ~/rpmbuild/SOURCES/
# hello-2.12.1.tar.gz
# hello-fix-typo.patch
# hello.service
Наполнение:
# Вручную
cp hello-2.12.1.tar.gz ~/rpmbuild/SOURCES/
# Через spectool
spectool -g -C ~/rpmbuild/SOURCES/ hello.spec
# Скачать напрямую
cd ~/rpmbuild/SOURCES/
curl -LO https://ftp.gnu.org/gnu/hello/hello-2.12.1.tar.gz
SPECS — рецепты пакетов
SPEC-файлы с инструкциями по сборке:
ls ~/rpmbuild/SPECS/
# hello.spec
# htop.spec
BUILD — рабочая область
Сюда распаковываются исходники, здесь происходит компиляция:
ls ~/rpmbuild/BUILD/
# hello-2.12.1/ # Распакованные исходники после %prep
После %prep:
BUILD/
└── hello-2.12.1/
├── configure
├── Makefile.in
├── src/
│ └── hello.c
└── ...
После %build:
BUILD/
└── hello-2.12.1/
├── Makefile # Сгенерирован configure
├── src/
│ ├── hello.c
│ └── hello.o # Скомпилированный объектный файл
└── hello # Готовый бинарник
BUILDROOT — виртуальный корень
Временная файловая система, куда устанавливаются файлы в %install:
ls ~/rpmbuild/BUILDROOT/
# hello-2.12.1-1.rosa13.1.x86_64/
Структура внутри:
BUILDROOT/hello-2.12.1-1.rosa13.1.x86_64/
├── usr/
│ ├── bin/
│ │ └── hello
│ └── share/
│ ├── man/
│ │ └── man1/
│ │ └── hello.1.gz
│ └── info/
│ └── hello.info.gz
└── ...
Это «фейковый корень» — файлы устанавливаются сюда, а не в реальную систему.
RPMS — готовые пакеты
Результат сборки — бинарные RPM-пакеты:
ls ~/rpmbuild/RPMS/x86_64/
# hello-2.12.1-1.rosa13.1.x86_64.rpm
ls ~/rpmbuild/RPMS/noarch/
# python3-mylib-1.0-1.rosa13.1.noarch.rpm
Структура по архитектурам:
RPMS/
├── x86_64/ # 64-битные пакеты
├── i686/ # 32-битные пакеты
├── aarch64/ # ARM 64-bit
└── noarch/ # Архитектурно-независимые
SRPMS — исходные пакеты
Source RPM содержит SPEC + исходники:
ls ~/rpmbuild/SRPMS/
# hello-2.12.1-1.rosa13.1.src.rpm
SRPM можно:
- Пересобрать на другой системе
- Отправить на сборочную ферму
- Распаковать и изучить
# Установить SRPM (распакует в SOURCES и SPECS)
rpm -ivh hello-2.12.1-1.src.rpm
# Или извлечь без установки
rpm2cpio hello-2.12.1-1.src.rpm | cpio -idmv
Процесс сборки по каталогам
SPECS/hello.spec
│
▼
SOURCES/hello-2.12.1.tar.gz ───► BUILD/hello-2.12.1/
SOURCES/fix.patch │
│ %prep: распаковка, патчи
│ %build: компиляция
│ %install: установка
▼
BUILDROOT/.../usr/bin/hello
│
│ упаковка
▼
┌─────────────────────┴─────────────────────┐
▼ ▼
RPMS/x86_64/hello-2.12.1-1.x86_64.rpm SRPMS/hello-2.12.1-1.src.rpm
Изменение расположения
По умолчанию ~/rpmbuild, но можно изменить:
Через ~/.rpmmacros
%_topdir /home/user/my-packages
Через переменную окружения
rpmbuild --define "_topdir /tmp/build" -ba package.spec
Через командную строку
rpmbuild -D "_topdir $PWD/rpmbuild" -ba package.spec
Очистка
Удалить BUILD и BUILDROOT после сборки
По умолчанию rpmbuild очищает их. Чтобы сохранить для отладки:
rpmbuild -ba --noclean package.spec
Или в ~/.rpmmacros:
%_auto_clean 0
Ручная очистка
# Очистить всё
rm -rf ~/rpmbuild/BUILD/* ~/rpmbuild/BUILDROOT/*
# Очистить конкретный пакет
rm -rf ~/rpmbuild/BUILD/hello-*
rm -rf ~/rpmbuild/BUILDROOT/hello-*
Права доступа
Сборка должна выполняться от обычного пользователя, не от root:
# Проверить владельца
ls -la ~/rpmbuild
# Исправить, если нужно
sudo chown -R $USER:$USER ~/rpmbuild
%install может повредить систему.
Работа с несколькими проектами
Для изоляции проектов можно использовать разные _topdir:
# Проект 1
mkdir -p ~/projects/hello/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
rpmbuild -D "_topdir $HOME/projects/hello/rpmbuild" -ba hello.spec
# Проект 2
mkdir -p ~/projects/htop/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
rpmbuild -D "_topdir $HOME/projects/htop/rpmbuild" -ba htop.spec
Проверьте понимание
- В каком каталоге хранятся архивы исходников?
- Где происходит компиляция?
- Что такое BUILDROOT и зачем он нужен?
- Куда попадают готовые RPM-пакеты?
- Как изменить расположение
_topdir?
Далее: Первая сборка: GNU Hello