Как пересобрать RPM-пакет

Материал из База знаний проекта Russian Fedora

Перейти к: навигация, поиск

В этой статье мы расскажем только о самом простом случае пересборки.

Мы будем считать, что у вас установлена относительно новая Fedora, а пакет, который вам необходим, уже был собран кем-то до вас, и достаточно качественно. Поэтому задача - не создать пакет с нуля, а немного изменить конфигурацию или подправить исходный код.

Важно
Все команды по сборке пакета выполняются от пользователя. Для сборки пакета не нужны права root-а (за исключением команды установки зависимостей, см. ниже).

Содержание

Когда пересобирать пакет не стоит

Если вам необходимо поменять лишь версию ПО, не меняя его конфигурации, пакет скорее всего пересобирать не придется.

Для поиска подходящей версии пакета можно воспользоваться:

$ dnf list --enablerepo=* --disablerepo=*debug* --showduplicates ИМЯ_ПАКЕТА

Предварительные действия

Перед началом убедитесь, что в системе установлены необходимые пакеты, включая следующие:

Чтобы установить эти пакеты, воспользуйтесь командой:

$ su -c 'dnf install rpmdevtools dnf-plugins-core'

Чтобы создать необходимую для сборки пакетов структуру каталогов, воспользуйтесь командой:

$ rpmdev-setuptree

Командой rpmdev-setuptree будут созданы каталог ~/rpmbuild и подкаталоги (SPECS, BUILD и т.д.)

К делу

Для простоты в качестве примера рассмотрим пересборку пакета xscreensaver на Fedora 24. Если вы уже все знаете и умеете, можете сразу перейти к Краткому содержанию

Шаг первый: находим исходники пакета

$ dnf download --source xscreensaver

Утилита dnf download сама найдет исходники пакета и загрузит файл xscreensaver-5.35-4.fc24.src.rpm в текущий каталог.

Лучшие источники пакетов с точки зрения качества исходников
это build-серверы Koji Fedora и Koji Russian Fedora, а также тикеты в RedHat Bugzilla с заголовком "Review Request".


Шаг второй: подготавливаем инфраструктуру

В старых инструкциях вы можете встретить команды для создания дерева для сборки rpm. Однако сейчас необходимые каталоги создаются автоматически.

Установите src.rpm-пакет командой:

$ rpm -ivh xscreensaver-5.35-4.fc24.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 "dnf builddep /home/имя_пользователя/rpmbuild/SPECS/xscreensaver.spec"

Эта команда анализирует spec-файл и устанавливает все необходимые для сборки пакета зависимости, включая библиотеки и заголовочные файлы, автоматически. Разумеется она работает так как задумано только для пакетов из репозиториев, то есть пакетов, исходники которых получены с помощью dnf download. Если вы взяли пакет "со стороны" проблемы с зависимостями придется решать вручную по ходу сборки. Это отдельная тема, которой здесь мы касаться не будем. Замечу только что по возможности зависимости стоит разрешать за счет пакетов из репозиториев. Для поиска пакета содержащего какую-то конкретную библиотеку используйте dnf provides (синтаксис аналогичен 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
# Enable account type pam validation on F-18+,
# debian bug 656766
%if 0%{?fedora} >= 18
CONFIG_OPTS="$CONFIG_OPTS --enable-pam-check-account-type"
%endif
# xscreensaver 5.30
CONFIG_OPTS="$CONFIG_OPTS --with-record-animation"

# This is flaky:
# CONFIG_OPTS="$CONFIG_OPTS --with-login-manager"

%if 0%{?use_clang_analyze} >= 1
%global _configure scan-build --use-analyzer %_bindir/clang ./configure
%endif

unlink configure || :
ln -s ../configure .
%configure $CONFIG_OPTS || { cat config.log ; sleep 10 ; exit 1; }
rm -f configure

Правка исходников

Создаем патч

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

$ rpmbuild -bp ~/rpmbuild/SPECS/xscreensaver.spec

Флаг -bp означает подготовительный этап сборки: архив ~/rpmbuild/SOURCES/xscreensaver-5.35.tar.gz будет распакован в папку ~/rpmbuild/BUILD/xscreensaver-5.35, после чего будут применены все перечисленные в spec-файле патчи.

Папка ~/rpmbuild/BUILD/xscreensaver-5.35 пересоздается с нуля каждый раз при запуске сборки пакета, поэтому изменять файлы надо не в ней, а в её копии.

Делаем рабочую копию:

$ cp -rp ~/rpmbuild/BUILD/xscreensaver-5.35 ~/rpmbuild/BUILD/xscreensaver-5.35-1

Наконец, делаем то, ради чего все затевалось: редактируем файлы в рабочей копии ~/rpmbuild/BUILD/xscreensaver-5.35-1

Например, заменяем картинки в каталоге ~/rpmbuild/BUILD/xscreensaver-5.35-1/utils/images/ на что-нибудь более интересное.

Теперь создаем патч с нашими изменениями. Для этого переходим в папку BUILD

$ cd ~/rpmbuild/BUILD

и выполняем команду diff, рекурсивно сравнивающую два каталога:

$ diff -uNr xscreensaver-5.35/ xscreensaver-5.35-1/ > ~/rpmbuild/SOURCES/xscreensaver-5.35-fedora-logos.patch

Сначала указывается неизмененный каталог, потом исправленный. Результат записывается в файл с каким-нибудь говорящим названием и кладется в папку ~/rpmbuild/SOURCES.

Добавляем патч к пакету

Для того чтобы патч применялся при сборке его необходимо прописать в 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.35-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 -b .logos

Добавка -b .logos означает, что перед применением патча к какому-нибудь файлу file, его старая версия будет сохранена в файле с именем file.logos. Что удобно для отладки и отслеживания патчей.

Оформляем измененный пакет

Вне зависимости от того меняли вы только опции configure или правили исходники, пакет который вы собрете будет отличаться от старого. Это необходимо отметить в версии пакета и в Changelog-е.

Меняем строку Version

Version:         %{mainversion}.1

и добавляем пункт в секцию %changelog

%changelog
* Tue Sep 27 2016 Bookwar <example_mailbox@example.com> - 1:5.35.1
- Replaced xscreensaver logo by fedora-vertical logo.

Окончательная сборка

Запускаем сборку новых SRPM- и RPM-пакетов командой

$ rpmbuild -ba ~/rpmbuild/SPECS/xscreensaver.spec

Если все было сделано правильно, готовый пакет появится в каталоге ~/rpmbuild/RPMS/

Краткое содержание

 su -c 'dnf install rpmdevtools dnf-plugins-core'
export PACKAGE_NAME=xscreensaver
dnf download --source $PACKAGE_NAME
rpm -ivh $PACKAGE_NAME.*.src.rpm
su -c "dnf 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
cd ~/rpmbuild/BUILD
diff -uNr $PACKAGE_NAME-1.0/ $PACKAGE_NAME-1.0-new/ > ~/rpmbuild/SOURCES/$PACKAGE_NAME-1.0-my-patch.patch
vim ~/rpmbuild/SPECS/$PACKAGE_NAME.spec

Исправляем четыре места:

Version:         %{mainversion}.1
PatchN:         $PACKAGE_NAME-1.0-my-patch.patch
%patchN -p1
%changelog
...
rpmbuild -ba ~/rpmbuild/SPECS/$PACKAGE_NAME.spec
 rpmbuild -bs ~/rpmbuild/SPECS/$PACKAGE_NAME.spec