Etch-backports: cоздание бекпортов новых версий программ в Debian и Ubuntu на примере Etch и rtorrent 0.8.5

Порой в стабильной версии пакетного дистрибутива Linux нет новой версии какой-нибудь нужной программы. Что такое бекпорты и где их искать, думаю, понятно. Но что делать когда их там нет? Не менять же дистрибутив из за одного пакета. Очевидно — сделать бекпорт самому. Чем и займёмся на примере rtorrent 0.8.5 и Debian 4 Etch.

Deb-пакет представляет собой целую кучу файлов специального вида, поэтому подготовить их с нуля и собрать пакет имея только оригинальные исходники rtorrent — задача нетривиальная. Этим пусть майнтейнеры пакетов занимаются. Убедившись что пакет для rtorrent 0.8.5 есть в Debian Testing, упрощаем задачу до сборки под Debian 4 Etch пакета rtorrent от Debian Testing.

Пакеты в Debian и Ubuntu собираются из специальных пакетов-исходников, которые хранятся в репозитариях исходников. Добавляем нужные нам репозитарии исходников в /etc/apt/sources.list:

deb http://security.debian.org/ etch/updates main contrib
deb-src http://security.debian.org/ etch/updates main
deb http://www.backports.org/debian/ etch-backports main contrib non-free
deb-src http://www.backports.org/debian/ etch-backports main
deb http://ftp.us.debian.org/debian etch main contrib non-free
deb-src http://ftp.us.debian.org/debian etch main
deb-src http://ftp.us.debian.org/debian testing main

Т.е. одновременно подключены репозитарии стабильных пакетов и исходников нестабильных пакетов, из которых будем бекпортировать. Скачиваем списки пакетов как обычно:

aptitude update

Далее скачиваем в текущий каталог свеженький исходный пакет rtorrent:

mkdir src
cd src
apt-get source rtorrent

Глядим в файл rtorrent-0.8.5/debian/control и видим такое:

Build-Depends: debhelper (>= 5), cdbs, libtorrent-dev (>= 0.12.5),
               libsigc++-2.0-dev, libcurl4-openssl-dev, libncursesw5-dev,
               bc, libxmlrpc-c3-dev

Это список пакетов, которые надо поставить, чтобы собрать пакет rtorrent. Дальше, в общем случае, алгоритм действий не детерминирован. Надо исходя из соображений совместимости библиотек, их наличия в репозитариях и бекпортах, минимальных требований rtorrent и, наконец, проб и ошибок, удовлетворить все зависимости. С каждым пакетом варианта всего три: поставить из стабильного репозитария, возможно понизив требуемую версию, поставить из бекпортов, либо сделать бекпорт самому :) Пробив версии пакетов через packages.debian.org, в данном случае верным решением кажется сделать бекпорт libtorrent-dev, поставить libcurl3-openssl-dev вместо libcurl4-openssl-dev, а остальное поставить из стабильных репозитариев. Забегая вперед скажу, что если так сделать, rtorrent не соберется потому что в Debian 4 Etch слишком старая библиотека libxmlrpc-c3 и ее тоже придётся бекпортить, а уже при работе с rtorrent выяснится наличие бага в официальной сборке curl в Debian 4, из за которого некоторые торренты просто не качаются, решается бекпортом новой версии curl (см. ниже) Итого, ставим что есть:

aptitude install debhelper cdbs libsigc++-2.0-dev libncursesw5-dev bc

Дальше бекпортим libtorrent. Скачиваем исходный пакет:

apt-get source libtorrent11

Дальше дополняем лог изменений пакета, для чего есть специальная команда:

cd libtorrent-0.12.5
dch -i

В лог добавится фрагмент по шаблону и откроется редактор nano. К номеру версии пакета из Testing приписываем суффикс бекпорта ~bpo+1., гордо пишем свое имя и почту, сохраняем лог, запускаем сборку пакета:

debuild -us -uc

Ждем пока все скомпилируется. Если все ок, то в каталоге уровнем выше должны появиться deb-пакеты, ставим их:

cd ..
dpkg -i libtorrent11_0.12.5-2~bpo+1_i386.deb libtorrent-dev_0.12.5-2~bpo+1_i386.deb

Аналогично, бекпортим libxmlrpc-c3 и ставим полученные пакеты:

dpkg -i libxmlrpc-c3_1.06.27-1~bpo+1_i386.deb libxmlrpc-c3-dev_1.06.27-1~bpo+1_i386.deb

