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 который теперь можно выложить и развернуть на любой машине.
Надеюсь данный небольшой мануал, поможет вам собирать собственные пакеты для установки, с собственными конфигурационными файлами, что впоследствии облегчит вам жизнь.
+ 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)
Могло уже что то и поменяться, статье всё-таки 3 года, уберите из секции %build:
—prefix=»%{_prefix}» \