Глава 7. Полезные советы

Содержание

7.1. debdiff
7.2. dget
7.3. debc
7.4. piuparts
7.5. debsign
7.6. dput
7.7. bts
7.8. git-buildpackage
7.8.1. gbp import-dscs --debsnap
7.9. git-репозиторий основной ветки
7.10. chroot
7.11. Новая редакция Debian
7.12. Новый выпуск основной ветки
7.12.1. uupdate + tarball
7.12.2. uscan
7.12.3. gbp
7.12.4. gbp + uscan
7.13. Формат исходного кода 3.0
7.14. CDBS
7.15. Сборка с использованием кодировки UTF-8
7.16. Преобразование в кодировку UTF-8
7.17. Загрузите orig.tar.gz
7.18. Пропущенные загрузки
7.19. Продвинутые темы работы над пакетом
7.20. Другие дистрибутивы
7.21. Отладка

Here are some notable tips about Debian packaging.

Можно сравнивать содержимое файлов в двух пакетах Debian с исходным кодом с помощью команды debdiff.

$ debdiff old-package.dsc new-package.dsc

Также можно сравнивать списки файлов в двух наборах двоичных пакетов Debian с помощью команды debdiff.

$ debdiff old-package.changes new-package.changes

Это полезно для определения изменений в пакетах с исходным кодом и для проверки на предмет нечаянных изменений, привнесённых при обновлении двоичных пакетов, таких как непреднамеренное ошибочное размещение или удаление файлов.

Можно скачать набор файлв для пакета Debian с исходным кодом с помощью команды dget.

$ dget https://www.example.org/path/to/package_version-rev.dsc

Созданные пакеты следуется установить с помощью команды debc для их локальной проверки.

$ debc package_version-rev_arch.changes

Созданные пакеты следует установить с помощью команды piuparts для их автоматической проверки.

$ sudo piuparts package_version-rev_arch.changes
[Примечание] Примечание

This is a very slow process with remote APT package repository access.

После завершения тестирования пакета можно его подписать с помощью команды debsign.

$ debsign package_version-rev_arch.changes

After signing the package with the debsign command, you can upload the set of files for the Debian source and binary packages with the dput command.

$ dput package_version-rev_arch.changes

После загрузки пакета вы начнёте получать сообщения об ошибках. Соответствующая работа с ошибками является важным обязательством сопровождающего, что описано в разделе 5.8. Работа с ошибками «Справочника разработчика Debian».

The bts command is a handy tool to manage bugs on the Debian Bug Tracking System.

$ bts severity 123123 wishlist , tags -1 pending

Пакет git-buildpackage предлагает множество команд для автоматизации деятельности по работе над пакетом с помощью репозитория git.

  • gbp import-dsc: импортировать предыдущий пакет Debian с исходным кодом в git-репозиторий.
  • gbp import-orig: импортировать новый tar-архив основной ветки в git-репозиторий.

    • The --pristine-tar option for the git import-orig command enables storing the upstream tarball in the same git repository.
    • The --uscan option as the last argument of the gbp import-orig command enables downloading and committing the new upstream tarball into the git repository.
  • gbp dch: создание записи журнала изменений Debian из сообщений о коммитах.
  • gbp buildpackage: сборка двоичного пакета Debian из git-репозитория.
  • gbp pull: безопасно обновить ветки debian, upstream и pristine-tar из удалённого репозитория.
  • git-pbuilder: сборка двоичного пакета Debian из git-репозитория с помощью пакета pbuilder.

    • Пакет cowbuilder используется в качестве движка.
  • Команды gbp pq, git-dpm или quilt (или её псевдоним dquilt) используются для работы с заплатами quilt.

    • The dquilt command is the simplest to learn and requires you to commit the resulting files manually with the git command to the master branch.
    • The “gbp pq” command provides the equivalent functionality of patch set management without using dquilt and eases including upstream git repository changes by cherry-picking.
    • The “git dpm” command provides more enhanced functionality than that of the ‘gbp pq’' command.

