пятница, 3 апреля 2015 г.

Учимся писать .spec файлы

Можно много лет использовать систему, используя только уже готовые rpm файлы, но однажды приходится ставить и распространять что-то своё, не забивая при этом все сервера компиляторами и служебными утилитами. И возникает необходимость собрать свои пакеты. А потом - поднять локальный репозиторий.

А пока позаботимся о первой части. При возможности для сборки нужен отдельный сервер и отдельный юзер, чтобы не забивать рабочие машины (сервера), на нём же безопасно тестировать установку и удаление этих пакетов, помним баги с лишним пробелом в rm -rf / usr.



Для начала, поставим набор  компиляторов и утилиты для сборки
yum -y install rpmdevtools
yum -y groupinstall "Development Tools"
yum -y install vim

Зачем нужен vim? После установки указанных пакетов, vim lalala.spec (где lalala - любое имя, расширение обязательно .spec) сразу откроет шаблон спек-файла, который можно тут же поправить и сохранить, тогда как просто vi - создаст новый пустой документ.

Теперь нам нужен рабочий каталог rpmbuild. Можно создать всю структуру руками, можно запустить утилиту (входит в rpmdevtools)
rpmdev-setuptree

"Эта команда создаст директорию ~/rpmbuild, в которой будет набор поддиректорий (например SPECS и BUILD), которые будут использоваться для создания RPM пакетов. Так же, команда создаёт файл ~/.rpmmacros, который позволит командам rpm и rpmbuild верно использовать созданную структуру директорий." (1)
Впрочем, никто не отменял ручное создание mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} и потом ручное создание ~/.rpmmacros

Далее по полям и формату. Была найдена обалденная дока
wiki.rosalab.ru/ru/index.php/Сборка_RPM_-_быстрый_старт
Всё достаточно понятно и просто, при этом охвачены даже условные операции (%if) и вызов сторонних приложений ( %(rpm -qa ...)), и всё достаточно актуально. Хотя разумеется раскрыты не все темы, это только "быстрый старт".

Более старая и более сухая дока
http://rus-linux.net/MyLDP/HOWTO-ru/RPM-HOWTO/RPM-HOWTO-48.html

Ещё одна старая (2008 год) и местами не актуальная; но тоже есть полезные моменты, например "%{__id_u} не что иное, как простой вызов команды id -u"
http://unixforum.org/index.php?showtopic=76757
Уровень продвинутый, есть даже про подписи своих пакетов. До кучи - раскрывается тема сборки пакетов для debian.

Хабр, куда без него. Более скучный и поверхностный быстрый старт + комментарии, например про mock.
http://habrahabr.ru/post/246177/

Со временем встанет вопрос, где брать списки макросов, типа %{initddir}, тогда начинать с
rpm --showrc
И можно продолжить по докам
https://fedoraproject.org/wiki/Packaging:RPMMacros (краткий список, покрывает 80% задач)
http://www.zarb.org/~jasonc/macros.php
http://rpm.org/api/4.4.2.2/config_macros.html

Иногда встает вопрос, как использовать sed. Например, так (секция %install):
%{__sed} -i "s/OS/%{os_variant}/" $RPM_BUILD_ROOT%{_sysconfdir}/yum.repos.d/nginx.repo
%{__sed} -i "s/RELEASEVER/%{rhel}/" $RPM_BUILD_ROOT%{_sysconfdir}/yum.repos.d/nginx.repo

Примеры spec файлов
memcached.spec
ffmpeg-github-0.8.2.spec
nginx.spec

(1) http://for-wm.ru/linux/content/sozdanie-rpm-paketov.htm Вынесено ниже, потому что начинать лучше с "быстрый старт". Тут описано чуть больше ключей.. и всё. Совсем не быстрый старт.

Комментариев нет:

Отправить комментарий