CentOS: собираем пакеты при помощи rpmbuild

Все найденные мною в интернете мануалы в большинстве случаев сводятся к двум видам:
перевод документации (с которым я всё-таки советую ознакомиться, тк в моей статье будет освещена лишь часть информации, которая вам в дальнейшем понадобится)
— краткие инструкции, как запустить rpmbuild когда у нас уже есть всё.
Лично я столкнулся с необходимость собрать пакет из исходника, вместе с которым небыло ничего, а главное spec-файла, по которому необходимо собрать пакет. В итоге мы напишем собственный spec-файл для сборки пакета и добавим туда сразу собственные конфиги (этот вопрос тоже не сильно освящён).

Я буду собирать пакет из исходников ffmpeg для AirVideoServer, который я уже рассказывал как ставить под Gentoo. Я сторонник того, что бы в дистрибутиве, который использует пакетный менеджер, приложения ставились именно через него, по этому на CentOS я не люблю собирать ПО из исходников. По этой причине я решил собрать себе всё в пакеты. Сборка так же необходимых lame (он идёт уже со spec-файлов в комплекте) и x264 (под него вы сможете написать spec-файл сами, после прочтения этой статьи) не должна вызвать у вас проблем в будущем.

И так, для начала нам нужно настроить «среду» в которой мы будет собирать пакет. Не рекомендуется производить сборку пакетов из под root`а, по этому мы заведём отдельного пользователя, но а пока поставим всё необходимое ПО:

yum install gcc gcc-c++ automake autoconf libtool yasm nasm ncurses-devel git ftp rpmdevtools

а теперь заведём специального пользователя

useradd rpmbuild

и войдём под ним

su - rpmbuild

выполним команду

rpmdev-setuptree

что бы она развернула нам необходимую структуру директорий для сборки
И теперь мы можем приступать непосредственно к сборке.
Нам понадобится сам исходник

wget http://inmethod.com/airvideo/download/ffmpeg-for-2.4.5-beta7.tar.bz2

разворачиваем его

tar -xjf ffmpeg-for-2.4.5-beta7.tar.bz2

Положим рядом конфигурационный файл с содержимым:

nano airvideoserver.conf
path.ffmpeg = /usr/bin/ffmpeg
password = 
subtitles.encoding = utf-8
subtitles.font = Verdana
folders = Movies:/home/share/films

Сюда же скачаем файл сервера:

wget http://inmethod.com/airvideo/download/linux/alpha6/AirVideoServerLinux.jar

И init-скрипт:

nano AirVideoServer
#!/bin/bash
#chkconfig: - 80 20 
#description: AirVideo server

# Source function library.
. /etc/rc.d/init.d/functions

PREFIX_DIR=/usr/local/AirVideo

case "$1" in
	start)
		echo -n "Starting AirVideo server: "
		daemon java -jar ${PREFIX_DIR}/AirVideoServerLinux.jar ${PREFIX_DIR}/properties.conf > /dev/null 2>&1 &
		[ $? -eq 0 ] && success || failure
		echo
	;;
	stop)
		echo -n "Stopping AirVideo server: "
		killproc java
		echo
	;;
	status)
		status java
	;;
	restart | reload)
		$0 stop ; $0 start
	;;
	*)
		echo "Usage: airvideo {start|stop|status|reload|restart"
		exit 1
	;;
esac

Теперь можно переходить к написанию нашего spec-файла для сборки.
Сначала у нас идут различные заголовки. Имя пакета, версия и релиз — имеют значение, от них будет зависеть в какую директорию будет разворачиваться исходник перед сборкой. В Source1 , Source2 и Source3 мы указываем наши 3 дополнительных файл, конфиг, сервер и init-скрипт, которые необходимо добавить в пакет при сборке.

Name: ffmpeg
Version: 2.4.5
Release: beta7
Summary: ffmpeg for AirVideoServer
License: GPL
URL: http://inmethod.com/airvideo/
Source: http://inmethod.com/airvideo/download/ffmpeg-for-2.4.5-beta7.tar.bz2
Source1: airvideoserver.conf
Source2: AirVideoServer
Source3: AirVideoServerLinux.jar
BuildRoot: %{_tmppath}/%{name}-for-%{version}-%{release}

Далее идёт описание, думаю тут вопросов не возникнет

%description
Utility and library for encoding H264/AVC video streams for AirVideoServer.

Секция %prep отвечает за команды, необходимые для начала сборки, что бы мне не мучится с переименованием директории под формат -, я просто ключом -n указываю где лежат распакованные исходники

%prep
%setup -n /home/rpmbuild/rpmbuild/BUILD/ffmpeg/

Секция %build отвечает за непосредственную сборку исходника, ключи вы можете менять на необходимые вам, как при обычной сборке и установке из исходников:

%build
./configure \
    --prefix="%{_prefix}" \
    --bindir="%{_bindir}" \
    --libdir="%{_libdir}" \
    --enable-pthreads \
    --disable-shared \
    --enable-static \
    --enable-gpl \
    --enable-libx264 \
    --enable-libmp3lame

Секция %install содержит команды установки файлов пакета в систему, здесь нам необходимо дополнительно указать, куда инсталлировать наши файл конфига, сервер и init-скрипт

%install
%{__rm} -rf %{buildroot}
%{__make} install DESTDIR="%{buildroot}"
mkdir -p $RPM_BUILD_ROOT/usr/local
mkdir -p $RPM_BUILD_ROOT/usr/local/AirVideo/
install -m 644 %{SOURCE1} $RPM_BUILD_ROOT/usr/local/AirVideo/
install -m 644 %{SOURCE2} $RPM_BUILD_ROOT/etc/init.d
install -m 644 %{SOURCE3} $RPM_BUILD_ROOT/usr/local/AirVideo/

Уберём за собой мусор и выполним ldconfig

%clean
%{__rm} -rf %{buildroot}

%post -p /sbin/ldconfig
%postun -p /sbin/ldconfig

Команды в секции %files задают списки файлов и каталогов, которые с соответствующими атрибутами должны быть скопированы из дерева сборки в rpm-пакет и затем будут копироваться в целевую систему при установке этого пакета.

%files
%defattr(-,root,root,-)
%doc COPYING* CREDITS README*
%{_bindir}/avconv
%{_bindir}/avprobe
%{_bindir}/avserver
%{_bindir}/ffmpeg
/usr/include/*
/usr/lib64/*
/usr/share/avconv/*
/usr/local/AirVideo/airvideoserver.conf
/etc/init.d/AirVideoServer
/usr/local/AirVideo/AirVideoServerLinux.jar

Макрос %doc отмечает файлы документации, копирайты и прочие вещи.
На этом наш spec-файл готов, теперь нам необходимо запустить саму сборку

rpmbuild -bb ffmpeg/ffmpeg.spec

При успешной сборке пакета, после завершения, в директории RPMS/_архитектура_/ у нас появится наш пакет ffmpeg-2.4.5-beta7.x86_64.rpm который теперь можно выложить и развернуть на любой машине.

Надеюсь данный небольшой мануал, поможет вам собирать собственные пакеты для установки, с собственными конфигурационными файлами, что впоследствии облегчит вам жизнь.

2 ответа на “CentOS: собираем пакеты при помощи rpmbuild”

  1. + STATUS=0
    + ‘[‘ 0 -ne 0 ‘]’
    + cd /home/rpmbuild/rpmbuild/BUILD/ffmpeg/
    + /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
    + exit 0
    Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.tJvHO4
    + umask 022
    + cd /home/rpmbuild/rpmbuild/BUILD
    + cd /home/rpmbuild/rpmbuild/BUILD/ffmpeg/
    + ./configure $’\302\240\302\240\302\240\302\240—prefix=/usr’ $’\302\240\302\240\302\240\302\240—bindir=/usr/bin’ $’\302\240\302\240\302\240\302\240—libdir=/usr/lib64′ $’\302\240\302\240\302\240\302\240—enable-pthreads’ $’\302\240\302\240\302\240\302\240—disable-shared’ $’\302\240\302\240\302\240\302\240—enable-static’ $’\302\240\302\240\302\240\302\240—enable-gpl’ $’\302\240\302\240\302\240\302\240—enable-libx264′ $’\302\240\302\240\302\240\302\240—enable-libmp3lame’
    Unknown option »    —prefix=/usr».
    See ./configure —help for available options.
    error: Bad exit status from /var/tmp/rpm-tmp.tJvHO4 (%build)

    RPM build errors:
    Bad exit status from /var/tmp/rpm-tmp.tJvHO4 (%build)

Добавить комментарий