Package history management with the git-buildpackage package is becoming the standard practice for most Debian maintainers.

См.:

[Подсказка] Подсказка

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

Для пакета Debian с исходным кодом с именем <source-package>, сохранённого в архиве snapshot.debian.org начальный git-репозиторий со всей историей версий Debian можно получить следующим образом.

$ gbp import-dscs --debsnap --pristine-tar '<source-package>'

For Debian packaging with the git-buildpackage package, the upstream branch on the remote repository origin is normally used to track the content of the released upstream tarball.

git-репозиторий основной ветки также может отслеживаться, его удалённый репозиторий следует назвать upstream, а не origin как по умолчанию. Теперь вы легко сможете избирательно применять наиболее свежие изменения основной ветки к редакции Debian с помощью команды gitk и используя команду gbp-pq.

[Подсказка] Подсказка

The “gbp import-orig --upstream-vcs-tag” command can create a nice packaging history by making a merge commit into the upstream branch from the specified tag on the upstream git repository.

[Внимание] Внимание

Содержимое выпущенного разработчиками основной ветки tar-архива может не совпадать в точности с соответствующим содержимым git-репозитория основной ветки. Оно может содержать созданные автоматически файлы, либо какие-то файлы могут отсутствовать. (Autotools, distutils, …)

The chroot for a clean package build environment can be created and managed using the tools described in Глава 3, Настройка инструментов. [19]

Ниже приводится краткий обзор доступных команд для сборки пакетов. Существует множество способов сделать одно и то же.

  • dpkg-buildpackage = ядро инструмента для сборки пакета
  • debuild = dpkg-buildpackage + lintian (сборка с очищенными переменными окружения)
  • pbuilder = ядро инструмента Debian для работы с chroot-окружением
  • pdebuild = pbuilder + dpkg-buildpackage (сборка в chroot-окружении)
  • cowbuilder = увеличение скорости выполнения pbuilder
  • git-pbuilder = простой в использовании синтаксис командной строки для pdebuild (используется в gbp buildpackge)
  • gbp = manage the Debian source under git
  • gbp buildpackge = pbuilder + dpkg-buildpackage + gbp

Чистое chroot-окружение выпуска sid может использоваться следующим образом.

  • Команда создания файловой системы chroot-окружения для выпуска sid

    • pbuilder create
    • git-pbuilder create
  • The master chroot filesystem path for the sid distribution chroot filesystem

    • /var/cache/pbuilder/base.cow
  • Команда для сборки пакета для chroot-окружения выпуска sid

    • pdebuild
    • git-pbuilder
    • gbp buildpackage
  • Команда для обновления chroot-окружения sid

    • pbuilder --update
    • git-pbuilder update
  • The command to login to the sid chroot filesystem to modify it

    • git-pbuilder login --save-after-login

Произвольное окружение выпуска выпуск может быть использовано следующим образом.

  • Команда создания файловой системы chroot-окружения для выпуска выпуск

    • pbuilder create --distribution выпуск
    • DIST=выпуск git-pbuilder create
  • Главный путь файловой системы chroot-окружения для chroot-окружения выпуска выпуск

    • путь: /var/cache/pbuilder/base-выпуск.cow
  • Команда сборки пакета для chroot-окружения выпуска выпуск

    • pdebuild -- --basepath=/var/cache/pbuilder/base- выпуск .cow
    • DIST=выпуск git-pbuilder
    • gbp buildpackage --git-dist= выпуск
  • Команда для обновления chroot-окружения выпуск

    • pbuilder update --basepath=/var/cache/pbuilder/base- выпуск .cow
    • DIST=выпуск git-pbuilder update
  • The command to login to the dist chroot to modify it

    • pbuilder --login --basepath=/var/cache/pbuilder/base- выпуск .cow --save-after-login
    • DIST=выпуск git-pbuilder login --save-after-login
