Глава 6. Сборка пакета

Содержание

6.1. Полная (пере)сборка
6.2. Autobuilder
6.3. Команда debuild
6.4. Пакет pbuilder
6.5. Команда git-buildpackage и подобные ей
6.6. Быстрая пересборка
6.7. Иерархия команд

Теперь мы готовы собрать пакет.

Для полной (пере)сборки пакета, необходимо убедиться в установке следующего:

Затем выполните следующую команду в каталоге с исходным кодом:

$ dpkg-buildpackage -us -uc

Она сделает всё, что необходимо для создания всех двоичных пакетов и пакета с исходным кодом. Она выполняет:

  • очистку дерева исходного кода (debian/rules clean)

  • сборку пакета с исходным кодом (dpkg-source -b)

  • сборку программы (debian/rules build)

  • сборку двоичных пакетов (fakeroot debian/rules binary)

  • создаёт файл .dsc

  • создаёт файл .changes с помощью dpkg-genchanges

Если результат сборки устраивает, подпишите файл .dsc и .changes вашим закрытым ключом GPG с помощью команды debsign. Вам потребуется ввести секретную фразу дважды. [63]

Для неродного пакета Debian, например, gentoo, после сборки пакетов вы увидите следующие файлы в родительском каталоге (~/gentoo):

  • gentoo_0.9.12.orig.tar.gz

    Это оригинальный архив tar c исходным кодом, только переименованный для соответствия стандартам Debian. Обратите внимание, что первоначально он был создан с помощью dh_make -f ../gentoo-0.9.12.tar.gz.

  • gentoo_0.9.12-1.dsc

    Этот файл содержит информацию о содержимом исходного кода. Он файл генерируется из вашего файла control и используется при распаковке пакета с исходным кодом с помощью dpkg-source(1).

  • gentoo_0.9.12-1.debian.tar.gz

    В этом сжатом архиве tar находится содержимое вашего каталога debian. Все дополнения, вносимые вами в исходный код, хранятся в виде заплат quilt в каталоге debian/patches.

    Если кто-либо захочет пересоздать ваш пакет с нуля, они легко смогут сделать это, используя перечисленные выше три файла. Процедура извлечения тривиальна: просто скопируйте куда-нибудь три файла и выполните dpkg-source -x gentoo_0.9.12-1.dsc [64].

  • gentoo_0.9.12-1_i386.deb

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

  • gentoo_0.9.12-1_i386.changes

    В этом файле описываются все изменения, сделанные в данной редакции пакета, и он используется программами поддержки FTP-архива Debian для внесения пакетов (как двоичных, так и с исходным кодом) в архив. Он частично генерируется из файлов changelog и .dsc.

    По мере того, как вы будете работать над пакетом, будет меняться его поведение и будет добавляться новая функциональность. Люди, загружающие ваш пакет, могут посмотреть этот файл и сразу понять, что было изменено. Программы поддержки архива Debian будут также отправлять содержимое этого файла в список рассылки debian-devel-changes@lists.debian.org.

Файлы gentoo_0.9.12-1.dsc и gentoo_0.9.12-1_i386.changes должны быть подписаны с помощью команды debsign вашим закрытым ключом GPG из каталога ~/.gnupg/ до отправки их в архив Debian FTP. С помощью вашего открытого ключа GPG можно проверить, что эти файлы подписали действительно вы.

Команде debsign можно указать ID секретного ключа GPG, которым нужно подписывать (удобно для спонсирования) в ~/.devscripts:

DEBSIGN_KEYID=ID_ключа_GPG

Длинные строки цифр в файлах .dsc и .changes — это контрольные суммы SHA1/SHA256 упомянутых файлов. Человек, загружающий ваши файлы, может проверить их с помощью sha1sum(1) или sha256sum(1) и, если числа не совпадают, он поймёт, что файл был повреждён или подделан.

Debian поддерживает много переносов с помощью сети autobuilder, в которой работает служба buildd на компьютерах различных архитектур. Хотя вам и не придётся этим заниматься, но всё же следует узнать, что будет происходить с вашими пакетами. Рассмотрим в общих чертах как ваш пакет пересобирается для различных архитектур [65].

Для пакетов с Architecture: any система autobuilder выполняет пересборку. Она убеждается, что установлен

Затем в каталоге с исходным кодом вызывается команда

$ dpkg-buildpackage -B

Она делает всё необходимое для сборки пакетов для данной архитектуры. А именно:

  • очистку дерева исходного кода (debian/rules clean)

  • сборку программы (debian/rules build)

  • сборку архитектурно-зависимых двоичных пакетов (fakeroot debian/rules binary-arch)

  • подпись файла исходного кода .dsc с помощью gpg

  • создание и подпись загружаемого файла .changes с помощью dpkg-genchanges и gpg

