четверг, 23 декабря 2010 г.

Как пересобирать пакеты Debian

Этот пост является переводом
поста Рафаэля Герцога (Raphaël Hertzog)
“Howto to rebuild Debian packages”



От переводчика: мне не хотелось переводить «source package» как «исходный пакет», т.к. такой перевод может наталкивать на мысль о распаковке deb–пакета с бинарниками. Поэтому в статье использован другой перевод — «пакет исходных кодов». Звучит, конечно, убого, но всяко лучше, чем первое.

Умение пересобирать пакеты Debian является очень полезным навыком. Он является необходимым для многих задач, с которыми может столкнуться администратор: включить фичу, выключенную в официальном пакете; пересобрать пакет для использования в другом дистрибутиве (например, пересобрать пакет из Debian Testing для Debian Stable — мы называем это обратным портированием (backporting)); добавить исправление бага, подготовленное разработчиками из апстрима, и так далее. Узнайте о четырёх шагах, позволяющих пересобирать пакеты Debian.


Скачивание пакета с исходным кодом


Предпочитаемым путём получения пакетов с исходным кодом является APT. Он может скачивать их из репозиториев с исходниками, прописанных у вас в /etc/apt/sources.list, например:

deb-src http://ftp.debian.org/debian unstable main contrib non-free
deb-src http://ftp.debian.org/debian testing main contrib non-free
deb-src http://ftp.debian.org/debian stable main contrib non-free

Заметьте, что строки начинаются с «deb-src» вместо обычного «deb». Это говорит APT'у о том, что мы заинтересованы в пакетах с исходным кодом, а не бинарниками.

После apt-get update можно использовать apt-get source publican, чтобы получить последнюю версию пакета с исходными кодами «publican». Можно также указать дистрибутив, из которого следует получать пакет, используя следующий синтаксис: «package/distribution». apt-get source publican/testing получит пакет с исходниками publican и распакует их в текущую директорию (используя dpkg-source -x, так что вам понадобится пакет dpkg-dev).

$ apt-get source publican/testing
Reading package lists... Done
Building dependency tree
Reading state information... Done
NOTICE: 'publican' packaging is maintained in the 'Git' version control system at:
git://git.debian.org/collab-maint/publican.git
Need to get 727 kB of source archives.
Get:1 http://nas/debian/ squeeze/main publican 2.1-2 (dsc) [2253 B]
Get:2 http://nas/debian/ squeeze/main publican 2.1-2 (tar) [720 kB]
Get:3 http://nas/debian/ squeeze/main publican 2.1-2 (diff) [4728 B]
Fetched 727 kB in 0s (2970 kB/s)
dpkg-source: info: extracting publican in publican-2.1
dpkg-source: info: unpacking publican_2.1.orig.tar.gz
dpkg-source: info: unpacking publican_2.1-2.debian.tar.gz
$ ls -dF publican*
publican-2.1/                 publican_2.1-2.dsc
publican_2.1-2.debian.tar.gz  publican_2.1.orig.tar.gz

Если APT использовать не хочется, или если пакет с исходными кодами лежит не в APT'овском репозитории, можно скачать его с помощью команды dget -u dsc-url, где dsc-url — это URL .dsc–файла, представляющего пакет с сорцами. dget предоставляется пакетом devscripts. Заметим, что опция -u отключает проверку источника пакета перед его распаковкой.

Установка сборочных зависимостей


И снова APT сделает за вас всю грязную работу: достаточно лишь запустить apt-get build-dep foo, и сборочные зависимости для пакета foo будут установлены. Он поддерживает тот же синтаксический сахар, что и apt-get source, так что для установки зависимостей, требуемых для сборки тестируемой версии publican, можно использовать команду apt-get build-dep publican/testing.

Если пользоваться APT'ом нельзя, перейдите в директорию с распакованным исходным кодом и запустите dpkg-checkbuilddeps. Он покажет список неудовлетворённых сборочных зависимостей (если такие есть; в противном случае ничего выведено не будет и можно будет спокойно продолжать). Немного копирования–вставки и вызовов apt-get install — и вы за пару секунд установите все необходимые пакеты.

