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

Содержание

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

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

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

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

$ dpkg-buildpackage

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

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

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

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

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

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

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

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

$ dpkg-buildpackage -us -uc

Для неродного пакета 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). Этот файл подписан с помощью GPG, что позволяет другим людям удостовериться, что именно вы создали его.

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

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

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

  • gentoo_0.9.12-1_i386.deb

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

  • gentoo_0.9.12-1_i386.changes

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

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

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

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

  • mypackage_1.0.tar.gz

    Это сжатый архив tar с исходным кодом, созданный из каталога mypackage-1.0 командой dpkg-source (его суффикс не orig.tar.gz).

  • mypackage_1.0.dsc

    Содержит описание содержимого пакета с исходным кодом, такой же как для неродного пакета Debian (в имени нет редакции Debian).

  • mypackage_1.0_i386.deb

    Собранный двоичный пакет, такой же как для неродного пакета Debian (в имени нет редакции Debian).

  • mypackage_1.0_i386.changes

    Содержит описание всех изменений, сделанных в текущей версии пакета, такой же как для неродного пакета Debian (в имени нет редакции Debian).

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

Для пакетов с 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, так как она занимается исключительно архитектурно-зависимыми двоичными пакетами [67]. Это различие между обычным пакетированием и использованием autobuilder определяет, где должны быть перечислены необходимые пакеты: в поле Build-Depends или Build-Depends-indep файла debian/control (смотрите Раздел 4.1, «Файл control»).

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

Поведение команды debuild можно регулировать посредством правки файлов /etc/devscripts.conf или ~/.devscripts. Полезными могут оказаться следующие строки:

DEBSIGN_KEYID=Your_GPG_keyID
DEBUILD_LINTIAN_OPTS="-i -I --show-overrides"

Это позволит подписывать пакеты вашим идентификатором ключа GPG (полезно при поручительстве) и детально проверять их командой lintian.

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

$ debuild

Если вы собираете пакеты Debian только для себя, то можете пропустить ввод подписи GPG для файла .dsc и .changes с помощью:

$ debuild -us -uc

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

$ debuild clean

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

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

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

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

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

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

Это позволит вам подписывать создаваемые пакеты вашим секретным ключом GPG, размещённым в каталоге ~/.gnupg/.

Для начальной инициализации локальной системы 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_версия.dsc
$ debsign foo_версия_архитектура.changes

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

$ sudo pbuilder --update
$ pdebuild

Если вы собираете пакеты Debian только для себя, то можете пропустить подписывание GPG для файла .dsc и .changes с помощью:

$ AUTO_DEBSIGN=no pdebuild

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

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

#!/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 и других [71]. В таких случаях утверждения «Я использовал окружение sid» недостаточно, если обновление не было проведено своевременно. Пакет pbuilder поможет вам получить доступ к окружению практически любого производного от Debian дистрибутива той же архитектуры.

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

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

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

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

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

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

  • 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.[74]

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

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

$ fakeroot debian/rules binary

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

$ fakeroot debian/rules build

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



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

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

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

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

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

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

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

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

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

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

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

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