Так ваш пакет собирается для различных архитектур.

Хотя пакеты, перечисленные в поле Build-Depends-indep, должны быть установлены при ручном пакетировании (смотрите Раздел 6.1, «Полная (пере)сборка»), их не нужно устанавливать при использовании системы autobuilder, так как она занимается исключительно архитектурно-зависимыми двоичными пакетами [66]. Это различие между обычным пакетированием и использованием autobuilder определяет, где должны быть перечислены необходимые пакеты: в поле Build-Depends или Build-Depends-indep файла debian/control (смотрите Раздел 4.1, «Файл control»).

Для автоматизации действий по сборки с помощью dpkg-buildpackage можно использовать команду debuild. Смотрите debuild(1).

Команда debuild запускает команду lintian для выполнения статической проверки после сборки пакета Debian. Команда lintian можно настроить через файл ~/.devscripts:

DEBUILD_DPKG_BUILDPACKAGE_OPTS="-us -uc -I -i"
DEBUILD_LINTIAN_OPTS="-i -I --show-overrides"

Для очистки каталога исходного кода и пересборки пакета выполните:

$ debuild

Для очистки древа исходного кода выполните:

$ debuild clean

В чистой среде сборки (chroot) для проверки пакетных зависимостей очень полезен пакет pbuilder [67]. Он поможет убедиться в чистоте сборки под управлением auto-builder из sid для различных архитектур и избежать опасной ошибки FTBFS (ошибка сборки из исходного кода), которая всегда относится к категории RC (критична для данного выпуска) [68].

Давайте настроим пакет pbuilder следующим образом:

  • дадим пользователю право записи в каталог /var/cache/pbuilder/result

  • создадим каталог для размещения сценариев, например, /var/cache/pbuilder/hooks, доступный пользователю для записи.

  • добавим в файл ~/.pbuilderrc или в /etc/pbuilderrc следующие строки:

    AUTO_DEBSIGN=${AUTO_DEBSIGN:-no}
    HOOKDIR=/var/cache/pbuilder/hooks
    

Для начальной инициализации локальной системы chroot пакета pbuilder выполним:

$ sudo pbuilder create

Если у вас имеется готовый пакет исходного кода, то в каталоге, где расположены файлы foo.orig.tar.gz, foo.debian.tar.gz и foo.dsc, для обновления локальной системы chroot пакета pbuilder и сборки соответствующих двоичных пакетов выполните следующие команды:

$ sudo pbuilder --update
$ sudo pbuilder --build foo_версия.dsc

Только что собранные пакеты без подписи GPG будут помещены в каталог /var/cache/pbuilder/result/, их владельцем будет обычный пользователь (не суперпользователь).

Подписи GPG для файлов .dsc и .changes можно сгенерировать следующим образом:

$ cd /var/cache/pbuilder/result/
$ debsign foo_версия_архитектура.changes

Если у вас есть обновлённое древо исходного кода, но нет собранных пакетов с исходным кодом, выполните в каталоге, где размещён подкаталог debian, другие команды:

$ sudo pbuilder --update
$ pdebuild

Вы можете войти внутрь окружения chroot и настроить его командой pbuilder --login --save-after-login. Изменения будут сохранены, когда вы покинете оболочку, нажав ^D (Control-D).

Последняя версия команды lintian может быть вызвана в окружении chroot, используя сценарий /var/cache/pbuilder/hooks//B90lintian, настроенный следующим образом [69]:

#!/bin/sh
set -e
install_packages() {
        apt-get -y --force-yes install "$@"
        }
install_packages lintian
echo "+++ lintian output +++"
su -c "lintian -i -I --show-overrides /tmp/buildd/*.changes" - pbuilder
# use this version if you don't want lintian to fail the build
#su -c "lintian -i -I --show-overrides /tmp/buildd/*.changes; :" - pbuilder
echo "+++ end of lintian output +++"

Для правильной сборки пакета для sid вам потребуется самое свежее окружение этой ветви, однако миграция на sid всей системы может быть нежелательна. Пакет pbuilder поможет вам в этой ситуации.

Возможно, вам потребуется обновить ваши пакеты из ветви stable их версиями из архивов stable-proposed-updates, stable/updates и других [70]. В таких случаях утверждения «Я использовал окружение sid» недостаточно, если обновление не было проведено своевременно. Пакет pbuilder поможет вам получить доступ к окружению практически любого производного от Debian дистрибутива той же архитектуры.

Смотрите http://www.netfort.gr.jp/~dancer/software/pbuilder.html, pdebuild(1), pbuilderrc(5) и pbuilder(8).

