Highlighter

вторник, 10 апреля 2012 г.

Собираем RPM пакет в CentOS

Ставить из исходников в бинарном дистрибутиве при помощи make install как-то неправильно. Это очень успешно засоряет систему и мешает обновлениям. Поэтому будем разбираться, как собрать пакет в CentOS.

Если у вас не подключен репозиторий EPEL, то придётся это сделать путём установки этого пакета. После этого нужно установить инструменты для сборки

yum install -y rpmdevtools

Ну и естественно, то что требуется для сборки конкретного пакета (make, gcc и прочее).
Теперь создадим пользователя, чтобы не делать потенциально опасные операции под рутом и залогинимся под ним.

useradd rpmbuild
su - rpmbuild
cd

Теперь нужно создать структуру каталогов для сборки.

rpmdev-setuptree

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

Сначала идёт заголовок, поля которого говорят сами за себя, тут нам достаточно прописать нужную версию (у нас 3.1). Ещё хочется обратить внимание на то, что можно указывать на несколько исходных файлов и патчей и на то, как это делается. Так как они описаны в этих полях, то их тоже нужно достать из архива и положить в папку SOURCE.
Ссылки на пути даются в виде переменных, например, ссылка на скачивание выглядит так:
Source0:    http://pgfoundry.org/frs/download.php/2423/%{name}-%{version}.tar.gz
Соответственно, тут %{name} = pgpool-II, а %{version} = 3.1 и ссылка получается http://pgfoundry.org/frs/download.php/2423/pgpool-II-3.1.tar.gz

Далее идёт описание, сборка и установка. О том, какие разделы есть, можно почитать в интернете, например тут. Также стоит обратить внимание, что есть секции devel - в них описаны параметры сборки -devel пакета, как можно догадаться.

Теперь попытаемся собрать пакет

rpmbuild -bb pgpool.spec

Затем установим зависимости и опять попытаемся собрать. Затем закомментируем патч (который изменяет настройки по-умолчанию - всё равно будем под себя настраивать) и опять попытаемся собрать. Затем добавим новые появившиеся файлы в секцию %files и наконец-то всё соберётся. Как видите, ничего особо сложного - главное читать, на что ругнётся rpmbuild. В результате у нас получилось два пакета: pgpool-II-3.1-3.el6.x86_64.rpm  pgpool-II-devel-3.1-3.el6.x86_64.rpm, которые можно устанавливать и использовать.

Теперь давайте попробуем написать минимальный spec с нуля. Соберём пакет c uwsgi. Его сборка представляет собой просто выполнение команды make. К сожалению, ни spec, ни даже make install они не предоставляют. Поэтому будем делать всё руками. К счастью, vim при создании нового spec-файла подставил заготовку с пустыми полями.

Вот, что у меня вышло:

Name:        uwsgi
Version:    0.9.9.2
Release:    1%{?dist}
Summary:    uWSGI application server

License:    GPL
URL:        http://projects.unbit.it/uwsgi
Source0:    http://projects.unbit.it/downloads/%{name}-%{version}.tar.gz
BuildRoot:    %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)

# Всё, кроме chrpath взято из их гайда по сборке
BuildRequires:    libxml2-devel python-devel chrpath
Requires:    libxml2

%description
uWSGI is a fast, self-healing and developer/sysadmin-friendly application container server coded in pure C.

%prep
%setup -q

%build
make %{?_smp_mflags}

%install
# следующие две строчки - костыль, так как по умолчанию папки /usr/bin и /etc будут
install -d $RPM_BUILD_ROOT%{_bindir}
install -d $RPM_BUILD_ROOT%{_sysconfdir}

# Устанавливаем файлы uwsgi и uwsgi.xml в /usr/bin и /etc соответственно.
install %{name} $RPM_BUILD_ROOT%{_bindir}
install uwsgi.xml $RPM_BUILD_ROOT%{_sysconfdir}

# А вот это довольно важная команда. При линковке uwsgi были жёстко прописаны пути
# к библиотекам, что плохо, так как нужно пользоваться динамическим линкером.
# Поэтому это безобразие нужно убрать, для чего используется следующая команда.
# Подробней можно почитать тут.
chrpath --delete $RPM_BUILD_ROOT%{_bindir}/%{name}

%clean
rm -rf $RPM_BUILD_ROOT

%files
%defattr(-,root,root,-)
%doc
%{_bindir}/%{name}
%{_sysconfdir}/uwsgi.xml


Думаю, этого достаточно, чтобы разобраться и попробовать самому. Самое главное - установка, обновление и удаление будут происходить намного безопасней.

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

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