Как пересобрать RPM-пакет
Материал из База знаний проекта Russian Fedora
В этой статье мы расскажем только о самом простом случае пересборки.
Мы будем считать, что у вас установлена относительно новая Fedora, а пакет, который вам необходим, уже был собран кем-то до вас, и достаточно качественно. Поэтому задача - не создать пакет с нуля, а немного изменить конфигурацию или подправить исходный код.
Содержание |
Когда пересобирать пакет не стоит
Если вам необходимо поменять лишь версию ПО, не меняя его конфигурации, пакет скорее всего пересобирать не придется.
Для поиска подходящей версии пакета можно воспользоваться:
- поиском по всем доступным репозиториям:
$ yum list --enablerepo=* --disablerepo=*debug* --showduplicates ИМЯ_ПАКЕТА
- поиском по build-серверам Koji Fedora и Koji Russian Fedora.
Предварительные действия
Перед началом убедитесь, что в системе установлены необходимые пакеты, включая следующие:
- rpmdevtools
- yum-utils
Чтобы установить эти пакеты, воспользуйтесь командой:
$ su -c 'yum install yum-utils rpmdevtools'
К делу
Для простоты в качестве примера рассмотрим пересборку пакета xscreensaver на Fedora 16. Если вы уже все знаете и умеете, можете сразу перейти к Краткому содержанию
Шаг первый: находим исходники пакета
- Если пакет входит в репозитории Fedora, RPMFusion, RussianFedora или любые другие репозитории, подключенные в вашей системе, выполните команду:
$ yumdownloader --source xcreensaver
Утилита yumdownloader сама найдет исходники пакета и загрузит файл xscreensaver-5.14-1.fc16.src.rpm в текущий каталог.
- Если нужного вам пакета нет в репозиториях - ищите вручную. К вашим услугам http://rpmfind.net, http://rpm.pbone.net/, http://atrpms.net/ и вся мощь Google. Чем "ближе" система, пакет от которой вы найдете, к Fedora - тем лучше. Так, например, если у вас установлена Fedora 15, то src.rpm от Fedora 13 подойдет вам лучше чем src.rpm от CentOS 6. В свою очередь src.rpm от CentOS много лучше чем src.rpm от Mandriva или OpenSuse.
Шаг второй: подготавливаем инфраструктуру
В старых инструкциях вы можете встретить команды для создания дерева для сборки rpm. Однако сейчас необходимые каталоги создаются автоматически.
Установите src.rpm-пакет командой:
$ rpm -ivh xscreensaver-5.14-1.fc16.src.rpm
Напомню, команда выполняется от пользователя. Права root-а не нужны.
Не стоит пугаться сообщений вида
warning: user mockbuild does not exist - using root warning: group mockbuild does not exist - using root
Для нашей задачи эти уведомления никакой роли не играют. Ошибки здесь тоже никакой нет.
Команда rpm "установила" src.rpm-пакет не в систему, а локально, в специально созданную в домашнем каталоге пользователя папку ~/rpmbuild. В ~/rpmbuild/SOURCES лежат собственно исходники и патчи, в ~/rpmbuild/SPECS соответствующий spec-файл.
Теперь устанавливаем зависимости необходимые для сборки (команда выполняется от пользователя, но она запросит пароль рута для установки пакетов)
$ su -c "yum-builddep ~/rpmbuild/SPECS/xscreensaver.spec"
Эта команда анализирует spec-файл и устанавливает все необходимые для сборки пакета зависимости, включая библиотеки и заголовочные файлы, автоматически. Разумеется она работает так как задумано только для пакетов из репозиториев, то есть пакетов, исходники которых получены с помощью yumdownloader. Если вы взяли пакет "со стороны" проблемы с зависимостями придется решать вручную по ходу сборки. Это отдельная тема, которой здесь мы касаться не будем. Замечу только что по возможности зависимости стоит разрешать за счет пакетов из репозиториев. Для поиска пакета содержащего какую-то конкретную библиотеку используйте yum provides.
Шаг третий: собственно изменения
Опции configure
Для изменения опций сборки достаточно внести исправить секцию %configure в spec-файле.
Вот так, например, выглядит соответствующий кусок файла xscreensaver.spec.
CONFIG_OPTS="--prefix=%{_prefix} --with-pam --without-shadow --without-kerberos"
CONFIG_OPTS="$CONFIG_OPTS --without-setuid-hacks"
CONFIG_OPTS="$CONFIG_OPTS --with-text-file=%{default_text}"
CONFIG_OPTS="$CONFIG_OPTS --with-x-app-defaults=%{_datadir}/X11/app-defaults"
CONFIG_OPTS="$CONFIG_OPTS --disable-root-passwd"
CONFIG_OPTS="$CONFIG_OPTS --with-browser=xdg-open"
# From xscreensaver 5.12, login-manager option is on by default
# For now, let's enable it on F-14 and above
%if 0%{?fedora} >= 14
pushd TMPBINDIR
ln -sf /bin/true gdmflexiserver
popd
%else
CONFIG_OPTS="$CONFIG_OPTS --without-login-manager"
%endif
# Enable extrusion on F-13 and above
%if 0%{?fedora} <= 12
CONFIG_OPTS="$CONFIG_OPTS --without-gle"
%endif
# This is flaky:
# CONFIG_OPTS="$CONFIG_OPTS --with-login-manager"
unlink configure || :
ln -s ../configure .
%configure $CONFIG_OPTS
rm -f configure
Правка исходников
Создаем патч
Для того чтобы внести изменения в исходные файлы, необходимо сначала эти файлы получить. Сделать это можно командой
$ rpmbuild -bp ~/rpmbuild/SPECS/xscreensaver.spec
Флаг -bp означает подготовительный этап сборки: архив ~/rpmbuild/SOURCES/xscreensaver-5.14.tar.gz будет распакован в папку ~/rpmbuild/BUILD/xscreensaver-5.14, после чего будут применены все перечисленные в spec-файле патчи.
Папка ~/rpmbuild/BUILD/xscreensaver-5.14 пересоздается с нуля каждый раз при запуске сборки пакета, поэтому изменять файлы надо не в ней, а в её копии.
Делаем рабочую копию:
$ cp -rp ~/rpmbuild/BUILD/xscreensaver-5.14 ~/rpmbuild/BUILD/xscreensaver-5.14-1
Наконец, делаем то, ради чего все затевалось: редактируем файлы в рабочей копии ~/rpmbuild/BUILD/xscreensaver-5.14-1
Например, заменяем картинки в каталоге ~/rpmbuild/BUILD/xscreensaver-5.14-1/utils/images/ на что-нибудь более интересное.
Теперь создаем патч с нашими изменениями. Для этого переходим в папку BUILD
$ cd ~/rpmbuild/BUILD
и выполняем команду diff, рекурсивно сравнивающую два каталога:
$ diff -uNr xscreensaver-5.14/ xscreensaver-5.14-1/ > ~/rpmbuild/SOURCES/xscreensaver-5.14-fedora-logos.patch
Сначала указывается неизмененный каталог, потом исправленный. Результат записывается в файл с каким-нибудь говорящим названием.
Добавляем патч к пакету
Для того чтобы патч применялся при сборке его необходимо прописать в spec-файле пакета.
Патчи перечесляются в начале spec-файла, сразу после строчек Name, Version и Source. Каждый патч имеет свой уникальный номер. Так как наш патч должен применяться последним по счету, его номер должен быть самым большим.
Интересующий нас кусок файла xscreensaver.spec выглядит так:
Patch1: xscreensaver-5.00b5-sanitize-hacks.patch # Change webcollage not to access to net # Also see bug 472061 Patch21: xscreensaver-5.11-webcollage-default-nonet.patch # ## Patches already sent to the upsteam # Remove "AC_PROG_CC' was expanded before it was required" warning Patch30: xscreensaver-5.11-conf264.patch # ## Patches which must be discussed with upstream # # Update Japanese po file Patch32: xscreensaver-5.13-dpmsQuickoff-japo.patch # # driver/test-passwd tty segfaults Patch41: xscreensaver-5.12-test-passwd-segv-tty.patch # patch to compile driver/test-xdpms Patch42: xscreensaver-5.12-tests-miscfix.patch Patch50: xscreensaver-5.14-fedora-logos.patch
Теперь нужно добавить патч в подготовительную секцию %prep (ту самую, которая выполняется при запуске rpmbuild -bp). Выглядит это следующим образом:
%prep
%setup -q -n %{name}-%{mainversion}%{?beta_ver}
%patch1 -p1 -b .sanitize-hacks
%patch21 -p1 -b .nonet
%patch32 -p1 -b .dpmsoff_japo
%patch41 -p1 -b .test_passwd
%patch42 -p1 -b .test_misc
%patch50 -p1
Оформляем измененный пакет
Вне зависимости от того меняли вы только опции configure или правили исходники, пакет который вы собрете будет отличаться от старого. Это необходимо отметить в версии пакета и в Changelog-е.
Меняем строку Version
Version: %{mainversion}.1
и добавляем пункт в секцию %changelog
%changelog * Tue Sep 27 2011 Bookwar <example_mailbox@example.com> - 1:5.14.1 - Replaced xscreensaver logo by fedora-vertical logo.
Окончательная сборка
Запускаем сборку новых SRPM- и RPM-пакетов командой
$ rpmbuild -ba ~/rpmbuild/SPECS/xscreensaver.spec
Если все было сделано правильно, готовый пакет появится в каталоге ~/rpmbuild/RPMS/
Краткое содержание
- Подготавливаем инструменты
su -c 'yum install yum-utils rpmdevtools'
- Получаем исходники
export PACKAGE_NAME=xscreensaver yumdownloader --source $PACKAGE_NAME rpm -ivh $PACKAGE_NAME.*.src.rpm su -c "yum-builddep ~/rpmbuild/SPECS/$PACKAGE_NAME.spec" rpmbuild -bp ~/rpmbuild/SPECS/$PACKAGE_NAME.spec
- Рабочая копия
cp -r ~/rpmbuild/BUILD/$PACKAGE_NAME-1.0 ~/rpmbuild/BUILD/$PACKAGE_NAME-1.0-new
- Правим
~/rpmbuild/BUILD/$PACKAGE_NAME-1.0-new
- Создаем патч
cd ~/rpmbuild/BUILD diff -uNr $PACKAGE_NAME-1.0/ $PACKAGE_NAME-1.0-new/ > ~/rpmbuild/SOURCES/$PACKAGE_NAME-1.0-my-patch.patch
- Правим spec
vim ~/rpmbuild/SPECS/$PACKAGE_NAME.spec
Исправляем четыре места:
Version: %{mainversion}'''.1'''
Patch'''N''': '''$PACKAGE_NAME-1.0-my-patch'''.patch
%patch'''N''' -p1
%changelog
...
- Собираем
rpmbuild -ba ~/rpmbuild/SPECS/$PACKAGE_NAME.spec
