RPM-пакет состоит из архива cpio, содержащего файлы (скомпилированные исполняемые файлы, библиотеки, данные), и заголовка, содержащего метаданные о пакете (название, версия, группа и т.п.). Менеджер пакетов RPM использует эти метаданные для определения зависимостей, места установки файлов и другой информации.
Различают два вида пакетов 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 ставится базовый комплект пакетов и пакеты, необходимые для сборки (поле BuildRequires в спеке). Если какой-то пакет для сборки не указан в спеке, то появится ошибка. Так обеспечивается чистота сборки. Обратной стороной является необходимость иметь доступ к репозиторию, так как пакеты ставятся при каждой сборке в Hasher;
Gear — для сборки пакетов из репозитория Git. В этом случае все файлы лежат в распакованном виде и в .src.rpm упаковываются по правилам, определённым в .gear/rules. Это позволяет работать сразу с содержимым, быстро делать патчи, вести историю изменений и обмениваться изменениями при коллективной разработке.