Теперь можно бекпортить и ставить rtorrent:

cd rtorrent-0.8.5
dch -i
debuild -us -uc
cd ..
dpkg -i rtorrent_0.8.5-2*.deb

Готово.

Отмечу возникшие при создании бекпорта проблемы. При неудачной сборке rtorrent в первый раз ошибку пришлось искать в логах configure и гуглить, чтобы додуматься libxmlrpc-c3 бекпортить тоже. Ещё после первой неудачной сборки rtorrent уже нельзя пересобрать так как остаются какие-то мешающие повторной сборке файлы. Приходится каталог rtorrent-0.8.5 удалять и делать заново apt-get source rtorrent. Отсутствие таких ошибок имеют ввиду, когда говорят о повышении качества пакетов и поддержке двойной компиляции, заявленной в целях релиза Debian 6.

UPD: Узнал как правильно именовать backport-пакеты. К имени оригинального пакета добавляется суффикс вида ~bpo<версия_debian>+<версия_бекпорта>, например ~bpo40+1. Указываем это в ченджлоге, а _i386 конце добавляется автоматически при сборке.


UPD: Сделал Etch backport для libxmlrpc-c3 1.16 из Debian Experimental и пересобрал с новой версией rtorrent так как с libxmlrpc-c3 1.06 некорректно работает веб-морда rutorrent. Новые файлы во вложении.


UPD: Столкнулся с проблемой в работе rtorrent под Debian, решаемой сборкой новой версии curl с поддержкой асинхронного разрешения DNS через ares.

Пакет для c-ares и dev можно взять тут: http://apt.byteme.org.uk/pool/main/c/c-ares/

Чтобы собрать пакет curl необходимо обновить debhelper и quilt из бекпортов, сделать и поставить бекпорт libssh2-1 и libssh2-1-dev, дальше так:

cd ~/src
apt-get source libcurl3
nano curl-7.19.5/debian/rules
# деалем --disable-ipv6 --enable-ares
dch -i
# пишем ченджлог
aptitude install autoconf libtool automake1.9 libgnutls-dev stunnel libldap2-dev libgcrypt11-dev
debuild -us -uc

Далее ставим полученные пакеты libcurl, libcurl-dev и пересобираем пакеты xmlrpc/libtorrent/rtorrent.

Ниже ссылки на deb-пакеты, необходимые для установки rtorrent 0.8.5 под Debian 4 Etch.

UPD: Кто-то закинул ссылку на этот пост на ЛОР. В комментариях говорят checkinstall надо использовать, а не бекпортить, так как это проще. Про checkinstall я не знал, надо будет попробовать, но думаю его лучше использовать когда нет нужного пакета в Testing, Unstable или Experimental для бекпорта. Во-первых, все сложные моменты с необходимостью обновления заранее неизвестно каких пакетов остаются, в данном случае xmlrpc и curl все равно нужно обновлять, иначе rtorrent соберется, но просто не будет работать как надо. Во-вторых, половину собранных пакетов в процессе накладывали на исходники какие-то дебиановские патчи, думаю они не просто так. В-третьих, непонятно как у пакета checkinstall с зависимостями, не выйдет ли это боком при обновлении системы если надо пересобрать пакет типа curl, от которого зависят другие пакеты Debian. В-четвертых, не создадутся dev-пакеты и сопутствующие пакеты, например при сборке единственного source-пакета libcurl3 создаются deb-пакеты libcurl3-gnutl, libcurl4-gnutls-dev, libcurl4-openssl-dev, curl, libcurl3 и libcurl3-dbg, я эти подробности опустил, но от этих пакетов зависят другие пакеты, checkinstall все эти имена знать не может заранее, как тут быть?

Блог: RU Linux
Прикрепленный файлРазмер
rtorrent_0.8.5-2~bpo40+1_i386.deb390.05 кб
libtorrent11_0.12.5-2~bpo40+1_i386.deb430.12 кб
libxmlrpc-c3_1.16.07-1~bpo40+1_i386.deb296.38 кб
libssh2-1_1.2.1-1~bpo40+1_i386.deb72.17 кб
libc-ares1_1.5.1-0_i386.deb36.38 кб
curl_7.19.5-1.1~bpo40+1_i386.deb190.16 кб
libcurl3_7.19.5-1.1~bpo40+1_i386.deb214.37 кб
libcurl3-gnutls_7.19.5-1.1~bpo40+1_i386.deb194.74 кб