Осуществление изменений


Я не буду подробно останавливаться на этом шаге, так как он сильно зависит от преследуемых вами целей. Возможно, вам придётся править debian/rules, а может, вы просто примените патч.

Впрочем, вне зависимости от того, сделали вы изменения или просто пересобрали пакет в другом окружении, вам следует поменять версию пакета. Это можно сделать с помощью «dch --local foo» (снова из пакета devscripts), где «foo» следует заменить на короткое имя, идентифицирующее вас как поставщика обновлённой версии. Эта команда обновит debian/changelog и пригласит вас написать короткую заметку о внесённых изменениях.

Сборка пакета


Последний шаг — самый простой, так как всё уже на своих местах. Вы должны находиться в директории с распакованными исходниками.

Теперь запускайте либо «debuild -us -uc» (рекомендуемый выбор, требуется пакет devscripts), либо сразу «dpkg-buildpackage -us -uc». Опции «-us -uc» указывают на то, что шаг подписывания пакета будет пропущен; в противном случае в конце сборки было бы сгенерировано (безобидное) сообщение, если бы у вас не нашлось GPG–ключа для имени, указанного в первой записи в changelog'е.

$ cd publican-2.1
$ debuild -us -uc
 dpkg-buildpackage -rfakeroot -D -us -uc
dpkg-buildpackage: export CFLAGS from dpkg-buildflags (origin: vendor): -g -O2
dpkg-buildpackage: export CPPFLAGS from dpkg-buildflags (origin: vendor):
dpkg-buildpackage: export CXXFLAGS from dpkg-buildflags (origin: vendor): -g -O2
dpkg-buildpackage: export FFLAGS from dpkg-buildflags (origin: vendor): -g -O2
dpkg-buildpackage: export LDFLAGS from dpkg-buildflags (origin: vendor):
dpkg-buildpackage: source package publican
dpkg-buildpackage: source version 2.1-2rh1
dpkg-buildpackage: source changed by Raphaël Hertzog
 dpkg-source --before-build publican-2.1
dpkg-buildpackage: host architecture i386
[...]
dpkg-deb: building package `publican' in `../publican_2.1-2rh1_all.deb'.
 dpkg-genchanges  >../publican_2.1-2rh1_i386.changes
dpkg-genchanges: not including original source code in upload
 dpkg-source --after-build publican-2.1
dpkg-buildpackage: binary and diff upload (original source NOT included)
Now running lintian...
Finished running lintian.

Сборка завершена, обновлённые пакеты с исходным кодом и бинарниками были сгенерированы в родительской директории.

$ cd ..
$ ls -dF publican*
publican-2.1/                    publican_2.1-2rh1.dsc
publican_2.1-2.debian.tar.gz     publican_2.1-2rh1_i386.changes
publican_2.1-2.dsc               publican_2.1-2rh1_source.changes
publican_2.1-2rh1_all.deb        publican_2.1.orig.tar.gz
publican_2.1-2rh1.debian.tar.gz

Копируете статью — поставьте ссылку!

9 комментариев:

Анонимный комментирует...

"Пакет исходников" не? Или принципиально используется строгий оффициальный стиль?

Minoru комментирует...

Хех. Анонимус знает всё :) Действительно, можно было бы и так, тем более что для избежания постоянных повторов я скатывался даже до сленга («сорцы»). Впрочем, получилось неплохо, так что лично я смысла что–то менять не вижу. Или сто́ит–таки?

virens комментирует...

@Анонимный
Кстати да, "пакет исходников" звучит краше. Я бы в посте поменял. Но пост и так хорош.

@Minoru
Слушай, а в чём сакральный смысл apt-get source?
Я обычно тягаю исходники с домашней страницы авторов, потом dh_make --createorig и далее debuild. Чем не?