[Подсказка] Подсказка

Для новых экспериментальных пакетов требуется специально настроенное окружение с несколькими предварительно загруженными пакетами, в таких случаях команда «git-pbuilder login --save-after-login» будет весьма полезна.

[Подсказка] Подсказка

If your old chroot filesystem is missing packages such as libeatmydata1, ccache, and lintian, you may want to install these with the “git-pbuilder login --save-after-login” command.

[Подсказка] Подсказка

The chroot filesystem can be cloned simply by copying with the “cp -a base-dist.cow base-customdist.cow” command. The new chroot filesystem can be accessed as “gbp buildpackage --git-dist=customdist” and “DIST=customdist git-pbuilder …”.

[Подсказка] Подсказка

When the orig.tar.gz file needs to be uploaded for a Debian revision other than 0 or 1 (e.g., for a security upload), add the -sa option to the end of dpkg-buildpackage, debuild, pdebuild, and git-pbuilder commands. For the “gbp buildpackage” command, temporarily modify the builder setting of ~/.gbp.conf.

[Примечание] Примечание

Описание в этом разделе слишком кратко, чтобы оно оказалось полезным для большинства будущих сопровождающих. Это — намеренный выбор автора. Настоятельно рекомендуется поискать и прочесть всю соответствующую документация, связанную с используемыми командами.

Let’s assume that a bug report #bug_number was filed against your package, and it describes a problem that you can solve by editing the buggy file in the upstream source. Here’s what you need to do to create a new Debian revision of the package with the bugname.patch file recording the fix.

Новая редакция Debian с помощью команды dquilt

 $ dquilt push -a
 $ dquilt new bugname.patch
 $ dquilt add buggy
 $ vim buggy
   ...
 $ dquilt refresh
 $ dquilt header -e
 $ dquilt pop -a
 $ dch -i

Alternatively if the package is managed in the git repository using the git-buildpackage command with its default configuration:

Новая редакция Debian с помощью команды gbp-pq

 $ git checkout master
 $ gbp pq import
 $ vim buggy
 $ git add buggy
 $ git commit
 $ git tag pq/<newrev>
 $ gbp pq export
 $ gbp pq drop
 $ git add debian/patches/*
 $ dch -i
 $ git commit -a -m "Closes: #<bug_number>"

Проверьте, что вы лаконично описали изменения, исправляющие ошибку, и закрыли сообщение об ошибке, добавив «Closes: #<номер_ошибки>» в файл debian/changelog.

[Подсказка] Подсказка

Когда вы экспериментируете, то используйте запись debian/changelog со строкой версии вида 1.0.1-1~rc1. Затем сведите такие записи журнала изменений в одну запись для официального пакета.

Если пакет foo создан в одном из современных форматов «3.0 (native)» или «3.0 (quilt)», то работа над пакетом с новым выпуском основной ветки будет представлять собой по сути перемещение старого каталога debian/ в новый исходный код. Это можно сделать, запустив команду «tar -xvzf /путь/к/foo_стараяверсия.debian.tar.gz» в каталоге с распакованным новым исходным кодом. [20] Конечно, вам придётся сделать некоторую рутинную работу.

Для такой ситуации существует несколько инструментов. После обновления до нового выпуска основной ветки с помощью этих инструментов убедитесь, что вы лаконично описали изменения в новом выпуске основной ветки, исправляющие известные ошибки, и закрыли эти сообщения об ошибках, добавив «Closes: #номер_ошибки» в файл debian/changelog.

Обновление стиля пакета не является требуемой деятельностью до обновления пакета. Тем не менее, такое обновление позволяет использовать все возможности современной системы debhelper и формат исходного кода 3.0.

Вам следует просмотреть DEP — Предложения по улучшению Debian и использовать принятые (ACCEPTED) предложения.

Информацию о статусе поддержки новых форматов исходного кода Debian в наборе инструментальных средств Debian см. в ProjectsDebSrc3.0.

Общая система сборки Debian (CDBS) является обёрткой над пакетом debhelper. CDBS построена на основе механизма включения Makefile и настраивается с помощью установки переменных настройки DEB_* в файле debian/rules.

До добавления команды dh в пакет debhelper (начиная с версии 7) CDBS являлась единственным подходом к созданию простого и ясного файла debian/rules.

For many simple packages, the dh command alone allows us to make a simple and clean debian/rules file now. It is desirable to keep the build system simple and clean by not using the superfluous CDBS.

[Примечание] Примечание

Neither “the CDBS magically does the job for me with less typing” nor “I don’t understand the new dh syntax” can be an excuse to keep using the CDBS system.

For some complicated packages such as GNOME related ones, the CDBS is leveraged to automate their uniform packaging by the current maintainers with justification. If this is the case, please do not bother converting from the CDBS to the dh syntax.

[Примечание] Примечание

Если вы работаете вместе с командой сопровождающих, то следуйте установленным традициям и практикам этой команды.

При переходе с использования системы CDBS на синтаксис dh в качестве справочника используйте следующую документацию:

Локалью по умолчанию в сборочном окружении является C.

Некоторые программы, такие как функци read из Python3, изменяют своё поведение в зависимости от текущей локали.

Adding the following code to the debian/rules file ensures building the program under the C.UTF-8 locale.

LC_ALL := C.UTF-8
export LC_ALL

Если документация основной ветки разработки закодирована с помощью устаревших кодировок, то лучше будет преобразовать её в UTF-8.

Используйте команду iconv из пакета libc-bin для преобразования кодировки в обычных текстовых файлах.

 $ iconv -f latin1 -t utf8 foo_in.txt > foo_out.txt

Используйте w3m(1) для преобразования HTML-файлов в обычные текстовые файлы в кодировке UTF-8. При выполнении преобразования убедитесь, что у вас используется локаль UTF-8.

 $ LC_ALL=C.UTF-8 w3m -o display_charset=UTF-8 \
        -cols 70 -dump -no-graph -T text/html \
        < foo_in.html > foo_out.txt

Запустите эти сценарии в цели override_dh_* файла debian/rules.

При первой загрузке пакета в архив вам следует включить в загрузку также и архив с оригинальным исходным кодом, orig.tar.gz.

Если номер редакции Debian вашего пакета не является 1 или 0, то это происходит по умолчанию. В противном случае, вам следует передать опцию -sa команде dpkg-buildpackage.

  • dpkg-buildpackage -sa
  • debuild -sa
  • pdebuild --debbuildopts -sa
  • git-pbuilder -sa
  • При использовании gbp buildpackage отредактируйте файл ~/.gbp.conf.
[Подсказка] Подсказка

С другой стороны использование опции -sd приведёт к тому, что архив с оригинальным исходным кодом, orig.tar.gz, будет включён в загрузку.

[Подсказка] Подсказка

Security uploads require including the orig.tar.gz file.

Если вы создаёте несколько записей в файле debian/changelog и пропускаете загрузки, то вам следует создать соответствующий файл *_.changes, включающий все изменения с последней загрузки. Это можно сделать, передав dpkg-buildpackage опцию -v с указанием последней загруженной версии, например, 1.2.

  • dpkg-buildpackage -v 1.2
  • debuild -v 1.2
  • pdebuild --debbuildopts -v 1.2
  • git-pbuilder -v 1.2
  • При использовании gbp buildpackage отредактируйте файл ~/.gbp.conf.

Полезные советы по приведённым ниже вопросам можно найти в странице руководства debhelper(7):

Полезные советы по приведённым ниже вопросам можно найти в странице руководства dpkg-source(1):

  • naming convention for multiple upstream source tarballs

    • имяпакета_версия .orig.tar.gz
    • имяпакета_версия .orig- имякомпонента .tar.gz
  • запись изменений Debian в пакет исходного кода основной ветки

    • dpkg-source --commit

Несмотря на то, что в tar-архиве основной ветки имеется вся информация для сборки пакета Debian, не всегда легко понять, какую комбинацию опций следует использовать.

Also, the upstream package may be more focused on feature enhancements and may be less eager about backward compatibilities etc., which are an important aspect of Debian packaging practice.

The leveraging of information from other distributions is an option to address the above issues.

If the other distribution of interest is a Debian derivative one, it is trivial to reuse it.

If the other distribution of interest is an RPM based distribution, see Repackage src.rpm.

Скачивание и открытие файла src.rpm может быть выполнено с помощью команды rget. (Разместите сценарий rget в одном из каталогов, указанных в вашей переменной PATH.)

Сценарий rget. 

#!/bin/sh
FCSRPM=$(basename $1)
mkdir ${FCSRPM}; cd ${FCSRPM}/
wget $1
rpm2cpio ${FCSRPM} | cpio -dium

Во многих tar-архивах основной ветки содержится файл SPEC, который имеет имя packagename.spec или packagename.spec.in и используется системой RPM. Также он может использоваться в качестве основы для пакета Debian.

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

Это слишком обширная тема, чтобы обсуждать её в настоящем руководстве. Поэтому позвольте просто привести несколько ссылок и полезных советов по использованию типичных инструментов отладки.

  • дамп памяти

    • man core
    • Обновите файл «/etc/security/limits.conf» так, чтобы он включал в себя следующее:

      * soft core unlimited
    • «ulimit -c unlimited» в ~/.bashrc
    • «ulimit -a» для проверки
    • Нажмите Ctrl-\ или «kill -ABRT PID» для того, чтобы создать файл с дампом памяти
  • gdb — отладчик GNU

    • info gdb
    • «Отладка с помощью GDB» в /usr/share/doc/gdb-doc/html/gdb/index.html
  • strace — трассировка системных вызовов и сигналов

    • Используйте сценарий strace-graph из каталога /usr/share/doc/strace/examples/, чтобы иметь удобную визуализацию в виде дерева
    • man strace
  • ltrace - трассировка библиотечных вызовов

    • «man ltrace»
  • «sh -n script.sh» — проверка синтаксиса сценариев командной оболочки
  • «sh -x script.sh» — трассировка сценария командной оболочки
  • «python -m py_compile script.py» — проверка синтаксиса сценария на языке Python
  • «python -mtrace --trace script.py» — трассировка сценария на языке Python
  • «perl -I ../libpath -c script.pl» — проверка синтаксиса сценария на языке Perl
  • «perl -d:Trace script.pl» — трассировка сценария на языке Perl

    • Install the libterm-readline-gnu-perl package or its equivalent to add input line editing capability with history support.
  • lsof — вывод списка файлов, открытых процессами

    • man lsof
[Подсказка] Подсказка

The script command records console outputs.

[Подсказка] Подсказка

The screen and tmux commands used with the ssh command offer secure and robust remote connection terminals.

[Подсказка] Подсказка

A Python- and Shell-like REPL (=READ + EVAL + PRINT + LOOP) environment for Perl is offered by the reply command from the libreply-perl (new) package and the re.pl command from the libdevel-repl-perl (old) package.

[Подсказка] Подсказка

The rlwrap and rlfe commands add input line editing capability with history support to any interactive commands. E.g. “rlwrap dash -i”' .



[19] The git-pbuilder style organization is deployed here. See https://wiki.debian.org/git-pbuilder . Be careful since many HOWTOs use different organization.

[20] If a package foo is packaged in the old 1.0 format, this can be done by running the “zcat /path/to/foo_oldversion.diff.gz|patch -p1” command in the new extracted source, instead.

[21] Можно разделить файл большой.diff на несколько небольших инкрементальных заплат с помощью команды splitdiff.