Если автор программы применяет систему управления кодом [71], то и вы можете использовать её возможности. Это упрощает слияние и выборку заплат для исходного кода. Для каждой VCS существуют специализированные инструменты, позволяющие производить сборку пакетов Debian:

  • git-buildpackage: инструменты для пакетирования в репозиториях Git.

  • svn-buildpackage: вспомогательные программы для сопровождения пакетов Debian в Subversion.

  • cvs-buildpackage: набор сценариев для пакетирования в CVS.

Среди разработчиков Debian становится популярным использовать git-buildpackage для управления пакетами Debian на сервере Git alioth.debian.org. [72] В этот пакет включено много команд для автоматизации процесса упаковки:

  • git-import-dsc(1): импорт существующего пакета Debian в репозитории Git.

  • git-import-orig(1): импорт нового tar с исходным кодом в репозиторий Git.

  • git-dch(1): генерация changelog Debian на основе сообщений о записи в Git.

  • git-buildpackage(1): сборка пакетов Debian из репозитория Git.

  • git-pbuilder(1): сборка пакетов Debian из репозитория Git с помощью pbuilder/cowbuilder.

Для ведения пакетирования в этих командах используются 3 ветви:

  • main — дерево родных пакетов Debian.

  • upstream — дерево авторского исходного кода.

  • pristine-tar для авторского tar, создаваемый при использовании параметра --pristine-tar.[73]

Для настройки git-buildpackage используйте файл ~/.gbp.conf. Смотрите gbp.conf(5). [74]

При работе над большим пакетом, возможно, вы не захотите каждый раз полностью пересобирать его из исходного кода при изменении настроек в файле debian/rules. Исключительно для тестовых целей вы можете создать deb-файл без пересборки кода следующим образом [75]:

$ fakeroot debian/rules binary

Или просто выполните для выяснения возможна ли сборка пакета:

$ fakeroot debian/rules build

После выбора оптимальных настроек не забудьте пересобрать пакет стандартными средствами. Полученные таким способом файлы .deb могут быть загружены в архив некорректно, если вы попытаетесь это сделать.

Вот краткая сводка команд, которые объединяются в единую систему для сборки пакетов. Есть много способов сделать одно и тоже.

  • debian/rules = сценарий сопровождающего для сборки пакета

  • dpkg-buildpackage = ключевой инструмент сборки пакета

  • debuild = dpkg-buildpackage + lintian (сборка при проверенных переменных окружение)

  • pbuilder = ключевой инструмент chroot-окружения Debian

  • pdebuild = pbuilder + dpkg-buildpackage (сборка в chroot)

  • cowbuilder = ускорение выполнения pbuilder

  • git-pbuilder = простой синтаксис командной строки для pdebuild (используется в gbp buildpackge)

  • gbp = управление исходным кодом Debian в репозитории git

  • gbp buildpackge = pbuilder + dpkg-buildpackage + gbp

Хотя высокоуровневые команды, такие как gbp buildpackge и pbuilder, предоставляют замечательную среду сборки пакета, необходимо понимать какие нижележащие команды, такие как debian/rules и dpkg-buildpackage, в них используются.



[63] Для подключения к доверенному веб (web of trust) этот ключ GPG должен быть подписан разработчиком Debian и должен быть зарегистрирован в связке ключей Debian. Это позволяет закачивать пакеты для приёма в архивы Debian. Смотрите Создание нового ключа GPG и вики Debian по подписыванию ключами.

[64] Вы можете избежать наложения заплат quilt в формате исходного кода 3.0 (quilt) в конце извлечения, указав параметр --skip-patches. Или же вы можете выполнить quilt pop -a после обычной распаковки.

[65] На самом деле, работа системы autobuilder гораздо сложнее, однако её детальное описание не для этого документа.

[66] В отличие от пакета pbuilder,окружение chroot из пакета sbuild, который используется системой autobuilder, не требует минимальной системы и допускает наличие установленных пакетов, не являющихся необходимыми.

[67] Так как пакет pbuilder всё ещё развивается, за подробностями настройки обратитесь к его официальной документации.

[68] Более полная информация по автоматической сборке пакетов Debian приведена в http://buildd.debian.org/.

[69] Здесь предполагается, что HOOKDIR=/var/cache/pbuilder/hooks. Примеры вызываемых (hook) сценариев можно найти в каталоге /usr/share/doc/pbuilder/examples.

[70] Есть некоторые ограничения для такого обновления пакета из stable.

[72] В вики Debian Alioth описано как использовать службу alioth.debian.org.

[73] При указании параметра --pristine-tar вызывается команда pristine-tar, которая может регенерировать точную копию первоначального авторского файла tar на основе только маленького двоичного файла различий и содержимого tar, который обычно хранится в ветви upstream в VCS.

[74] Несколько веб-ресурсов для опытных пользователей:

[75] В данном случае не выполняется настройка переменных окружения, как это происходит при обычной сборке. Никогда не загружайте в архив пакеты, собранные таким быстрым способом.