Этот пост является переводом
поста Рафаэля Герцога (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