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

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

The rewrite of this tutorial document with updated contents and more practical examples is available as Guide for Debian Maintainers. Please use this new tutorial as the primary tutorial document.

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

## 6.1. Полная (пере)сборка

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

- пакета `build-essential`,

- пакетов, перечисленных в поле `Build-Depends` (смотрите Раздел 4.1, «Файл `control`») и

- пакетов, перечисленных в поле `Build-Depends-indep` (смотрите Раздел 4.1, «Файл `control`»).

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

    $ dpkg-buildpackage -us -uc

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

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

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

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

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

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

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

If the build result is satisfactory, sign the `.dsc` and `.changes` files with your private GPG key using the debsign command. You need to enter your secret pass phrase, twice. [62]

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

- `gentoo_0.9.12.orig.tar.gz`

  This is the original upstream source code tarball, merely renamed to the above so that it adheres to the Debian standard. Note that this was created initially by the command `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` [63].

- `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.

The `gentoo_0.9.12-1.dsc` and `gentoo_0.9.12-1_i386.changes` files must be signed using the debsign command with your private GPG key in the `~/.gnupg/` directory, before uploading them to the Debian FTP archive. The GPG signature provides the proof that these files are really yours, using your public GPG key.

The debsign command can be made to sign with your specified secret GPG key ID (good for sponsoring packages) with the following in the `~/.devscripts` file:

    DEBSIGN_KEYID=ID_ключа_GPG

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

## 6.2. Autobuilder

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

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

- пакет `build-essential` и

- пакеты, перечисленные в поле `Build-Depends` (смотрите Раздел 4.1, «Файл `control`»).

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

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

## 6.3. Команда debuild

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

The debuild command executes the lintian command to make a static check after building the Debian package. The lintian command can be customized with the following in the `~/.devscripts` file:

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

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

    $ debuild

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

    $ debuild -- clean

## 6.4. Пакет `pbuilder`

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

Давайте настроим пакет `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`, настроенный следующим образом [68]:

    #!/bin/sh
    set -e
    install_packages() {
            apt-get -y --allow-downgrades 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` поможет вам в этой ситуации.

You may need to update your `stable` packages after their release for `stable-proposed-updates`, `stable/updates`, etc. [69] For such occasions, the fact that you may be running a `sid` system is not a good enough excuse for failing to update them promptly. The `pbuilder` package can help you to access environments of almost any Debian derivative distribution of the same architecture.

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

## 6.5. git-buildpackage command and similar

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

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

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

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

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

- gbp-import-dsc(1): import a previous Debian package to a Git repository.

- gbp-import-orig(1): import a new upstream tar to a Git repository.

- gbp-dch(1): generate the Debian changelog from Git commit messages.

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

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

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

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

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

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

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

## 6.6. Быстрая пересборка

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

    $ fakeroot debian/rules binary

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

    $ fakeroot debian/rules build

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

## 6.7. Иерархия команд

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

- `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, в них используются.

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

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

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

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

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

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

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

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

[70] Смотрите Системы управления версиями.

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

[72] The `--pristine-tar` option invokes the pristine-tar command, which can regenerate an exact copy of a pristine upstream tarball using only a small binary delta file and the contents of the tarball that are typically kept in an `upstream` branch in the VCS.

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

- Сборка пакетов Debian с помощью git-buildpackage (`/usr/share/doc/git-buildpackage/manual-html/gbp.html`)

- Пакеты debian в git

- Использование Git для пакетирования Debian

- git-dpm: пакеты Debian в Git

[74] Environment variables that are normally configured to proper values are not set by this method. Never create real packages to be uploaded using this quick method.

Глава 5. Другие файлы в каталоге `debian/` |  | Глава 7. Проверка пакета на наличие ошибок