И ещё. Можно многоуважаемого граммарфюрера попросить пройтись калёным железом по этому посту? Там комментарий можно оставить даже, будешь, пардон, первонахом :-)

Да, кстати, есть предложение собрать твои гармошки по ZSH в один большой баян + какие-нибудь неопубликованные заметки по ZSH и запостить у меня. Я сейчас в отпуске, так что время есть. Черкни чего-нибудь на mydebianblog жымайл ком, а то я твою почту что-то не найду.

Minoru комментирует...

> Слушай, а в чём сакральный смысл apt-get source?
> Я обычно тягаю исходники с домашней страницы авторов, потом dh_make --createorig и далее debuild. Чем не?


Смысл в том, что после apt-get source ты получаешь исходники пакета. То есть если ты после этого сразу скажешь debuild, у тебя (теоретически) должен получиться точно такой же пакетик, что лежит в официальных репозиториях. Основное же преимущество такого подхода в том, что у тебя появляется уже работающий оформленный пакет, и всё, что тебе нужно — внести свои мелкие коррективы. Если же ты начинаешь с апстримового кода и dh_make, ты фактически самостоятельно создаёшь новый пакет. Это, по идее, круче и сложнее, но и проблем огрести можно.

> И ещё. Можно многоуважаемого граммарфюрера попросить пройтись калёным железом по этому посту? Там комментарий можно оставить даже, будешь, пардон, первонахом :-)
Ой, Doxygen в Matlab'е… Всё никак не доберусь до него. Вообще у меня тут как бы зачёты всё время, это вчера вот просто прорвало — услышал про патчик, живенько адаптировал под ту версию coreutils, что водится в наших сквизовских палестинах, собрал пакетик по руководству, ссылка на которое недавно по RSS прилетала — а потом взял да и написал обо всём этом. Ещё вот никак не доперевожу пост про dpatch — оно тоже с перепаковкой (да и сборкой с нуля тоже) связано.

На мыло вечерком черкну, ок.

virens комментирует...

@Minoru

Вообще у меня тут как бы зачёты всё время, это вчера вот просто прорвало
Упс, извини, я совсем забыл. У меня сейчас обратная ситуация - я в отпуске :-) Университет закрыт на новогодние праздники до 5 января, сижу посты строчу (потом будет некогда), в комментах троллю :-)

Ты там от зачётов не отвлекайся. Блог блогом, а зачёты - это серьёзно.

Ещё вот никак не доперевожу пост про dpatch — оно тоже с перепаковкой (да и сборкой с нуля тоже) связано.
Слушай, а ты попользуй scheduled posts. Удобственно: ставишь дату, скажем, в январе в настройках поста, и жмёшь "Опубликовать пост". И всё - идёшь заниматься делами, а пост опубликуется без тебя. И провалов в датах не будет (в Октябре - ни одного поста, а в Декабре целых три подряд), и самому удобно.

Я так уже давно пробавляюсь. Два поста в месяц - и обсудить успеваем, и мне не наряжно.

И да, за комменты в Doxygen огромное спасибо - уже поправил.

Minoru комментирует...

Отпуск — это классно! Приятного отдыха! ;)

Scheduled posts я только для всяких поздравлений юзаю — всё остальное публикую сразу же. Просто не вижу смысла придерживать посты, если они уже готовы. Комментаторов у меня не так уж много, читателей всего полторы сотни (ну, плюс ещё runix — там поболее, конечно), так что я не боюсь быть заваленным почтой :) Да и в «провалах» ничего страшного не вижу — ну, не случилось ничего интересного, вот и не пишу.

Тут ещё такое дело — однажды взявшись за написание постов раз в неделю, будет сложно от этой техники отказаться. Любой читатель твоего блога знает, что каждые две недели в понедельник он получит новую интересненькую статью. Мне почему–то не приходит в голову так много тем для постов, как тебе, так что мои читатели могут рассчитывать только на мои спонтанные всплески вдохновения.

Paul Rufous комментирует...

