RPM-пакет состоит из архива в формате cpio, содержащего файлы (скомпилированные исполняемые файлы, библиотеки, данные), и заголовка с метаданными (название, версия, группа и т.п.). Эти метаданные используются системой управления пакетами (например, apt) для разрешения зависимостей, определения путей установки и получения другой служебной информации.
Различают два вида RPM-пакетов:
пакет с исходным кодом — SRPM-пакет (имеет расширение вида
.src.rpm). Такой пакет содержит архив (один или несколько) с исходным кодом, spec-файл и, возможно, различные патчи и дополнения. Пакет src.rpm используется только для сборки двоичных пакетов, но не для установки. Сборка осуществляется командой:
$ rpmbuild --rebuild package.src.rpm
собранный двоичный пакет — RPM-пакет (имеет расширение вида
<архитектура>.rpm). Такие пакеты можно устанавливать командой:
# rpm -Uvh package.rpm
Однако при ручной сборке через
rpmbuild возникают очевидные сложности:
необходимо вручную удовлетворять сборочные зависимости (устанавливать компилятор, заголовочные файлы, библиотеки). При большом количестве собираемых пакетов система засоряется;
для сборки пакета необходимо сформировать .src.rpm из файлов, расположенных в разных каталогах (по умолчанию это подкаталоги SOURCE, SPECS и каталоги сборки в ~/RPM);
исходные файлы должны быть упакованы, что затрудняет создание патчей;
на рабочей системе легко пропустить необходимые зависимости.
Для решения этих проблем в Альт Платформа используется две технологии:
Hasher — сборка в изолированном chroot-окружении. В chroot устанавливается базовый набор пакетов и пакеты, необходимые для сборки (поле BuildRequires в spec-файле). Если какой-либо пакет не указан в spec-файле, сборка завершится ошибкой. Это обеспечивает воспроизводимость и чистоту сборки. Обратной стороной является необходимость доступа к репозиторию, так как пакеты устанавливаются при каждой сборке;
Gear — работа с распакованными исходниками в git с автоматической упаковкой в .src.rpm. В этом случае все файлы хранятся в распакованном виде и упаковываются в .src.rpm по правилам, определённым в .gear/rules. Это позволяет напрямую работать с содержимым, быстро создавать патчи, вести историю изменений и эффективно взаимодействовать в рамках командной разработки.