Дело было вечером, делать было нечего
Mar. 10th, 2011 11:24 pmПотрапило мені на очі на просторах інтернетів magnet-посилання на торент, і я вирішив перевірити, наскільки з ним дружить мій торент-клієнт. Стоїть він у мене на доманшьому сервері, зібраному з залишків старого десктопа, крутиться під gentoo linux. З’ясувалось, що мій rtorrent сам по собі взагалі не підтримує маґнет-лінків, але є патч, який дає можливість перезібрати його з такою підтримкою. Оскільки під gentoo всі програми і без того повністю збираються з вихідних кодів, я вирішив погратися з цим патчем і включити його в систему portage у себе на сервері, а заразом навчитися писати до неї ebuild’и. Отже:
Беремо мануал по цьому патчу:
За вказаними в статті посиланнями патчі (їх потрібно 3 штуки) знайти не вдається, але вони швидко знаходяться за адресами http://ovh.ttdpatch.net/~jdrexler/rt/old/dht-pex-static_map.diff &c.
Грузимо патчі:
# wget http://ovh.ttdpatch.net/~jdrexler/rt/old/dht-pex-static_map.diff # wget http://ovh.ttdpatch.net/~jdrexler/rt/old/magnet-uri.diff # wget http://ovh.ttdpatch.net/~jdrexler/rt/old/object-sstr.diff
Заглянувши в них, помічаємо, що вони стосуються не лише самого rtorrent, а і libtorrent — бібліотеки, що розробляється разом з rtorrent. Отже, завантажуємо та розпаковуємо ці обидва пакети. Спочатку спробуємо зібрати ці пакети з патчами вручну, без власного ebuild’а.
В gentoo операції установки пакетів виконуються утилітою emerge, але нам потрібна не повне встановлення пакета, а покрокове. Для цього є утиліта ebuild. Для кожної операції цій утиліті треба вказувати повне ім’я .ebuild-файла, тож зробимо собі скорочення:
# EBLT="ebuild /usr/portage/net-libs/libtorrent/libtorrent-0.12.6.ebuild" # EBRT="ebuild /usr/portage/net-p2p/rtorrent/rtorrent-0.8.6-r1.ebuild"
Завантажуємо та розпаковуємо:
# $EBLT fetch # $EBLT unpack # $EBRT fetch # $EBRT unpack
Для застосування патчу нам потрібно, щоб ці два пакети розташовувались в сусідніх підкаталогах з назвами libtorrent та rtorrent, тому створюємо симлінки:
# cd ~ # mkdir rtorrent_patch # cd rtorrent_patch # ln -s /var/tmp/portage/net-libs/libtorrent-0.12.6/work/libtorrent-0.12.6/ libtorrent # ln -s /var/tmp/portage/net-p2p/rtorrent-0.8.6-r1/work/rtorrent-0.8.6/ rtorrent
Пробуємо накласти патч:
# patch -p0 dht-pex-static_map.diff patching file rtorrent/src/core/view.cc patching file libtorrent/src/dht/dht_bucket.cc ..... Hunk #1 FAILED at 41. Hunk #2 FAILED at 79. 2 out of 2 hunks FAILED -- saving rejects to file libtorrent/src/torrent/Makefile.am.rej ..... patching file libtorrent/src/download/download_constructor.cc
Дивимось, що не так з патчем.
# less libtorrent/src/torrent/Makefile.am.rej
***************
*** 41,46 ****
rate.h \
resume.cc \
resume.h \
thread_base.cc \
thread_base.h \
throttle.cc \
--- 41,49 ----
rate.h \
resume.cc \
resume.h \
+ simple_string.h \
+ static_map.cc \
+ static_map.h \
thread_base.cc \
thread_base.h \
throttle.cc \
***************
*** 76,81 ****
poll_select.h \
rate.h \
resume.h \
thread_base.h \
throttle.h \
torrent.h \
--- 79,86 ----
poll_select.h \
rate.h \
resume.h \
+ simple_string.h \
+ static_map.h \
thread_base.h \
throttle.h \
torrent.h \
Дивимось у відповідний файл:
....
resume.cc \
resume.h \
throttle.cc \
throttle.h \
....
Бачимо, що набір файлів, прописаних в мейкфайлі, різниться з тим, до якого створювали патч. Вписуємо поміж resume.h та throttle.cc потрібні три строчки вручну, аналогічно чинимо з другим конфліктом.
Два інших патчі лягли, як влиті:
# patch -p0 < magnet-uri.diff # patch -p0 < object-sstr.diff
Файл, на якому виник конфлікт — конфігураційний файл утиліти automake, з нього вона утворює файл Makefile.in, а вже з нього утиліта автоконфігурування будує справжній Makefile. Я стикнувся з проблемою, яка полягала в тому, що я мав версію automake відмінну від тієї, якою будували мейкфайли автори, і після повної перебудови всіх мейкфайлів програма просто не схотіла збиратися. Тому я забекапив два файли Makefile.in (ті, що відповідають двом змінюваним патчами файлам Makefile.am — libtorrent/src/torrent/Makefile.in та libtorrent/src/protocol/Makefile.in), перебудував їх і подивився, що в них змінилося. Зрозуміло, що в них просто додалися додані нами до Makefile.am файли; я взяв diff старого та нового мейкфайла і вибрав лише ті відмінності, що стосувались цих файлів (пригадуючи при цьому анекдот про сисадміна, який перед встановленням нової версії ОС переглядав її коди і вибирав звідти лише те, що йому подобалось), і викинув ті, що були пов’язані зі зміною версії. Вийшло ось що:
# cat Makefile.in.diff --- libtorrent/src/torrent/Makefile.in 2009-11-30 17:12:19.000000000 +0200 +++ libtorrent/src/torrent/Makefile.in 2011-03-03 00:15:51.000000000 +0200 @@ -60,7 +52,8 @@ connection_manager.lo dht_manager.lo download.lo error.lo \ exceptions.lo http.lo object.lo object_stream.lo path.lo \ poll_epoll.lo poll_kqueue.lo poll_select.lo rate.lo resume.lo \ - throttle.lo torrent.lo tracker.lo tracker_list.lo + static_map.lo throttle.lo torrent.lo tracker.lo \ + tracker_list.lo libsub_torrent_la_OBJECTS = $(am_libsub_torrent_la_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp @@ -318,6 +310,9 @@ rate.h \ resume.cc \ resume.h \ + simple_string.h \ + static_map.cc \ + static_map.h \ throttle.cc \ throttle.h \ torrent.cc \ @@ -350,6 +345,8 @@ poll_select.h \ rate.h \ resume.h \ + simple_string.h \ + static_map.h \ throttle.h \ torrent.h \ tracker.h \
Цей патч я наклав на старі мейкфайли (довелося перерозпакувати пакети знову), після чого зробив бекапи обох каталогів libtorrent та rtorrent — вони нам ще знадобляться для побудови ebuild’а.
# tar cvjhf rtorr.tar.bz2 libtorrent rtorrent
Далі пакет зібрався нормально:
# $EBLT configure # $EBLT compile # $EBLT install # $EBLT qmerge
З останніх двох команд перша встановлює свіжезібраний пакет в тимчасове місцерозташування, для запобігання конфліктам з іншими пакетами, а друга переносить всі файли в реальну систему, відслідковуючи можливі конфлікти. Libtorrent обов’язково встановити до того, як компілювати rtorrent, оскільки останній використовує файли заголовків, які потрапляють до /usr/include/ лише після повного встановлення libtorrent. Отже, збираємо та встановлюємо клієнт:
# $EBRT configure # $EBRT compile # $EBRT install # $EBRT qmerge
Перезапустивши rtorrent, увімкнувши dht, обмін пірами, натискаємо backspace і вводимо (або вставляємо) magnet-посилання. В моєму випадку посилання додалось, але, оскільки в ньому не було вказано жодного трекера, то першого піра клієнт знайшов майже через добу. Попри це, торент успішно завантажився.
В наступній серії нашої передачі ви довідаєтесь, як з цього діла зібрати ebuild-файл і включити цей патч до дерева portage.
no subject
Date: 2011-03-12 04:59 pm (UTC)no subject
Date: 2011-03-12 05:04 pm (UTC)