Порой в стабильной версии пакетного дистрибутива 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 все эти имена знать не может заранее, как тут быть?