debuild - надстройка dpkg-buildpackage? Ключи те же.

Minoru комментирует...

> debuild - надстройка dpkg-buildpackage? Ключи те же.
И да, и нет. Да, debuild использует dpkg-buildpackage, но не только его. После сборки пакета запускаются lintian (проверка пакета на ошибки) и debsign.

virens комментирует...

@Minoru комментирует...
Просто не вижу смысла придерживать посты, если они уже готовы.
Смысл в том, чтобы поддерживать регулярную жизнь блога. Вот у меня, например, два поста в месяц, по понедельникам. Народ привык, мне удобно, и жизнь блога не обрывается - в каждом месяце есть посты.

Это приводит к тому, что намного меньшее количество читателей отписываются, думая, что блог помер.

"Но ты был не прав,
ты всё спалил за час,
и через час
большой огонь угас..."


Выкидывать кучу постов в один-два дня бессмысленно - ты потом не сможешь ничего написать долго и снова уйдёшь в тину. И без того немногочисленные читатели разбегутся, а новые, видя здоровенные прогалы в постинге, вряд ли подпишутся.

Комментаторов у меня не так уж много, читателей всего полторы сотни (ну, плюс ещё runix — там поболее, конечно), так что я не боюсь быть заваленным почтой
А ты подумай, почему их немного. Вот тебе пища для размышлений:
1. в постинге большие периоды затишья
2. названия постов плохо ищутся поисковыми машинами
3. часть постов слишком короткие, чтобы быть самостоятельными постами


Да и в «провалах» ничего страшного не вижу - ну, не случилось ничего интересного, вот и не пишу.
Это точка зрения писателя. Теперь посмотри со стороны читателя. Вот ты зашёл на блог, а там четыре месяца ничего не пишут. В предыдущие месяцы по одному посту. Что ты подумаешь об этом? Блог помер. И не станешь подписываться на заведомо дохлый фид.

Попробуй выкладывать посты регулярно - скажем, по средам. Два-три поста в месяц, с хорошим интервалом между ними. И посмотри на статистику подписчиков. Я готов поспорить, что их будет больше.


Тут ещё такое дело — однажды взявшись за написание постов раз в неделю, будет сложно от этой техники отказаться.
Это слишком часто, как мне кажется. Я тут написал пост о десктопе. Это заняло ДВОЕ СУТОК. Но у меня есть время сейчас, потом его не будет. Именно поэтому, как ты уже видел у меня в dashboard, у меня посты расписаны на следующий год.

Любой читатель твоего блога знает, что каждые две недели в понедельник он получит новую интересненькую статью.
Справедливости ради, далеко не все они интересные.
А вот чего читатель блога не знает, так это то, что написаны они ЗАДОЛГО до появления. И появляются они дважды в неделю тогда, когда я занят другими вещами. Инода я забываю об этом и узнаЮ, что на моём блоге что-то опубликовано, по комментариям на почту :-)

Мне почему-то не приходит в голову так много тем для постов, как тебе
Как говорили классики, "достигается упражнением". Написать можно о чём угодно. Последний мой пост о Файрфоксе целиком стибрен со слешдота - с дополнениями и скриншотами, естественно. Или вот помнишь мой пост про монтирование разделов? Там есть что-нибудь, чего нет в man mount? Нет. А что там есть? Сбор и обобщение того, "куды лошадь запрягать", с чётким описанием и хорошим оформлением.

Посту не обязательно быть оригинальным в плане новизны. Хороший повар приготовит банальную яичницу так, что пальчики оближешь :-) Главное - как подать.

так что мои читатели могут рассчитывать только на мои спонтанные всплески вдохновения.
Они случаются не часто. Идея отложенных постов в том и состоит: разнести твоё вдохновение на максимально возможный срок. Сборка пакетов в Debian - это не обзор новой альфы Убунты. Подождёт месяцок и не протухнет.

Отправить комментарий

 
Blogger logo Debian logo Creative Commons License FeedBurner Subscribers Counter