Руководство для сопровождающих Debian

                             Osamu Aoki

                         <osamu@debian.org>

Лев Ламберов

Russian Translation (2018) <dogsleg@debian.org>

Авторские права © 2014-2024 Osamu Aoki

    Permission is hereby granted, free of charge, to any person
    obtaining a copy of this software and associated documentation
    files (the "Software"), to deal in the Software without
    restriction, including without limitation the rights to use,
    copy, modify, merge, publish, distribute, sublicense, and/or sell
    copies of the Software, and to permit persons to whom the
    Software is furnished to do so, subject to the following
    conditions:

    The above copyright notice and this permission notice shall be
    included in all copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
    OTHER DEALINGS IN THE SOFTWARE.

    Данное руководство было создано на основе информации,
    содержащейся в следующих документах:

      * «Создание пакета Debian (руководство по debmake)», copyright
        © 1997 Джалдхар Виас
      * «Практическое руководство нового сопровождающего по созданию
        пакетов Debian», copyright © 1997 Уилл Лоу
      * «Руководство начинающего разработчика Debian», copyright ©
        1998—2002 Джосип Родин, 2005—2017 Осаму Аоки, 2010 Крэйг
        Смолл, а также 2010 Рафаэль Херцог

    Последняя версия данного руководства доступна:

      * in the debmake-doc package and
      * at the Debian Documentation web site.

Аннотация

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

Руководство сконцентрировано на современном стиле создания пакетов и
содержит множество простых примеров:

  * Создание пакета, содержащего сценарий командной оболочки POSIX
  * Создание пакета, содержащего сценарий на языке Python3
  * C и Makefile/Autotools/CMake
  * Несколько двоичных пакетов с разделяемой библиотекой и т.д.

Данное «Руководство для сопровождающих Debian» может рассматриваться
как замена «Руководства начинающего разработчика Debian».

---------------------------------------------------------------------

Содержание

1. Предисловие
2. Обзор
3. Необходимые предварительные требования
    3.1. Люди вокруг Debian
    3.2. Как принять участие
    3.3. Социальная динамика Debian
    3.4. Техническая памятка
    3.5. Документация Debian
    3.6. Справочные ресурсы
    3.7. Ситуация с архивом
    3.8. Подходы к участию
    3.9. Начинающий участник и сопровождающий
4. Настройка инструментов
    4.1. Email setup
    4.2. mc setup
    4.3. git setup
    4.4. quilt setup
    4.5. devscripts setup
    4.6. sbuild setup
    4.7. Persistent chroot setup
    4.8. gbp setup
    4.9. HTTP-прокси
    4.10. Частный репозиторий Debian
    4.11. Virtual machines
    4.12. Local network with virtual machines
5. Simple packaging
    5.1. Packaging tarball
    5.2. Общая картина
    5.3. Что такое debmake?
    5.4. Что такое debuild?
    5.5. Шаг 1: получение исходного кода основной ветки разработки
    5.6. Step 2: Generate template files with debmake
    5.7. Шаг 3: изменение шаблонных файлов
    5.8. Step 4: Building package with debuild
    5.9. Step 3 (alternatives): Modification to the upstream source
    5.10. Patch by «diff -u» approach
    5.11. Patch by dquilt approach
    5.12. Patch by «dpkg-source --auto-commit» approach
6. Basics for packaging
    6.1. Работа по созданию пакета
    6.2. debhelper package
    6.3. Имя пакета и версия
    6.4. Родной пакет Debian
    6.5. debian/rules file
    6.6. debian/control file
    6.7. debian/changelog file
    6.8. debian/copyright file
    6.9. debian/patches/* files
    6.10. debian/source/include-binaries file
    6.11. debian/watch file
    6.12. debian/upstream/signing-key.asc file
    6.13. debian/salsa-ci.yml file
    6.14. Other debian/* files
7. Sanitization of the source
    7.1. Fix with Files-Excluded
    7.2. Fix with «debian/rules clean»
    7.3. Fix with extend-diff-ignore
    7.4. Fix with tar-ignore
    7.5. Fix with «git clean -dfx»
8. More on packaging
    8.1. Package customization
    8.2. Customized debian/rules
    8.3. Variables for debian/rules
    8.4. Новый выпуск основной ветки
    8.5. Manage patch queue with dquilt
    8.6. Build commands
    8.7. Note on sbuild
    8.8. Special build cases
    8.9. Загрузите orig.tar.gz
    8.10. Пропущенные загрузки
    8.11. Bug reports
9. Продвинутые темы работы над пакетом
    9.1. Historical perspective
    9.2. Current trends
    9.3. Note on build system
    9.4. Непрерывная интеграция
    9.5. Предзагрузка
    9.6. Усиление безопасности компилятора
    9.7. Повторяемая сборка
    9.8. Переменные подстановки
    9.9. Пакет библиотеки
    9.10. Multiarch
    9.11. Split of a Debian binary package
    9.12. Сценарии и примеры разделения пакета
    9.13. Multiarch library path
    9.14. Multiarch header file path
    9.15. Multiarch *.pc file path
    9.16. Библиотека символов
    9.17. Library package name
    9.18. Смена библиотек
    9.19. Безопасная binNMU-загрузка
    9.20. Отладочная информация
    9.21. -dbgsym package
    9.22. debconf
10. Packaging with git
    10.1. Salsa repository
    10.2. Salsa account setup
    10.3. Salsa CI service
    10.4. Branch names
    10.5. Patch unapplied Git repository
    10.6. Patch applied Git repository
    10.7. Note on gbp
    10.8. Note on dgit
    10.9. Patch by «gbp-pq» approach
    10.10. Manage patch queue with gbp-pq
    10.11. gbp import-dscs --debsnap
    10.12. Note on dgit-maint-debrebase workflow
    10.13. Quasi-native Debian packaging
11. Полезные советы
    11.1. Сборка с использованием кодировки UTF-8
    11.2. Преобразование в кодировку UTF-8
    11.3. Hints for Debugging
12. Tool usages
    12.1. debdiff
    12.2. dget
    12.3. mk-origtargz
    12.4. origtargz
    12.5. git deborig
    12.6. dpkg-source -b
    12.7. dpkg-source -x
    12.8. debc
    12.9. piuparts
    12.10. bts
13. Дополнительные примеры
    13.1. Выборочное применение шаблонов
    13.2. Без Makefile (командная оболочка, интерфейс командной
    оболочки)
    13.3. Makefile (командная оболочка, интерфейс командной оболочки)
    13.4. pyproject.toml (Python3, CLI)
    13.5. Makefile (командная оболочка, графический интерфейс
    пользователя)
    13.6. pyproject.toml (Python3, GUI)
    13.7. Makefile (single-binary package)
    13.8. Makefile.in + configure (single-binary package)
    13.9. Autotools (single-binary package)
    13.10. CMake (single-binary package)
    13.11. Autotools (multi-binary package)
    13.12. CMake (multi-binary package)
    13.13. Интернационализация
    13.14. Детали
14. Страница руководства debmake(1)
    14.1. НАЗВАНИЕ
    14.2. СИНТАКСИС
    14.3. ОПИСАНИЕ
        14.3.1. необязательные аргументы:
    14.4. ПРИМЕРЫ
    14.5. ВСПОМОГАТЕЛЬНЫЕ ПАКЕТЫ
    14.6. ПРЕДОСТЕРЕЖЕНИЯ
    14.7. ОТЛАДКА
    14.8. АВТОР
    14.9. ЛИЦЕНЗИЯ
    14.10. СМОТРИТЕ ТАКЖЕ
15. debmake options
    15.1. Shortcut options (-a, -i)
    15.2. debmake -b
    15.3. debmake -cc
    15.4. Snapshot upstream tarball (-d, -t)
    15.5. debmake -j
    15.6. debmake -k
    15.7. debmake -P
    15.8. debmake -T
    15.9. debmake -x

Глава 1. Предисловие

    Если вы уже в какой-то степени являетесь опытным пользователем
    Debian ^[1], то можете столкнутся со следующими ситуациями:

      * Желание установить некоторый пакет ПО, который пока
        отсутствует в архиве Debian.
      * Желание обновить пакет Debian до более свежего выпуска из
        основной ветки разработки.
      * Желание исправить ошибки в пакете Debian с помощью заплат.

    Если вы хотите создать пакет Debian для удовлетворения указанных
    желаний, а также чтобы поделиться вашей работой с сообществом, то
    вы входите в целевую аудиторию данного руководства как будущий
    сопровождающий Debian. ^[2] Добро пожаловать в сообщество Debian.

    В Debian имеется множество социальных и технических правил и
    договорённостей, которым необходимо следовать, поскольку Debian
    представляет собой большую организацию добровольцев со своей
    историей. Также в Debian был разработан огромный массив
    инструментов для создания пакетов и инструментов для
    сопровождения архива, которые позволяют создавать согласованный
    набор двоичных пакетов, отвечающих множеству технических целей:

      * packages build across many architectures («Раздел 8.3,
        «Variables for debian/rules»»)
      * reproducible build («Раздел 9.7, «Повторяемая сборка»»)
      * clean build under clearly specified package dependencies and
        patches («Раздел 6.6, «debian/control file»», «Раздел 6.9, «
        debian/patches/* files»», «Раздел 4.6, «sbuild setup»»)
      * optimal splits into multiple binary packages («Раздел 9.11,
        «Split of a Debian binary package»»)
      * smooth library transitions («Раздел 9.18, «Смена библиотек»»)
      * interactive installation customization («Раздел 9.22, «
        debconf»»)
      * multiarch support («Раздел 9.10, «Multiarch»»)
      * security enhancement using specific compiler flags («
        Раздел 9.6, «Усиление безопасности компилятора»»)
      * continuous integration («Раздел 9.4, «Непрерывная интеграция»
        »)
      * boot strapping («Раздел 9.5, «Предзагрузка»»)
      * …​

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

      * Что следует знать до того, как быть вовлечённым в Debian в
        качестве будущего сопровождающего.
      * Как создать простой пакет Debian.
      * Какие существуют виды правил для создания пакета Debian.
      * Полезные советы по созданию пакета Debian.
      * Примеры создания пакетов Debian для некоторых типовых
        сценариев.

    The author felt limitations of updating the original «New
    Maintainers' Guide» with the dh-make package and decided to
    create an alternative tool and its matching document to address
    modern requirements such as multi-arch. The result was the 
    debmake package version: 4.0 in 2013. The current debmake is
    version: 4.5.0. It comes with this updated «Guide for Debian
    Maintainers» in the debmake-doc (version: 1.20-1) package. (In
    2016, dh-make was ported from perl to python with updated
    features.)

    Many chores and tips have been integrated into the debmake
    command allowing this guide to be terse. This guide also offers
    many packaging examples for you to get started.

    Внимание

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

    Некоторые важные темы объяснены подробно. Некоторые из них могут
    показаться вам незначительными, но, пожалуйста, проявите
    терпение. Некоторые специальные случаи пропускаются. Для
    некоторых тем приводятся только ссылки на внешние источники. Всё
    это сделано намеренно, чтобы данное руководство оставалось
    простым и удобным в сопровождении.


---------------------------------------------------------------------

    ^[1] Вам необходимо знать немного о программировании в Unix, но
    от вас определённо не требуется быть экспертом. Вы можете узнать
    об основах управления системой Debian из «Справочника Debian».
    Там же можно найти ссылки на ресурсы для изучения
    программирования в Unix.

    ^[2] Если вы не желаете делиться пакетом Debian с другими, то вы,
    разумеется, можете скомпилировать ПО и установить пакет с
    исправленным исходным кодом из основной ветки разработки в
    каталог /usr/local/.

Глава 2. Обзор

    Создание пакета Debian из архива package-1.0.tar.gz, содержащего
    простой исходный код на языке C, соответствующий «Стандартам
    написания кода GNU» и «Стандарту иерархии файловой системы»,
    может быть выполнено с помощью команды debmake, как показано
    ниже.

     $ tar -xvzf package-1.0.tar.gz
     $ cd package-1.0
     $ debmake
       ... Make manual adjustments of generated configuration files
     $ debuild

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

    Внимание

    The debmake command only provides decent template files. These
    template files must be manually adjusted to their perfection to
    comply with the strict quality requirements of the Debian
    archive, if the generated package is intended for general
    consumption.

    Если вы только начинаете создавать пакеты Debian, то не
    беспокойтесь о деталях и переходите к рассмотрению общей картины.

    If you have been exposed to Debian packaging, this looks vgry
    much like the dh_make command. This is because the debmake
    command is intended to replace functions offered historically by
    the dh_make command. ^[3]

    Команда debmake имеет следующие возможности:

      * современный стиль создания пакетов

          + debian/copyright: «DEP-5» compliant
          + debian/control: substvar support, multiarch support,
            multi binary packages, …​
          + debian/rules: dh syntax, compiler hardening options, …​
      * гибкость

          + many options (see «Раздел 15.2, «debmake -b»», «Глава 14,
            Страница руководства debmake(1)», and «Глава 15, debmake
            options»)
      * разумные действия по умолчанию

          + выполнение без остановок с чистыми результатами
          + создание мультиархитектурного пакета, если явно не
            указана опция -m.
          + generate the non-native Debian package with the Debian
            source format «3.0 (quilt)», unless the -n option is
            explicitly specified.
      * дополнительные обслуживающие программы

          + verification of the debian/copyright file against the
            current source (see «Раздел 15.6, «debmake -k»»)

    The debmake command delegates most of the heavy lifting to its
    back-end packages: debhelper, dpkg-dev, devscripts, sbuild, 
    schroot, etc.

    Подсказка

    Обязательно защитите путём соответствующего включения в кавычки
    аргументы опций -b, -f, -l и -w от вмешательства командной
    оболочки.

    Подсказка
   
    Неродной пакет Debian — обычный пакет Debian.

    Подсказка

    Подробный журнал всех примеров сборки пакетов из данной
    документации можно получить, следуя инструкциям из «Раздел 13.14,
    «Детали»».

    Примечание

    The generation of the debian/copyright file, and the outputs from
    the -c (see «Раздел 15.3, «debmake -cc»») and -k (see «
    Раздел 15.6, «debmake -k»») options involve heuristic operations
    on the copyright and license information. They may produce some
    erroneous results.


---------------------------------------------------------------------

    ^[3] Команда deb-make была популярна ещё до команды dh_make.
    Версии текущего пакета debmake начинаются с 4.0, чтобы исключить
    совпадения и конфликты версий с устаревшим пакетом debmake,
    предоставлявшим команду deb-make.

Глава 3. Необходимые предварительные требования

    Ниже приведены необходимые предварительные требования, которые
    вам нужно понять до того, как вы примете участие в Debian.

3.1. Люди вокруг Debian

    Существует несколько типов людей, взаимодействующих с Debian в
    рамках разный ролей:

      * Автор основной ветки разработки: тот, кто создал исходную
        программу.
      * Сопровождающий основной ветки разработки: тот, кто в
        настоящее время сопровождает программу.
      * Сопровождающий: тот, кто создаёт пакет Debian с программой.
      * Поручитель: тот, кто помогает сопровождающим загружать пакеты
        в официальный архив пакетов Debian (после проверки
        содержимого пакетов).
      * Ментор: тот, кто помогает начинающим сопровождающим создавать
        пакеты и проч.
      * разработчик Debian (DD): член проекта Debian с полными
        правами на загрузку в официальный архив пакетов Debian.
      * сопровождающий Debian (DM): тот, кто имеет ограниченные права
        на загрузку в официальный архив пакетов Debian.

    Заметьте, что сразу же стать официальным разработчиком Debian
    (DD) нельзя, так как для этого требуется нечто большее, чем
    только технические навыки. Тем не менее, не отчаивайтесь из-за
    этого. Если ваша работа полезна для других, вы всё равно можете
    загрузить ваш пакет либо как сопровождающий через поручителя,
    либо как сопровождающий Debian.

    Please note that you do not need to create any new packages to
    become an official Debian Developer. Contributing to the existing
    packages can provide a path to becoming an official Debian
    Developer too. There are many packages waiting for good
    maintainers (see «"`Раздел 3.8, «Подходы к участию»»`").

3.2. Как принять участие

    Чтобы узнать, как принять участие в Debian, обратите внимание не
    следующее:

      * «Как вы можете помочь Debian?» (официальный источник)
      * «The Debian GNU/Linux FAQ, Chapter 13 - Contributing to the
        Debian Project» (semi-official)
      * «Debian Wiki, HelpDebian» (дополнительный источник)
      * «Сайт новых участников Debian» (официальный источник)
      * «ЧаВО для менторов Debian» (дополнительный источник)

3.3. Социальная динамика Debian

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

      * Все мы являемся добровольцами.

          + Вы не можете диктовать остальным, что им делать.
          + У вас должна быть мотивация делать что-то самостоятельно.
      * Движущей силой является дружеское сотрудничество.

          + Ваше участие не должно чрезмерно досаждать остальным.
          + Ваш вклад ценен только в том случае, если остальные вам
            за него признательны.
      * Debian — это не школа, где вы автоматически получаете
        внимание учителей.

          + Вам следует быть готовым к самостоятельному обучению
            многим вещам.
          + Внимание других добровольцев является очень дефицитным
            ресурсом.
      * Debian постоянно улучшается.

          + От вас ожидается, что вы будете создавать пакеты высокого
            качества.
          + Вы сами должны адаптироваться к изменениям.

    Поскольку в оставшейся части настоящего руководства мы
    концентрируемся исключительно на технических аспектах создания
    пакетов, постольку чтобы понять социальную динамику Debian,
    рекомендуем обратиться к следующей документации:

      * «Debian: 17 years of Free Software, "do-ocracy", and
        democracy» (Introductory slides by the ex-DPL)

3.4. Техническая памятка

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

      * Упростите отладку вашего пакета.

          + Делайте ваш пакет простым.
          + Не усложняйте ваш пакет.
      * Хорошо документируйте ваш пакет.

          + Используйте читаемый стиль для исходного кода.
          + Оставляйте в коде комментарии.
          + Форматируйте свой код везде одинаковым образом.
          + Сопровождайте git-репозиторий ^[4] пакета.

    Примечание
   
    Отладка ПО чаще требует большего количества времени, чем
    написание изначально работающего ПО.

    It is unwise to run your base system under the unstable suite
    even for the development system.

      * Creation of binary deb packages and their verification should
        use minimal unstable chroot described in «Раздел 4.6, «sbuild
        setup»».
      * Basic interactive package development activities should use 
        unstable chroot described in «Раздел 4.7, «Persistent chroot
        setup»».

    Примечание

    Advanced package development activities such as testing of full
    Desktop systems, network daemons, and system installer packages,
    should use unstable suite running under the «virtualization».

3.5. Документация Debian

    Please make yourself ready to read the pertinent part of the
    latest Debian documentation to generate perfect Debian packages:

      * «Debian Policy Manual»

          + The official «must follow» rules (https://www.debian.org/
            doc/devel-manuals#policy)
      * «Debian Developer’s Reference»
   
          + The official «best practice» document (https://
            www.debian.org/doc/devel-manuals#devref)
      * «Guide for Debian Maintainers» — this guide

          + A «tutorial reference» document (https://www.debian.org/
            doc/devel-manuals#debmake-doc)

    All these documents are published to https://www.debian.org using
    the unstable suite versions of corresponding Debian packages. If
    you wish to have local accesses to all these documents from your
    base system, please consider to use techniques such as «
    apt-pinning» and «chroot».

    Если данное руководство противоречит официальной документации
    Debian, то верной является последняя. В таком случае отправьте
    сообщение об ошибке в пакете debmake-doc с помощью команды 
    reportbug.

    Также существует следующая альтернативная вводная документация,
    которую вы можете прочитать вместе с настоящим руководством:

      * «Debian Packaging Tutorial»

          + https://www.debian.org/doc/devel-manuals#
            packaging-tutorial
          + https://packages.qa.debian.org/p/packaging-tutorial.html
      * «Ubuntu Packaging Guide» (Ubuntu is Debian based.)
   
          + http://packaging.ubuntu.com/html/
      * «Debian New Maintainers' Guide» (predecessor of this
        tutorial, deprecated)

          + https://www.debian.org/doc/devel-manuals#maint-guide
          + https://packages.qa.debian.org/m/maint-guide.html

    Подсказка
   
    When reading these, you may consider using the debmake command in
    place of the dh_make command.

3.6. Справочные ресурсы

    Прежде чем публично задать вопрос, приложите усилия для его
    самостоятельного разрешения, например, прочтите хорошую
    документацию:

      * Информацию о пакете, доступную с помощью команд aptitude, 
        apt-cache и dpkg.
      * Файлы в каталоге /usr/share/doc/пакет для всех релевантных
        пакетов.
      * Содержимое man команда для всех релевантных команд.
      * Содержимое info команда для всех релевантных команд.
      * Содержимое «архива списка рассылки
        debian-mentors@lists.debian.org».
      * Содержимое «архива списка рассылки
        debian-devel@lists.debian.org».

    Your desired information can be found effectively by using a
    well-formed search string such as «keyword site:lists.debian.org»
    to limit the search domain of the web search engine.

    Создание небольшого тестового пакета — хороший способ изучить
    детали создания пакетов. Исследование существующих хорошо
    сопровождаемых пакетов — лучший способ изучить то, как другие
    люди создают пакеты.

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

      * debian-mentors@lists.debian.org mailing list. (This mailing
        list is for the novice.)
      * debian-devel@lists.debian.org mailing list. (This mailing
        list is for the expert.)
      * IRC such as #debian-mentors.
      * Teams focusing on a specific set of packages. (Full list at
        https://wiki.debian.org/Teams)
      * Списки рассылки, в которых принято общаться на отличных от
        английского языках.

          + «debian-devel-{french,italian,portuguese,spanish}
            @lists.debian.org»
          + «debian-chinese-gb@lists.debian.org» (This mailing list
            is for general (Simplified) Chinese discussion.)
          + «debian-devel@debian.or.jp»

    Более опытные разработчики Debian с радостью вам помогут, если вы
    правильно зададите вопрос после того, как уже самостоятельно
    попробовали разобраться.

    Внимание

    Debian development is a moving target. Some information found on
    the web may be outdated, incorrect, and non-applicable. Please
    use them carefully.

3.7. Ситуация с архивом

    Пожалуйста, поймите ситуацию с архивом Debian.

      * В Debian уже имеются пакеты для большинства видов программ.
      * Число пакетов в архиве Debian уже в несколько раз превышает
        число активных сопровождающих.
      * К сожалению, некоторые пакеты нуждаются в должном внимании
        сопровождающих.

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

    Подсказка

    Команда wnpp-alert из пакета devscripts может проверять, если ли
    среди установленных пакетов пакеты открытые для усыновления или
    же осиротевшие пакеты.

    Подсказка
   
    The how-can-i-help package can show opportunities for
    contributing to Debian on packages installed locally.

3.8. Подходы к участию

    Ниже приводится псевдокод на питоноподобном языке, описывающий в 
    программном видевозможности вашего участия в Debian:

    if exist_in_debian(program):
      if is_team_maintained(program):
        join_team(program)
      if is_orphaned(program): # maintainer: Debian QA Group
        adopt_it(program)
      elif is_RFA(program): # Request for Adoption
        adopt_it(program)
      else:
        if need_help(program):
          contact_maintainer(program)
          triaging_bugs(program)
          preparing_QA_or_NMU_uploads(program)
        else:
          leave_it(program)
    else: # new packages
      if not is_good_program(program):
        give_up_packaging(program)
      elif not is_distributable(program):
        give_up_packaging(program)
      else: # worth packaging
        if is_ITPed_by_others(program):
          if need_help(program):
            contact_ITPer_for_collaboration(program)
          else:
            leave_it_to_ITPer(program)
        else: # really new
          if is_applicable_team(program):
            join_team(program)
          if is_DFSG(program) and is_DFSG(dependency(program)):
            file_ITP(program, area="main") # This is Debian
          elif is_DFSG(program):
            file_ITP(program, area="contrib") # This is not Debian
          else: # non-DFSG
            file_ITP(program, area="non-free") # This is not Debian
          package_it_and_close_ITP(program)

    Где:

      * Для функций exist_in_debian() и is_team_maintained() нужно
        проверить следующее:

          + команду aptitude
          + веб-страницу «пакеты Debian»
          + Debian wiki «Teams» page
      * Для функций is_orphaned(), is_RFA() и is_ITPed_by_others()
        нужно проверить следующее:

          + вывод команды wnpp-alert
          + «пакеты требующие доработки и будущие»
          + «журналы отчётов об ошибках Debian: ошибки в псевдопакете
            wnpp в нестабильном выпуске»
          + «пакеты Debian, которым требуется внимание и забота»
          + «ошибки в пакете wnpp по меткам debtag»
      * Для функции is_good_program() нужно проверить следующее:

          + программа должна быть полезна
          + программа не усложняет поддержку безопасности и
            сопровождение системы Debian
          + программа хорошо документирована, а её код понятен (то
            есть, не обфусцирован)
          + авторы программы согласны с созданием пакета и
            дружественно относятся к Debian ^[5]
      * Для функций is_it_DFSG() и is_its_dependency_DFSG() нужно
        проверить следующее:

          + «Критерии Debian по определению Свободного ПО» (DFSG).
      * Для функции is_it_distributable() нужно проверить следующее:

          + ПО должно иметь лицензию и лицензия должна разрешать
            распространение ПО.

    You either need to file an ITP or adopt a package to start
    working on it. See the «Debian Developer’s Reference»:

      * «5.1. Новые пакеты».
      * «5.9. Перемещение, удаление, переименование, придание статуса
        осиротевшего, усыновление и повторное введение пакетов».

3.9. Начинающий участник и сопровождающий

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

      * Создание пакетов

          + Основы командной оболочки POSIX и инструмента make.
          + Некоторое зачаточное знание Perl и Python.
      * Перевод

          + Основы работы системы перевода PO.
      * Документация

          + Basics of text markups (XML, ReST, Wiki, …​).

    Начинающий участник и сопровождающий могут недоумевать по поводу
    того, где же начать участвовать в Debian. Ниже приводятся
    некоторые предложения в зависимости от ваших навыков.

      * Навыки работы с командной оболочкой POSIX, Perl и Python:

          + Отправляйте заплаты для программы установки Debian.
          + Send patches to the Debian packaging helper scripts such
            as devscripts, sbuild, schroot, etc. mentioned in this
            document.
      * Навыки C и C++:

          + Отправляйте заплаты для пакетов, имеющих приоритеты 
            required и important.
      * Навыки работы с отличными от английского языками:

          + Отправляйте заплаты для PO-файлов программы установки
            Debian.
          + Отправляйте заплаты для PO-файлов пакетов, имеющих
            приоритеты required и important.
      * Навыки написания документации:

          + Обновляйте содержание «Debian Wiki».
          + Отправляйте заплаты к существующей «документации Debian».

    Эта деятельность даст вам возможность познакомиться с другими
    участниками Debian и улучшить вашу репутацию.

    Начинающему сопровождающему следует избегать работу над пакетами,
    содержащими программы с высокими рисками в плане безопасности:

      * программы, имеющие флаги доступа setuid или setgid
      * службы
      * программы, устанавливаемые в каталоги /sbin/ или /usr/sbin/

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


---------------------------------------------------------------------

    ^[4] Подавляющее большинство сопровождающих Debian используют git
    , а не другие системы управления версиями, такие как hg, bzr и
    т.д.

    ^[5] Это не является абсолютным требованием. Тем не менее,
    враждебные разработчики основной ветки могут стать тем, что будет
    опустошать ресурсы всех нас. С дружественными разработчиками
    можно консультироваться в решении любых проблем с программой.

Глава 4. Настройка инструментов

    В сборочном окружении должен быть установлен пакет 
    build-essential.

    The devscripts package should be installed in the development
    environment of the maintainer.

    It is a good idea to install and set up all of the popular set of
    packages mentioned in this chapter. These enable us to share the
    common baseline working environment, although these are not
    necessarily absolute requirements.

    Please also consider to install the tools mentioned in the «
    Overview of Debian Maintainer Tools» in the «Debian Developer’s
    Reference», as needed.

    Внимание

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

4.1. Email setup

    Различные инструменты сопровождения Debian назначают ваш адрес
    электронной почты и ваше имя из переменных окружения $DEBEMAIL и 
    $DEBFULLNAME.

    Let’s set these environment variables by adding the following
    lines to ~/.bashrc ^[6].

    Добавьте в файл ~/.bashrc. 

    DEBEMAIL="osamu@debian.org"
    DEBFULLNAME="Osamu Aoki"
    export DEBEMAIL DEBFULLNAME

    Примечание

    The above is for the author of this manual. The configuration and
    operation examples presented in this manual use these email
    address and name settings. You must use your email address and
    name for your system.

4.2. mc setup

    Команда mc предлагает вам простой способ работы с файлами. Она
    может открывать двоичные deb-файлы для проверки их содержимого по
    простому нажатию клавиши «Ввод» при выборе соответствующего
    двоичного deb-файла. В качестве движка эта программа использует
    команду dpkg-deb. Настроим её на поддержку простой функции chdir
    следующим образом.

    Добавьте в файл ~/.bashrc. 

    # mc related
    if [ -f /usr/lib/mc/mc.sh ]; then
      . /usr/lib/mc/mc.sh
    fi

4.3. git setup

    На сегодняшний день команда git является необходимым инструментом
    для работы с деревом исходного кода с историей.

    Глобальные пользовательские настройки для команды git, такие как
    ваши имя и адрес электронной почты, можно установить в файле ~
    /.gitconfig следующим образом.

    $ git config --global user.name "Osamu Aoki"
    $ git config --global user.email osamu@debian.org

    Если вы привыкли использовать команды CVS или Subversion, то
    можете установить несколько указанных ниже псевдонимов команд.

    $ git config --global alias.ci "commit -a"
    $ git config --global alias.co checkout

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

    $ git config --global --list

    Подсказка

    Для эффективной работы с историей git-репозитория необходимо
    использовать какой-нибудь инструмент с графическим интерфейсом
    пользователя, например, gitk или gitg.

4.4. quilt setup

    Команда quilt предлагает простой метод записи изменений. Для
    работы с пакетами Debian следует выполнить настройку так, чтобы
    изменения записывались в каталог debian/patches/ вместо каталога 
    patches/ по умолчанию.

    Чтобы не менять поведение самой команды quilt, создадим псевдоним
    dquilt для работы с пакетами Debian, добавив следующие строки в
    файл ~/.bashrc. Вторая строка предоставляет команде dquilt ту же
    функциональность автодополнения, что и у команды quilt.

    Добавьте в файл ~/.bashrc. 

    alias dquilt="quilt --quiltrc=${HOME}/.quiltrc-dpkg"
    . /usr/share/bash-completion/completions/quilt
    complete -F _quilt_completion $_quilt_complete_opt dquilt

    Теперь создадим файл ~/.quiltrc-dpkg со следующим содержимым.

    d=.
    while [ ! -d $d/debian -a `readlink -e $d` != / ];
        do d=$d/..; done
    if [ -d $d/debian ] && [ -z $QUILT_PATCHES ]; then
        # if in Debian packaging tree with unset $QUILT_PATCHES
        QUILT_PATCHES="debian/patches"
        QUILT_PATCH_OPTS="--reject-format=unified"
        QUILT_DIFF_ARGS="-p ab --no-timestamps --no-index --color=auto"
        QUILT_REFRESH_ARGS="-p ab --no-timestamps --no-index"
        QUILT_COLORS="diff_hdr=1;32:diff_add=1;34:diff_rem=1;31:diff_hunk=1;33:"
        QUILT_COLORS="${QUILT_COLORS}diff_ctx=35:diff_cctx=33"
        if ! [ -d $d/debian/patches ]; then mkdir $d/debian/patches; fi
    fi

    See quilt(1) and «How To Survive With Many Patches or
    Introduction to Quilt (quilt.html)» on how to use the quilt
    command.

    Для примеров использования см. «Раздел 5.9, «Step 3
    (alternatives): Modification to the upstream source»».

4.5. devscripts setup

    Для подписывания пакета Debian вашим закрытым GPG-ключом
    используется команда debsign, входящая в состав пакета devscripts
    .

    Команда debuild, входящая в состав пакета devscripts, собирает
    двоичный пакет и проверяет его с помощью команды lintian. Полезно
    иметь более подробный вывод команды lintian.

    Вы можете настроить эти команды в файле ~/.devscripts следующим
    образом.

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

    The -i and -I options in DEBUILD_DPKG_BUILDPACKAGE_OPTS for the 
    dpkg-source command help rebuilding of Debian packages without
    extraneous contents (see «Глава 7, Sanitization of the source»).

    В настоящее время хорошо иметь RSA-ключ длины 4096 бит, см. «
    Создание нового GPG-ключа».

4.6. sbuild setup

    The sbuild package provides a clean room («chroot») build
    environment. It offers this efficiently with the help of schroot
    using the bind-mount feature of the modern Linux kernel.

    Since it is the same build environment as the Debian’s buildd
    infrastructure, it is always up to date and comes full of useful
    features.

    It can be customized to offer following features:

      * The schroot package to boost the chroot creation speed.
      * Пакет lintian предназначен для обнаружения ошибок в пакете.
      * The piuparts package to find bugs in the package.
      * The autopkgtest package to find bugs in the package.
      * Пакет ccache предназначен для увеличения скорости работы gcc
        (необязательно).
      * Пакет libeatmydata1 предназначен для увеличения скорости
        работы dpkg (необязательно).
      * Параллельный запуск make позволяет увеличить скорость сборки
        (необязательно).

    Let’s set up sbuild environment ^[7]:

    $ sudo apt install sbuild piuparts autopkgtest lintian
    $ sudo apt install sbuild-debian-developer-setup
    $ sudo sbuild-debian-developer-setup -s unstable

    Let’s update your group membership to include sbuild and verify
    it:

    $ newgrp -
    $ id
    uid=1000(<yourname>) gid=1000(<yourname>) groups=...,132(sbuild)

    Here, «reboot of system» or «kill -TERM -1» can be used instead
    to update your group membership ^[8] .

    Let’s create the configuration file ~/.sbuildrc in line with
    recent Debian practice of «source-only-upload» as:

    cat >~/.sbuildrc << 'EOF'
    ##############################################################################
    # PACKAGE BUILD RELATED (source-only-upload as default)
    ##############################################################################
    # -d
    $distribution = 'unstable';
    # -A
    $build_arch_all = 1;
    # -s
    $build_source = 1;
    # --source-only-changes
    $source_only_changes = 1;
    # -v
    $verbose = 1;

    ##############################################################################
    # POST-BUILD RELATED (turn off functionality by setting variables to 0)
    ##############################################################################
    $run_lintian = 1;
    $lintian_opts = ['-i', '-I'];
    $run_piuparts = 1;
    $piuparts_opts = ['--schroot', 'unstable-amd64-sbuild'];
    $run_autopkgtest = 1;
    $autopkgtest_root_args = '';
    $autopkgtest_opts = [ '--', 'schroot', '%r-%a-sbuild' ];

    ##############################################################################
    # PERL MAGIC
    ##############################################################################
    1;
    EOF

    Примечание

    There are some exceptional cases such as NEW uploads, uploads
    with NEW binary packages, and security uploads where you can’t do
    source-only-upload but are required to upload with binary
    packages. The above configuration needs to be adjusted for those
    exceptional cases.

    Following document assumes that sbuild is configured this way.

    Edit this to your needs. Post-build tests can be turned on and
    off by assigning 1 or 0 to the corresponding variables,

    Предупреждение
   
    Необязательные настройки могут вызывать отрицательные
    последствия. Отключите их в случае сомнения.

    Примечание

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

    Подсказка
   
    Many sbuild related hints are available at «Раздел 8.7, «Note on 
    sbuild»» and «https://wiki.debian.org/sbuild» .

4.7. Persistent chroot setup

    Примечание
   
    Use of independent copied chroot filesystem prevents
    contaminating the source chroot used by sbuild.

    For building new experimental packages or for debugging buggy
    packages, let’s setup dedicated persistent chroot «
    source:unstable-amd64-desktop» by:

    $ sudo cp -a /srv/chroot/unstable-amd64-sbuild-$suffix /srv/chroot/unstable-amd64-desktop
    $ sudo tee /etc/schroot/chroot.d/unstable-amd64-desktop << EOF
    [unstable-desktop]
    description=Debian sid/amd64 persistent chroot
    groups=root,sbuild
    root-groups=root,sbuild
    profile=desktop
    type=directory
    directory=/srv/chroot/unstable-amd64-desktop
    union-type=overlay
    EOF

    Here, desktop profile is used instead of sbuild profile. Please
    make sure to adjust /etc/schroot/desktop/fstab to make package
    source accessible from inside of the chroot.

    You can log into this chroot «source:unstable-amd64-desktop» by:

     $ sudo schroot -c source:unstable-amd64-desktop

4.8. gbp setup

    The git-buildpackage package offers the gbp(1) command. Its user
    configuration file is ~/.gbp.conf.

    # Configuration file for "gbp <command>"

    [DEFAULT]
    # the default build command:
    builder = sbuild
    # use pristine-tar:
    pristine-tar = True
    # Use color when on a terminal, alternatives: on/true, off/false or auto
    color = auto

4.9. HTTP-прокси

    Чтобы сохранить пропускную способность при обращении к
    репозиторию пакетов Debian вам следует настроить локальный
    кэширующий HTTP-прокси. Имеется несколько вариантов:

      * Специализированный кэширующий HTTP-прокси, использующий пакет
        apt-cacher-ng.
      * Generic HTTP caching proxy (squid package) configured by 
        squid-deb-proxy package

    In order to use this HTTP proxy without manual configuration
    adjustment, it’s a good idea to install either auto-apt-proxy or 
    squid-deb-proxy-client package to everywhere.

4.10. Частный репозиторий Debian

    Вы можете настроить собственный репозиторий пакетов Debian с
    помощью пакета reprepro.

4.11. Virtual machines

    For testing GUI application, it is a good idea to have virtual
    machines. Install virt-manager and qemu-kvm packages.

    Use of chroot and virtual machines allows us not to update the
    whole host PC to the latest unstable suite.

4.12. Local network with virtual machines

    In order to access virtual machines easily over the local
    network, setting up multicast DNS service discovery
    infrastructure by installing avahi-utils is a good idea.

    For all running virtual machines and the host PC, we can use each
    host name appended with .local for SSH to access each other.


---------------------------------------------------------------------

    ^[6] Предполагается, что в качестве интерактивной командной
    оболочки с регистрацией вы используете Bash. Если вы используете
    какую-то другую командную оболочку, например, Zsh, то вместо ~
    /.bashrc необходимо изменить соответствующие файлы настройки.

    ^[7] Be careful since some older HOWTOs may use different chroot
    setups.

    ^[8] Simply «logout and login under some modern GUI Desktop
    environment» may not update your group membership.

Глава 5. Simple packaging

    There is an old Latin saying: «Longum iter est per praecepta,
    breve et efficax per exempla» («It’s a long way by the rules, but
    short and efficient with examples»).

5.1. Packaging tarball

    Ниже приведён пример создания простого пакета Debian из простого
    исходного кода на языке C, использующего в качестве системы
    сборки Makefile.

    Допустим, имя tar-архива из основной ветки разработки будет 
    debhello-0.0.tar.gz.

    Предполагается, что этот тип исходного кода будет установлен как
    несистемный файл:

    Basics for the install from the upstream tarball. 

     $ tar -xzmf debhello-0.0.tar.gz
     $ cd debhello-0.0
     $ make
     $ make install

    Debian packaging requires changing this «make install» process to
    install files to the target system image location instead of the
    normal location under /usr/local.

    Примечание
   
    Примеры создания пакета Debian из других более сложных систем
    сборки описаны в «Глава 13, Дополнительные примеры».

5.2. Общая картина

    Общая картина сборки простого неродного пакета Debian из
    tar-архива основной ветки разработки debhello-0.0.tar.gz может
    быть представлена следующим образом:

      * Сопровождающий получает tar-архив debhello-0.0.tar.gz из
        основной ветки разработки и распаковывает его содержимое в
        каталог debhello-0.0.
      * Команда debmake добавляет шаблонные файлы исключительно в
        каталог debian.

          + Создаётся символьная ссылка debhello_0.0.orig.tar.gz,
            указывающая на файл debhello-0.0.tar.gz.
          + Сопровождающий настраивает шаблонные файлы.
      * Команда debuild собирает двоичный пакет из подготовленного
        дерева исходного кода.

          + Создаётся файл debhello-0.0-1.debian.tar.xz, содержащий
            каталог debian.

    Общая картина сборки пакета. 

     $ tar -xzmf debhello-0.0.tar.gz
     $ cd debhello-0.0
     $ debmake
       ... manual customization
     $ debuild
       ...

    Подсказка
   
    The debuild command in this and following examples may be
    substituted by equivalent commands such as the sbuild command.

    Подсказка

    Если доступен tar-архив основной ветки разработки в формате 
    .tar.xz, то используйте его вместо архивов в формате .tar.gz или 
    .tar.bz2. Утилита xz предлагает более высокую степень сжатия, чем
    gzip и bzip2.

5.3. Что такое debmake?

    Примечание

    Actual packaging activities are often performed manually without
    using debmake while referencing only existing similar packages
    and «Debian Policy Manual».

    The debmake command is the helper script for the Debian
    packaging. («Глава 14, Страница руководства debmake(1)»)

      * It creates good template files for the Debian packages.
      * Она всегда устанавливает большинство очевидных опций в
        разумные значения.
      * Создаёт tar-архив основной ветки разработки и необходимую
        символьную ссылку в случае их отсутствия.
      * Не переписывает существующие файлы настройки в каталоге 
        debian/.
      * Поддерживает мультиархитектурные пакеты.
      * It provides short extracted license texts as debian/copyright
        in decent accuracy to help license review.

    Эти возможности делают работу с пакетами Debian с помощью debmake
    простой и современной.

    In retrospective, I created debmake to simplify this
    documentation. I consider debmake to be more-or-less a
    demonstration session generator for tutorial purpose.

    The debmake command isn’t the only helper script to make a Debian
    package. If you are interested alternative packaging helper
    tools, please see:

      * Debian wiki: «AutomaticPackagingTools» — Extensive comparison
        of packaging helper scripts
      * Debian wiki: «CopyrightReviewTools» — Extensive comparison of
        copyright review helper scripts

5.4. Что такое debuild?

    Ниже приведён обзор команд, похожих на команду debuild.

      * Файл debian/rules определяет то, как будет собран двоичный
        пакет Debian.
      * dpkg-buildpackage — официальная команда для сборки двоичного
        пакета Debian. Для обычной двоичной сборки она, грубо говоря,
        выполняет следующую последовательность команд:

          + «dpkg-source --before-build» (apply Debian patches,
            unless they are already applied)
          + «fakeroot debian/rules clean»
          + «dpkg-source --build» (build the Debian source package)
          + «fakeroot debian/rules build»
          + «fakeroot debian/rules binary»
          + «dpkg-genbuildinfo» (generate a *.buildinfo file)
          + «dpkg-genchanges» (generate a *.changes file)
          + «fakeroot debian/rules clean»
          + «dpkg-source --after-build» (unapply Debian patches, if
            they are applied during --before-build)
          + «debsign» (sign the *.dsc and *.changes files)

              o Если вы следовали инструкциям (см. «Раздел 4.5, «
                devscripts setup»») и передали программе сборки опции
                -us и -uc, то данный шаг будет пропущен, а для
                подписи требуется вручную запустить команду debsign.
      * Команда debuild представляет собой обёртку для команды 
        dpkg-buildpackage, которая собирает двоичный пакет Debian в
        окружении с подходящими значениями переменных окружения.
      * The sbuild command is a wrapper script to build the Debian
        binary package under the proper chroot environment with the
        proper environment variables.

    Примечание
   
    Подробную информацию см. в dpkg-buildpackage(1).

5.5. Шаг 1: получение исходного кода основной ветки разработки

    Получим исходный код основной ветки разработки.

    Скачаем файл debhello-0.0.tar.gz. 

     $ wget http://www.example.org/download/debhello-0.0.tar.gz
     ...
     $ tar -xzmf debhello-0.0.tar.gz
     $ tree
    .
    ├── debhello-0.0
    │   ├── Makefile
    │   ├── README.md
    │   └── src
    │       └── hello.c
    └── debhello-0.0.tar.gz

    3 directories, 4 files

    В нём содержится исходный код на языке C, hello.c, довольно
    простой.

    hello.c. 

     $ cat debhello-0.0/src/hello.c
    #include <stdio.h>
    int
    main()
    {
            printf("Hello, world!\n");
            return 0;
    }

    Итак, Makefile соответствует «Стандартам написания кода GNU» и «
    Стандарту иерархии файловой системы». А именно:

      * сборку двоичных файлов с учётом значений $(CPPFLAGS), $
        (CFLAGS), $(LDFLAGS) и т. д.
      * установку файлов с учётом $(DESTDIR) в качестве целевого
        системного образа
      * установку файлов с $(prefix), который можно изменить на /usr

    Makefile. 

     $ cat debhello-0.0/Makefile
    prefix = /usr/local

    all: src/hello

    src/hello: src/hello.c
            @echo "CFLAGS=$(CFLAGS)" | \
                    fold -s -w 70 | \
                    sed -e 's/^/# /'
            $(CC) $(CPPFLAGS) $(CFLAGS) $(LDCFLAGS) -o $@ $^
   
    install: src/hello
            install -D src/hello \
                    $(DESTDIR)$(prefix)/bin/hello

    clean:
            -rm -f src/hello

    distclean: clean

    uninstall:
            -rm -f $(DESTDIR)$(prefix)/bin/hello

    .PHONY: all install clean distclean uninstall

    Примечание
   
    В приведённом ниже примере применение команды echo к $(CFLAGS)
    используется для проверки настройки сборочных флагов.

5.6. Step 2: Generate template files with debmake

    Вывод команды debmake довольно подробен, в нём объяснены
    выполняемые действия, например, как это указано ниже.

    The output from the debmake command. 

     $ cd /path/to/debhello-0.0
     $ debmake -x1
    I: set parameters
    I: sanity check of parameters
    I: pkg="debhello", ver="0.0", rev="1"
    I: *** start packaging in "debhello-0.0". ***
    I: provide debhello_0.0.orig.tar.gz for non-native Debian package
    I: pwd = "/path/to"
    I: $ ln -sf debhello-0.0.tar.gz debhello_0.0.orig.tar.gz
    I: pwd = "/path/to/debhello-0.0"
    I: parse binary package settings:
    I: binary package=debhello Type=bin / Arch=any M-A=foreign
    I: analyze the source tree
    I: build_type = make
    I: scan source for copyright+license text and file extensions
    I:  50 %, ext = md
    I:  50 %, ext = c
    I: check_all_licenses
    I: ...
    I: check_all_licenses completed for 3 files.
    I: bunch_all_licenses
    I: format_all_licenses
    I: make debian/* template files
    I: debmake -x "1" ...
    I: creating => debian/control
    I: creating => debian/copyright
    I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra0_changel...
    I: creating => debian/changelog
    I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra0_rules.t...
    I: creating => debian/rules
    I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra0source_f...
    I: creating => debian/source/format
    I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1_README....
    I: creating => debian/README.Debian
    I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1_README....
    I: creating => debian/README.source
    I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1_clean.t...
    I: creating => debian/clean
    I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1_gbp.con...
    I: creating => debian/gbp.conf
    I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1_salsa-c...
    I: creating => debian/salsa-ci.yml
    I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1_watch.t...
    I: creating => debian/watch
    I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1tests_co...
    I: creating => debian/tests/control
    I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1upstream...
    I: creating => debian/upstream/metadata
    I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1patches_...
    I: creating => debian/patches/series
    I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1source.n...
    I: creating => debian/source/local-options.ex
    I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1source.n...
    I: creating => debian/source/local-patch-header.ex
    I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1single_d...
    I: creating => debian/dirs
    I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1single_i...
    I: creating => debian/install
    I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1single_l...
    I: creating => debian/links
    I: $ wrap-and-sort
    I: $ wrap-and-sort complete.  Now, debian/* may have a blank line at the top....

    Команда debmake создаёт все шаблонные файлы на основе опций
    командной строки. Поскольку никакие опции не были переданы,
    команда debmake выбирает для вас разумные значения по умолчанию:

      * Имя пакета с исходным кодом: debhello
      * Версия основной ветки разработки: 0.0
      * Имя двоичного пакета: debhello
      * Номер редакции Debian: 1
      * Тип пакета: bin (пакет с двоичными исполняемыми файлами
        формата ELF)
      * The -x option: -x1 (without maintainer script supports for
        simplicity)

    Примечание

    Here, the debmake command is invoked with the -x1 option to keep
    this tutorial simple. Use of default -x3 option is highly
    recommended.

    Проверим созданные шаблонные файлы.

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

     $ cd /path/to
     $ tree
    .
    ├── debhello-0.0
    │   ├── Makefile
    │   ├── README.md
    │   ├── debian
    │   │   ├── README.Debian
    │   │   ├── README.source
    │   │   ├── changelog
    │   │   ├── clean
    │   │   ├── control
    │   │   ├── copyright
    │   │   ├── dirs
    │   │   ├── gbp.conf
    │   │   ├── install
    │   │   ├── links
    │   │   ├── patches
    │   │   │   └── series
    │   │   ├── rules
    │   │   ├── salsa-ci.yml
    │   │   ├── source
    │   │   │   ├── format
    │   │   │   ├── local-options.ex
    │   │   │   └── local-patch-header.ex
    │   │   ├── tests
    │   │   │   └── control
    │   │   ├── upstream
    │   │   │   └── metadata
    │   │   └── watch
    │   └── src
    │       └── hello.c
    ├── debhello-0.0.tar.gz
    └── debhello_0.0.orig.tar.gz -> debhello-0.0.tar.gz

    8 directories, 24 files

    Файл debian/rules является сборочным сценарием, предоставляемым
    сопровождающим пакета. Ниже приводится его шаблонный файл,
    созданный командой debmake.

    debian/rules (шаблонный файл): 

     $ cd /path/to/debhello-0.0
     $ cat debian/rules
    #!/usr/bin/make -f
    # You must remove unused comment lines for the released package.
    #export DH_VERBOSE = 1
    #export DEB_BUILD_MAINT_OPTIONS = hardening=+all
    #export DEB_CFLAGS_MAINT_APPEND  = -Wall -pedantic
    #export DEB_LDFLAGS_MAINT_APPEND = -Wl,-O1

    %:
            dh $@

    #override_dh_auto_install:
    #       dh_auto_install -- prefix=/usr

    #override_dh_install:
    #       dh_install --list-missing -X.pyc -X.pyo

    По сути, это стандартный файл debian/rules с командой dh. (Для
    удобства настройки в нём содержится несколько закомментированных
    строк.)

    Файл debian/control предоставляет основные метаданные пакета
    Debian. Ниже приведён шаблонный файл, созданный командой debmake.

    debian/control (шаблонный файл): 

     $ cat debian/control
    Source: debhello
    Section: unknown
    Priority: optional
    Maintainer: "Osamu Aoki" <osamu@debian.org>
    Build-Depends: debhelper-compat (= 13)
    Standards-Version: 4.6.2
    Homepage: <insert the upstream URL, if relevant>
    Rules-Requires-Root: no
    #Vcs-Git: https://salsa.debian.org/debian/debhello.git
    #Vcs-Browser: https://salsa.debian.org/debian/debhello

    Package: debhello
    Architecture: any
    Multi-Arch: foreign
    Depends: ${misc:Depends}, ${shlibs:Depends}
    Description: auto-generated package by debmake
     This Debian binary package was auto-generated by the
     debmake(1) command provided by the debmake package.

    Предупреждение
   
    If you leave «Section: unknown» in the template debian/control
    file unchanged, the lintian error may cause the build to fail.

    Since this is the ELF binary executable package, the debmake
    command sets «Architecture: any» and «Multi-Arch: foreign». Also,
    it sets required substvar parameters as «Depends: $
    {shlibs:Depends}, ${misc:Depends}». These are explained in «
    Глава 6, Basics for packaging».

    Примечание

    Please note this debian/control file uses the RFC-822 style as
    documented in «5.2 Source package control files — debian/control»
    of the «Debian Policy Manual». The use of the empty line and the
    leading space are significant.

    Файл debian/copyright предоставляет данные об авторском праве на
    пакет Debian. Ниже приведён шаблонный файл, созданный командой 
    debmake.

    debian/copyright (шаблонный файл): 

     $ cat debian/copyright
    Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
    Upstream-Name: debhello
    Upstream-Contact: <preferred name and address to reach the upstream project>
    Source: <url://example.com>
    #
    # Please double check copyright with the licensecheck(1) command.
   
    Files:     Makefile
               README.md
               src/hello.c
    Copyright: __NO_COPYRIGHT_NOR_LICENSE__
    License:   __NO_COPYRIGHT_NOR_LICENSE__

    #----------------------------------------------------------------------------...
    # Files marked as NO_LICENSE_TEXT_FOUND may be covered by the following
    # license/copyright files.

5.7. Шаг 3: изменение шаблонных файлов

    От сопровождающего требуется вручную внести некоторые изменения
    шаблонных файлов.

    In order to install files as a part of the system files, the $
    (prefix) value of /usr/local in the Makefile should be overridden
    to be /usr. This can be accommodated by the following the debian/
    rules file with the override_dh_auto_install target setting «
    prefix=/usr».

    debian/rules (версия сопровождающего): 

     $ cd /path/to/debhello-0.0
     $ vim debian/rules
     ... hack, hack, hack, ...
     $ cat debian/rules
    #!/usr/bin/make -f
    export DH_VERBOSE = 1
    export DEB_BUILD_MAINT_OPTIONS = hardening=+all
    export DEB_CFLAGS_MAINT_APPEND  = -Wall -pedantic
    export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed

    %:
            dh $@

    override_dh_auto_install:
            dh_auto_install -- prefix=/usr

    Экспортирование переменой окружения DH_VERBOSE в файле debian/
    rules, как это сделано выше, приводит к тому, что инструмент 
    debhelper создаёт более подробный отчёт о сборке.

    Exporting DEB_BUILD_MAINT_OPTION as above sets the hardening
    options as described in the «FEATURE AREAS/ENVIRONMENT» in 
    dpkg-buildflags(1). ^[9]

    Exporting DEB_CFLAGS_MAINT_APPEND as above forces the C compiler
    to emit all the warnings.

    Exporting DEB_LDFLAGS_MAINT_APPEND as above forces the linker to
    link only when the library is actually needed. ^[10]

    The dh_auto_install command for the Makefile based build system
    essentially runs «$(MAKE) install DESTDIR=debian/debhello». The
    creation of this override_dh_auto_install target changes its
    behavior to «$(MAKE) install DESTDIR=debian/debhello prefix=/usr»
    .

    Here are the maintainer versions of the debian/control and debian
    /copyright files.

    debian/control (версия сопровождающего): 

     $ vim debian/control
     ... hack, hack, hack, ...
     $ cat debian/control
    Source: debhello
    Section: devel
    Priority: optional
    Maintainer: Osamu Aoki <osamu@debian.org>
    Build-Depends: debhelper-compat (= 13)
    Standards-Version: 4.6.2
    Homepage: https://salsa.debian.org/debian/debmake-doc
    Rules-Requires-Root: no

    Package: debhello
    Architecture: any
    Multi-Arch: foreign
    Depends: ${misc:Depends}, ${shlibs:Depends}
    Description: Simple packaging example for debmake
     This Debian binary package is an example package.
     (This is an example only)

    debian/copyright (версия сопровождающего): 

     $ vim debian/copyright
     ... hack, hack, hack, ...
     $ cat debian/copyright
    Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
    Upstream-Name: debhello
    Upstream-Contact: Osamu Aoki <osamu@debian.org>
    Source: https://salsa.debian.org/debian/debmake-doc

    Files:     *
    Copyright: 2015-2021 Osamu Aoki <osamu@debian.org>
    License:   Expat
     Permission is hereby granted, free of charge, to any person obtaining a
     copy of this software and associated documentation files (the "Software"),
     to deal in the Software without restriction, including without limitation
     the rights to use, copy, modify, merge, publish, distribute, sublicense,
     and/or sell copies of the Software, and to permit persons to whom the
     Software is furnished to do so, subject to the following conditions:
     .
     The above copyright notice and this permission notice shall be included
     in all copies or substantial portions of the Software.
     .
     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
     IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
     CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

    Let’s remove unused template files and edit remaining template
    files:

      * debian/README.source
      * debian/source/local-option.ex
      * debian/source/local-patch-header.ex
      * debian/patches/series (No upstream patch)
      * clean
      * dirs
      * install
      * links

    Шаблонные файлы в debian/. (v=0.0): 

     $ rm -f debian/clean debian/dirs debian/install debian/links
     $ rm -f debian/README.source debian/source/*.ex
     $ rm -rf debian/patches
     $ tree -F debian
    debian/
    ├── README.Debian
    ├── changelog
    ├── control
    ├── copyright
    ├── gbp.conf
    ├── rules*
    ├── salsa-ci.yml
    ├── source/
    │   └── format
    ├── tests/
    │   └── control
    ├── upstream/
    │   └── metadata
    └── watch

    4 directories, 11 files

    Подсказка
   
    Configuration files used by the dh_* commands from the debhelper
    package usually treat # as the start of a comment line.

5.8. Step 4: Building package with debuild

    В данном дереве исходного кода вы можете создать неродной пакет
    Debian с помощью команды debuild или эквивалентных ей команд (см.
    «Раздел 5.4, «Что такое debuild?»»). Вывод команды очень
    подробен, выполняемые действия объясняются в нём следующим
    образом.

    Building package with debuild. 

     $ cd /path/to/debhello-0.0
     $ debuild
     dpkg-buildpackage -us -uc -ui -i
    dpkg-buildpackage: info: source package debhello
    dpkg-buildpackage: info: source version 0.0-1
    dpkg-buildpackage: info: source distribution unstable
    dpkg-buildpackage: info: source changed by Osamu Aoki <osamu@debian.org>
     dpkg-source -i --before-build .
    dpkg-buildpackage: info: host architecture amd64
     debian/rules clean
    dh clean
       dh_auto_clean
            make -j12 distclean
     ...
     debian/rules binary
    dh binary
       dh_update_autotools_config
       dh_autoreconf
       dh_auto_configure
       dh_auto_build
            make -j12 "INSTALL=install --strip-program=true"
    make[1]: Entering directory '/path/to/debhello-0.0'
    # CFLAGS=-g -O2
     ...
    Finished running lintian.

    You can verify that CFLAGS is updated properly with -Wall and 
    -pedantic by the DEB_CFLAGS_MAINT_APPEND variable.

    The manpage should be added to the package as reported by the 
    lintian package, as shown in later examples (see «Глава 13, 
    Дополнительные примеры»). Let’s move on for now.

    Проверим результат сборки.

    Файлы debhello версии 0.0, созданные с помощью команды debuild: 

     $ cd /path/to
     $ tree -FL 1
    ./
    ├── debhello-0.0/
    ├── debhello-0.0.tar.gz
    ├── debhello-dbgsym_0.0-1_amd64.deb
    ├── debhello_0.0-1.debian.tar.xz
    ├── debhello_0.0-1.dsc
    ├── debhello_0.0-1_amd64.build
    ├── debhello_0.0-1_amd64.buildinfo
    ├── debhello_0.0-1_amd64.changes
    ├── debhello_0.0-1_amd64.deb
    └── debhello_0.0.orig.tar.gz -> debhello-0.0.tar.gz

    2 directories, 9 files

    Вы видите все созданные файлы.

      * debhello_0.0.orig.tar.gz представляет собой символьную ссылку
        на tar-архив основной ветки разработки.
      * debhello_0.0-1.debian.tar.xz содержит файлы, созданные
        сопровождающим.
      * debhello_0.0-1.dsc представляет собой файл с метаданными для
        пакета Debian с исходным кодом.
      * debhello_0.0-1_amd64.deb — двоичный пакет Debian.
      * The debhello-dbgsym_0.0-1_amd64.deb is the Debian debug
        symbol binary package. See «Раздел 9.21, «-dbgsym package»».
      * The debhello_0.0-1_amd64.build file is the build log file.
      * The debhello_0.0-1_amd64.buildinfo file is the meta data file
        generated by dpkg-genbuildinfo(1).
      * debhello_0.0-1_amd64.changes — файл с метаданными для
        двоичного пакета Debian.

    debhello_0.0-1.debian.tar.xz содержит изменения Debian, внесённые
    в исходный код основной ветки разработки. Содержимое этого файла
    приведено ниже.

    Содержимое архива debhello_0.0-1.debian.tar.xz: 

     $ tar -tzf debhello-0.0.tar.gz
    debhello-0.0/
    debhello-0.0/src/
    debhello-0.0/src/hello.c
    debhello-0.0/Makefile
    debhello-0.0/README.md
     $ tar --xz -tf debhello_0.0-1.debian.tar.xz
    debian/
    debian/README.Debian
    debian/changelog
    debian/control
    debian/copyright
    debian/gbp.conf
    debian/rules
    debian/salsa-ci.yml
    debian/source/
    debian/source/format
    debian/tests/
    debian/tests/control
    debian/upstream/
    debian/upstream/metadata
    debian/watch

    The debhello_0.0-1_amd64.deb contains the binary files to be
    installed to the target system.

    The debhello-debsym_0.0-1_amd64.deb contains the debug symbol
    files to be installed to the target system.

    The binary package contents of all binary packages: 

     $ dpkg -c debhello-dbgsym_0.0-1_amd64.deb
    drwxr-xr-x root/root ...  ./
    drwxr-xr-x root/root ...  ./usr/
    drwxr-xr-x root/root ...  ./usr/lib/
    drwxr-xr-x root/root ...  ./usr/lib/debug/
    drwxr-xr-x root/root ...  ./usr/lib/debug/.build-id/
    drwxr-xr-x root/root ...  ./usr/lib/debug/.build-id/be/
    -rw-r--r-- root/root ...  ./usr/lib/debug/.build-id/be/f1e0185834f3c3e2614cf8...
    drwxr-xr-x root/root ...  ./usr/share/
    drwxr-xr-x root/root ...  ./usr/share/doc/
    lrwxrwxrwx root/root ...  ./usr/share/doc/debhello-dbgsym -> debhello
     $ dpkg -c debhello_0.0-1_amd64.deb
    drwxr-xr-x root/root ...  ./
    drwxr-xr-x root/root ...  ./usr/
    drwxr-xr-x root/root ...  ./usr/bin/
    -rwxr-xr-x root/root ...  ./usr/bin/hello
    drwxr-xr-x root/root ...  ./usr/share/
    drwxr-xr-x root/root ...  ./usr/share/doc/
    drwxr-xr-x root/root ...  ./usr/share/doc/debhello/
    -rw-r--r-- root/root ...  ./usr/share/doc/debhello/README.Debian
    -rw-r--r-- root/root ...  ./usr/share/doc/debhello/changelog.Debian.gz
    -rw-r--r-- root/root ...  ./usr/share/doc/debhello/copyright

    The generated dependency list of all binary packages.

    The generated dependency list of all binary packages (v=0.0): 

     $ dpkg -f debhello-dbgsym_0.0-1_amd64.deb pre-depends \
                depends recommends conflicts breaks
    Depends: debhello (= 0.0-1)
     $ dpkg -f debhello_0.0-1_amd64.deb pre-depends \
                depends recommends conflicts breaks
    Depends: libc6 (>= 2.34)

    Внимание
   
    Many more details need to be addressed before uploading the
    package to the Debian archive.

    Примечание

    Если вы пропустили ручную настройку автоматически созданных
    командой debmake файлов настройки, то у созданного двоичного
    пакета может отсутствовать понятное другим описание пакета, а
    также пакет может несоответствовать некоторым требованиям
    политики. Такой сырой пакет вполне хорошо работает, если передать
    его команде dpkg, и может оказаться вполне достаточным для его
    локального развёртывания.

5.9. Step 3 (alternatives): Modification to the upstream source

    The above example did not touch the upstream source to make the
    proper Debian package. An alternative approach as the maintainer
    is to modify files in the upstream source. For example, Makefile
    may be modified to set the $(prefix) value to /usr.

    Примечание

    The above «Раздел 5.7, «Шаг 3: изменение шаблонных файлов»» using
    the debian/rules file is the better approach for packaging for
    this example. But let’s continue on with this alternative
    approaches as a leaning experience.

    In the following, let’s consider 3 simple variants of this
    alternative approach to generate debian/patches/* files
    representing modifications to the upstream source in the Debian
    source format «3.0 (quilt)». These substitute «Раздел 5.7, «Шаг
    3: изменение шаблонных файлов»» in the above step-by-step
    example:

      * «Раздел 5.10, «Patch by «diff -u» approach»»
      * «Раздел 5.11, «Patch by dquilt approach»»
      * «Раздел 5.12, «Patch by «dpkg-source --auto-commit» approach»
        »

    Please note the debian/rules file used for these examples doesn’t
    have the override_dh_auto_install target as follows:

    debian/rules (альтернативная версия сопровождающего): 

     $ cd /path/to/debhello-0.0
     $ vim debian/rules
     ... hack, hack, hack, ...
     $ cat debian/rules
    #!/usr/bin/make -f
    export DH_VERBOSE = 1
    export DEB_BUILD_MAINT_OPTIONS = hardening=+all
    export DEB_CFLAGS_MAINT_APPEND  = -Wall -pedantic
    export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed

    %:
            dh $@

5.10. Patch by «diff -u» approach

    Here, the patch file 000-prefix-usr.patch is created using the 
    diff command.

    Patch by «diff -u». 

     $ cp -a debhello-0.0 debhello-0.0.orig
     $ vim debhello-0.0/Makefile
     ... hack, hack, hack, ...
     $ diff -Nru debhello-0.0.orig debhello-0.0 >000-prefix-usr.patch
     $ cat 000-prefix-usr.patch
    diff -Nru debhello-0.0.orig/Makefile debhello-0.0/Makefile
    --- debhello-0.0.orig/Makefile  2024-07-24 10:12:40.382927188 +0900
    +++ debhello-0.0/Makefile       2024-07-24 10:12:40.478928659 +0900
    @@ -1,4 +1,4 @@
    -prefix = /usr/local
    +prefix = /usr

     all: src/hello

     $ rm -rf debhello-0.0
     $ mv -f debhello-0.0.orig debhello-0.0

    Please note that the upstream source tree is restored to the
    original state after generating a patch file 000-prefix-usr.patch
    .

    This 000-prefix-usr.patch is edited to be DEP-3 conforming and
    moved to the right location as below.

    000-prefix-usr.patch (DEP-3): 

     $ echo '000-prefix-usr.patch' >debian/patches/series
     $ vim ../000-prefix-usr.patch
     ... hack, hack, hack, ...
     $ mv -f ../000-prefix-usr.patch debian/patches/000-prefix-usr.patch
     $ cat debian/patches/000-prefix-usr.patch
    From: Osamu Aoki <osamu@debian.org>
    Description: set prefix=/usr patch
    diff -Nru debhello-0.0.orig/Makefile debhello-0.0/Makefile
    --- debhello-0.0.orig/Makefile
    +++ debhello-0.0/Makefile
    @@ -1,4 +1,4 @@
    -prefix = /usr/local
    +prefix = /usr

     all: src/hello

    Примечание

    When generating the Debian source package by dpkg-source via 
    dpkg-buildpackage in the following step of «Раздел 5.8, «Step 4:
    Building package with debuild»», the dpkg-source command assumes
    that no patch was applied to the upstream source, since the .pc/
    applied-patches is missing.

5.11. Patch by dquilt approach

    Here, the patch file 000-prefix-usr.patch is created using the 
    dquilt command.

    dquilt is a simple wrapper of the quilt program. The syntax and
    function of the dquilt command is the same as the quilt(1)
    command, except for the fact that the generated patch is stored
    in the debian/patches/ directory.

    Patch by dquilt. 

     $ dquilt new 000-prefix-usr.patch
    Patch debian/patches/000-prefix-usr.patch is now on top
     $ dquilt add Makefile
    File Makefile added to patch debian/patches/000-prefix-usr.patch
     ... hack, hack, hack, ...
     $ head -1 Makefile
    prefix = /usr
     $ dquilt refresh
    Refreshed patch debian/patches/000-prefix-usr.patch
     $ dquilt header -e --dep3
     ... edit the DEP-3 patch header with editor
     $ tree -a
    .
    ├── debian
    │   ├── changelog
    │   ├── clean
    │   ├── control
    │   ├── copyright
    │   ├── dirs
    │   ├── gbp.conf
    │   ├── install
    │   ├── links
    │   ├── patches
    │   │   ├── 000-prefix-usr.patch
    │   │   └── series
    │   ├── README.Debian
    │   ├── README.source
    │   ├── rules
    │   ├── salsa-ci.yml
    │   ├── source
    │   │   ├── format
    │   │   ├── local-options.ex
    │   │   └── local-patch-header.ex
    │   ├── tests
    │   │   └── control
    │   ├── upstream
    │   │   └── metadata
    │   └── watch
    ├── Makefile
    ├── .pc
    │   ├── 000-prefix-usr.patch
    │   │   ├── Makefile
    │   │   └── .timestamp
    │   ├── applied-patches
    │   ├── .quilt_patches
    │   ├── .quilt_series
    │   └── .version
    ├── README.md
    └── src
        └── hello.c

    9 directories, 29 files
     $ cat debian/patches/series
    000-prefix-usr.patch
     $ cat debian/patches/000-prefix-usr.patch
    Description: set prefix=/usr patch
    Author: Osamu Aoki <osamu@debian.org>
    Index: debhello-0.0/Makefile
    ===================================================================
    --- debhello-0.0.orig/Makefile
    +++ debhello-0.0/Makefile
    @@ -1,4 +1,4 @@
    -prefix = /usr/local
    +prefix = /usr

     all: src/hello

    Here, Makefile in the upstream source tree doesn’t need to be
    restored to the original state for the packaging.

    Примечание

    When generating the Debian source package by dpkg-source via 
    dpkg-buildpackage in the following step of «Раздел 5.8, «Step 4:
    Building package with debuild»», the dpkg-source command assumes
    that patches were applied to the upstream source, since the .pc/
    applied-patches exists.

    The upstream source tree can be restored to the original state
    for the packaging.

    The upstream source tree (restored): 

     $ dquilt pop -a
    Removing patch debian/patches/000-prefix-usr.patch
    Restoring Makefile

    No patches applied
     $ head -1 Makefile
    prefix = /usr/local
     $ tree -a .pc
    .pc
    ├── .quilt_patches
    ├── .quilt_series
    └── .version

    1 directory, 3 files

    Here, Makefile is restored and the .pc/applied-patches is
    missing.

5.12. Patch by «dpkg-source --auto-commit» approach

    Here, the patch file isn’t created in this step but the source
    files are setup to create debian/patches/* files in the following
    step of «Раздел 5.8, «Step 4: Building package with debuild»».

    Отредактируем исходный код основной ветки разработки.

    Modified Makefile. 

     $ vim Makefile
     ... hack, hack, hack, ...
     $ head -n1 Makefile
    prefix = /usr

    Let’s edit debian/source/local-options:

    debian/source/local-options for auto-commit. 

     $ mv debian/source/local-options.ex debian/source/local-options
     $ vim debian/source/local-options
     ... hack, hack, hack, ...
     $ cat debian/source/local-options
    # == Patch applied strategy (merge) ==
    #
    # The source outside of debian/ directory is modified by maintainer and
    # different from the upstream one:
    #   * Workflow using dpkg-source commit (commit all to VCS after dpkg-source ...
    #       https://www.debian.org/doc/manuals/debmake-doc/ch04.en.html#dpkg-sour...
    #   * Workflow described in dgit-maint-merge(7)
    #
    single-debian-patch
    auto-commit

    Let’s edit debian/source/local-patch-header:

    debian/source/local-patch-header for auto-commit. 

     $ mv debian/source/local-patch-header.ex debian/source/local-patch-header
     $ vim debian/source/local-patch-header
     ... hack, hack, hack, ...
     $ cat debian/source/local-patch-header
    Description: debian-changes
    Author: Osamu Aoki <osamu@debian.org>

    Let’s remove debian/patches/* files and other unused template
    files.

    Remove unused template files. 

     $ rm -f debian/clean debian/dirs debian/install debian/links
     $ rm -f debian/README.source debian/source/*.ex
     $ rm -rf debian/patches
     $ tree debian
    debian
    ├── README.Debian
    ├── changelog
    ├── control
    ├── copyright
    ├── gbp.conf
    ├── rules
    ├── salsa-ci.yml
    ├── source
    │   ├── format
    │   ├── local-options
    │   └── local-patch-header
    ├── tests
    │   └── control
    ├── upstream
    │   └── metadata
    └── watch

    4 directories, 13 files

    There are no debian/patches/* files at the end of this step.

    Примечание

    When generating the Debian source package by dpkg-source via 
    dpkg-buildpackage in the following step of «Раздел 5.8, «Step 4:
    Building package with debuild»», the dpkg-source command uses
    options specified in debian/source/local-options to auto-commit
    modification applied to the upstream source as patches/
    debian-changes.

    Let’s inspect the Debian source package generated after the
    following «Раздел 5.8, «Step 4: Building package with debuild»»
    step and extracting files from debhello-0.0.debian.tar.xz.

    Inspect debhello-0.0.debian.tar.xz after debuild. 

     $ tar --xz -xvf debhello_0.0-1.debian.tar.xz
    debian/
    debian/README.Debian
    debian/changelog
    debian/control
    debian/copyright
    debian/gbp.conf
    debian/patches/
    debian/patches/debian-changes
    debian/patches/series
    debian/rules
    debian/salsa-ci.yml
    debian/source/
    debian/source/format
    debian/tests/
    debian/tests/control
    debian/upstream/
    debian/upstream/metadata
    debian/watch

    Let’s check generated debian/patches/* files.

    Inspect debian/patches/* after debuild. 

     $ cat debian/patches/series
    debian-changes
     $ cat debian/patches/debian-changes
    Description: debian-changes
    Author: Osamu Aoki <osamu@debian.org>
   
    --- debhello-0.0.orig/Makefile
    +++ debhello-0.0/Makefile
    @@ -1,4 +1,4 @@
    -prefix = /usr/local
    +prefix = /usr

     all: src/hello

    The Debian source package debhello-0.0.debian.tar.xz is confirmed
    to be generated properly with debian/patches/* files for the
    Debian modification.


---------------------------------------------------------------------

    ^[9] This is a cliché to force a read-only relocation link for
    the hardening and to prevent the lintian warning «W: debhello:
    hardening-no-relro usr/bin/hello». This is not really needed for
    this example but should be harmless. The lintian tool seems to
    produce a false positive warning for this case which has no
    linked library.

    ^[10] This is a cliché to prevent overlinking for the complex
    library dependency case such as Gnome programs. This is not
    really needed for this simple example but should be harmless.

Глава 6. Basics for packaging

    Here, a broad overview is presented without using VCS operations
    for the basic rules of Debian packaging focusing on the
    non-native Debian package in the «3.0 (quilt)» format.

    Примечание

    Для ясности в дайльнейшем были умышленно опущены некоторые
    детали. Ознакомьтесь со страницами руководства dpkg-source(1), 
    dpkg-buildpackage(1), dpkg(1), dpkg-deb(1), deb(5) и др.

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

    The Debian binary package is a special archive file which holds a
    set of installable binary data with its associated information.

    Один пакет Debian с исходным кодом может использоваться для
    создания нескольких двоичных пакетов Debian, определяемых в файле
    debian/control.

    The non-native Debian package in the Debian source format «3.0
    (quilt)» is the most normal Debian source package format.

    Примечание

    Сущесвтует множество обёрточных сценариев. Используйте их для
    упрощения вашей работы, но обязательно разберитесь с основами их
    внутреннего устройства.

6.1. Работа по созданию пакета

    The Debian packaging workflow to create a Debian binary package
    involves generating several specifically named files (see «
    Раздел 6.3, «Имя пакета и версия»») as defined in the «Debian
    Policy Manual». This workflow can be summarized in 10 steps with
    some over simplification as follows.

     1. Загружается tar-архив основной ветки разработки в виде файла 
        пакет-версия.tar.gz.
     2. Этот архив распаковывается, создаётся множество файлов в
        каталоге пакет-версия/.
     3. Архив основной ветки разработки копируется (или создаётся
        символьная ссылка на него) в файл со специальным именем 
        имяпакета_версия.orig.tar.gz.

          + символ, разделяющий пакет и версию, заменяется с -
            (дефиса) на _ (подчёркивание)
          + к расширению добавляется .orig.
     4. К исходному коду основной ветки разработки в каталог 
        пакет-версия/debian/ добавляются файлы спецификации пакета
        Debian.

          + Обязательные файлы спецификации в каталоге debian/*:

            debian/rules
                Исполняемый сценарий для сборки пакета Debian (см. «
                Раздел 6.5, «debian/rules file»»)
            debian/control
                The package configuration file containing the source
                package name, the source build dependencies, the
                binary package name, the binary dependencies, etc.
                (see «Раздел 6.6, «debian/control file»»)
            debian/changelog
                Файл с историей пакета Debian, определяющий в первой
                строке версию пакета из основной ветки разработки и
                номер редакции Debian (см. «Раздел 6.7, «debian/
                changelog file»»)
            debian/copyright
                Информация об авторских правах и лицензии (см. «
                Раздел 6.8, «debian/copyright file»»)
          + Необязательные файлы спецификации в каталоге debian/*
            (see «Раздел 6.14, «Other debian/* files»»):
          + The debmake command invoked in the package-version/
            directory may be used to provide the initial template of
            these configuration files.

              o Обязательные файлы спецификации создаются даже при
                использовании опции -x0.
              o Команда debmake не перезаписывает какие-либо
                существующией файлы настройки.
          + These files must be manually edited to their perfection
            according to the «Debian Policy Manual» and «Debian
            Developer’s Reference».
     5. The dpkg-buildpackage command (usually from its wrapper 
        debuild or sbuild) is invoked in the package-version/
        directory to make the Debian source and binary packages by
        invoking the debian/rules script.

          + The current directory is set as: «CURDIR=/path/to/
            package-version/»
          + Create the Debian source package in the Debian source
            format «3.0 (quilt)» using dpkg-source(1)

              o package_version.orig.tar.gz (copy or symlink of 
                package-version.tar.gz)
              o package_version-revision.debian.tar.xz (tarball of 
                debian/ found in package-version/)
              o package_version-revision.dsc
          + Build the source using «debian/rules build» into $
            (DESTDIR)

              o «DESTDIR=debian/binarypackage/» for single binary
                package ^[11]
              o «DESTDIR=debian/tmp/» for multi binary package
          + Создание двоичного пакета Debian с помощью dpkg-deb(1), 
            dpkg-genbuildinfo(1) и dpkg-genchanges(1).

              o двоичныйпакет_версия-редакция_архитектура.deb
              o …​ (There may be multiple Debian binary package
                files.)
              o пакет_версия-редакция_архитектура.changes
              o package_version-revision_arch.buildinfo
     6. Проверка качества пакета Debian с помощью команды lintian.
        (рекомендуется)

          + Follow the rejection guidelines from ftp-master.

              o «REJECT-FAQ»
              o «Лист проверок для пакетов из NEW»
              o «Автоматические отклонения пакетов Lintian» («список
                тегов lintian»)
     7. Test the goodness of the generated Debian binary package
        manually by installing it and running its programs.
     8. After confirming the goodness, prepare files for the normal
        source-only upload to the Debian archive.
     9. Sign the Debian package file with the debsign command using
        your private GPG key.

          + Use «debsign package_version-revision_source.changes»
            (normal source-only upload situation)
          + Use «debsign package_version-revision_arch.changes»
            (exceptional binary upload situation such as NEW uploads,
            and security uploads) files for the binary Debian package
            upload.
    10. Upload the set of the Debian package files with the dput
        command to the Debian archive.

          + Use «dput package_version-revision_source.changes»
            (source-only upload)
          + Use «dput package_version-revision_arch.changes» (binary
            upload)

    Test building and confirming of the binary package goodness as
    above is the moral obligation as a diligent Debian developer but
    there is no physical barrier for people to skip such operations
    at this moment for the source-only upload.

    Теперь замените каждую часть имени файла.

      * часть пакет на имя пакета Debian с исходным кодом
      * часть двоичныйпакет на имя двоичного пакета Debian
      * часть версия на версию основной ветки разработки
      * часть редакция на номер редации Debian
      * the arch part with the package architecture (e.g., amd64)

    See also «Source-only uploads».

    Подсказка

    Использется множество различных стратегий по управлению заплатами
    и использованию систем управления версиями. Вам не следует
    использовать все из них.

    Подсказка

    There is very extensive documentation in «Chapter 6. Best
    Packaging Practices» in the «Debian Developer’s Reference».
    Please read it.

6.2. debhelper package

    Although a Debian package can be made by writing a debian/rules
    script without using the debhelper package, it is impractical to
    do so. There are too many modern «Debian Policy» required
    features to be addressed, such as application of the proper file
    permissions, use of the proper architecture dependent library
    installation path, insertion of the installation hook scripts,
    generation of the debug symbol package, generation of package
    dependency information, generation of the package information
    files, application of the proper timestamp for reproducible
    build, etc.

    Debhelper package provides a set of useful scripts in order to
    simplify Debian’s packaging workflow and reduce the burden of
    package maintainers. When properly used, they will help packagers
    handle and implement «Debian Policy» required features
    automatically.

    Процедура создания пакета Debian в современном стиле может быть
    организована в виде набора простых модульных действий:

      * using the dh command to invoke many utility scripts
        automatically from the debhelper package, and
      * настройка их поведения с помощью декларативных файлов
        настройки в каталоге debian/.

    You should almost always use debhelper as your package’s build
    dependency. This document also assumes that you are using a
    fairly contemporary version of debhelper to handle packaging
    works in the following contents.

    Примечание

    For debhelper «compat >= 9», the dh command exports compiler
    flags (CFLAGS, CXXFLAGS, FFLAGS, CPPFLAGS and LDFLAGS) with
    values as returned by dpkg-buildflags if they are not set
    previously. (The dh command calls set_buildflags defined in the 
    Debian::Debhelper::Dh_Lib module.)

    Примечание

    debhelper(1) changes its behavior with time. Please make sure to
    read debhelper-compat-upgrade-checklist(7) to understand the
    situation.

6.3. Имя пакета и версия

    Если исходный код основной ветки разработки поставляется в виде
    архива hello-0.9.12.tar.gz, можно использовать hello в качестве
    имени пакета с исходным кодом основной ветки разработки, а 0.9.12
    — в качестве версии основной ветки.

    There are some limitations for what characters may be used as a
    part of the Debian package. The most notable limitation is the
    prohibition of uppercase letters in the package name. Here is a
    summary as a set of regular expressions:

      * Upstream package name (-p): [-+.a-z0-9]{2,}
      * Binary package name (-b): [-+.a-z0-9]{2,}
      * Upstream version (-u): [0-9][-+.:~a-z0-9A-Z]*
      * Debian revision (-r): [0-9][+.~a-z0-9A-Z]*

    See the exact definition in «Chapter 5 - Control files and their
    fields» in the «Debian Policy Manual».

    Вам следует соответствующим образом изменить имя пакета и версию
    основной ветки разработки для создания пакета Debian.

    Для того, чтобы информация об имени пакета и номере версии
    эффективно обрабатывались такими популярными инструментами как
    команда aptitude, рекомендуется, чтобы длина имени пакета была
    равна 30 символам или была меньше; а общая длина версии и
    редакции была равна 14 символам или меньше. ^[12]

    Для того, чтобы не возникали конфликты, видимое пользователю имя
    двоичного пакета не следует выбирать из числа распространённых
    слов.

    If upstream does not use a normal versioning scheme such as 
    2.30.32 but uses some kind of date such as 11Apr29, a random
    codename string, or a VCS hash value as part of the version, make
    sure to remove them from the upstream version. Such information
    can be recorded in the debian/changelog file. If you need to
    invent a version string, use the YYYYMMDD format such as 20110429
    as upstream version. This ensures that the dpkg command
    interprets later versions correctly as upgrades. If you need to
    ensure a smooth transition to a normal version scheme such as 0.1
    in the future, use the 0~YYMMDD format such as 0~110429 as
    upstream version, instead.

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

    $ dpkg --compare-versions ver1 op ver2

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

      * Строки сравниваются в порядке с начала до конца.
      * Буквы больше чисел.
      * Числа сравниваются как целые числа.
      * Буквы сравниваются в порядке таблицы кодов ASCII.

    Также имеются специальные правила для символов точки (.), плюса (
    +) и тильды (~). Они показаны ниже.

    0.0 < 0.5 < 0.10 < 0.99 < 1 < 1.0~rc1 < 1.0 < 1.0+b1 < 1.0+nmu1 < 1.1 < 2.0

    Один сложный случай возникает тогда, когда разработчики основной
    ветки выпускают hello-0.9.12-ReleaseCandidate-99.tar.gz как
    предварительный выпуск для hello-0.9.12.tar.gz. Вам следует
    гарантировать, что обновление пакета Debian будет происходить
    правильно, переименовав для этого архив с исходным кодом основной
    ветки в hello-0.9.12~rc99.tar.gz.

6.4. Родной пакет Debian

    The non-native Debian package in the Debian source format «3.0
    (quilt)» is the most normal Debian source package format. The 
    debian/source/format file should have «3.0 (quilt)» in it as
    described in dpkg-source(1). The above workflow and the following
    packaging examples always use this format.

    A native Debian package is the rare Debian binary package format.
    It may be used only when the package is useful and valuable only
    for Debian. Thus, its use is generally discouraged.

    Внимание

    A native Debian package is often accidentally built when its
    upstream tarball is not accessible from the dpkg-buildpackage
    command with its correct name package_version.orig.tar.gz . This
    is a typical newbie mistake caused by making a symlink name with 
    «-» instead of the correct one with «_».

    A native Debian package has no separation between the upstream
    code and the Debian changes and consists only of the following:

      * package_version.tar.gz (copy or symlink of package-version
        .tar.gz with debian/* files.)
      * package_version.dsc

    If you need to create a native Debian package, create it in the
    Debian source format «3.0 (native)» using dpkg-source(1).

    Подсказка

    There is no need to create the tarball in advance if the native
    Debian package format is used. The debian/source/format file
    should have «3.0 (native)» in it as described in dpkg-source(1)
    and The debian/source/format file should have the version without
    the Debian revision (1.0 instead of 1.0-1). Then, the tarball
    containing is generated when «dpkg-source -b» is invoked in the
    source tree.

6.5. debian/rules file

    The debian/rules file is the executable script which re-targets
    the upstream build system to install files in the $(DESTDIR) and
    creates the archive file of the generated files as the deb file.
    The deb file is used for the binary distribution and installed to
    the system using the dpkg command.

    The Debian policy compliant debian/rules file supporting all the
    required targets can be written as simple as ^[13]:

    Простой файл debian/rules: 

    #!/usr/bin/make -f
    #export DH_VERBOSE = 1

    %:
            dh $@

    The dh command functions as the sequencer to call all required «
    dh target» commands at the right moment. ^[14]

      * dh clean : вычищет файлы в дереве исходного кода.
      * dh build : сборка дерева исходного кода
      * dh build-arch : сборка зависящих от архитектуры пакетов из
        дерева исходного кода
      * dh build-indep : сборка независящих от архитектуры пакетов из
        дерева исходного кода
      * dh install : установка двоичных файлов в $(DESTDIR)
      * dh install-arch : установка двоичных файлов в $(DESTDIR) для
        зависящих от архитектуры пакетов
      * dh install-indep : установка двоичных файлов в $(DESTDIR) для
        независящих от архитектуры пакетов
      * dh binary : создание файла deb
      * dh binary-arch : создание файла deb для зависящих от
        архитектуры пакетов
      * dh binary-indep : создание файла deb для независящих от
        архитектуры пакетов

    Here, $(DESTDIR) path depends on the build type.

      * «DESTDIR=debian/binarypackage/» for single binary package ^
        [15]
      * «DESTDIR=debian/tmp/» for multi binary package

    See «Раздел 8.2, «Customized debian/rules»» and «Раздел 8.3,
    «Variables for debian/rules»» for customization.

    Подсказка

    Setting «export DH_VERBOSE = 1» outputs every command that
    modifies files on the build system. Also it enables verbose build
    logs for some build systems.

6.6. debian/control file

    The debian/control file consists of blocks of meta data separated
    by a blank line. Each block of meta data defines the following in
    this order:

      * метаданных пакета Debian с исходным кодом
      * метаданные двоичных пакетов Debian

    See «Chapter 5 - Control files and their fields» of the «Debian
    Policy Manual» for the definition of each meta data.

    Примечание

    The debmake command sets the debian/control file with «
    Build-Depends: debhelper-compat (= 13)» to set the debhelper
    compatibility level.

    Подсказка
   
    If an existing package has lower than debhelper compatibility
    level 13, probably it’s time to update its packaging.

6.7. debian/changelog file

    The debian/changelog file records the Debian package history.

      * This should be edited using the debchange command (alias dch
        ).
      * This defines the upstream package version and the Debian
        revision in its first line.
      * The changes need to be documented in the specific, formal,
        and concise style.

          + If Debian maintainer modification fixes reported bugs,
            add «Closes: #<bug_number>» to close those bugs.
      * Even if you are uploading your package by yourself, you must
        document all non-trivial user-visible changes such as:

          + the security related bug fixes.
          + the user interface changes.
      * If you are asking your sponsor to upload it, you should
        document changes more comprehensively, including all
        packaging related ones, to help reviewing your package.

          + The sponsor shouldn’t be forced to second guess your
            thought behind your package.
          + The sponsor’s time is more valuable than yours.

    After finishing your packaging and verifying its quality, please
    execute the «dch -r» command and save the finalized debian/
    changelog file with the suite normally set to unstable. ^[16] If
    you are packaging for backports, security updates, LTS, etc.,
    please use the appropriate distribution names instead.

    Команда debmake создаёт изначальный шаблонный файл с версией
    основной ветки и редакцией Debian. С целью предотвращения
    случайной загрузки в архив Debian выбирается выпуск UNRELEASED.

    Подсказка
   
    The date string used in the debian/changelog file can be manually
    generated by the «LC_ALL=C date -R» command.

    Подсказка

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

    The debian/changelog file is installed in the /usr/share/doc/
    binarypackage directory as changelog.Debian.gz by the 
    dh_installchangelogs command.

    Журнал изменений основной ветки устанавливается в каталог /usr/
    share/doc/двоичныйпакет под именем changelog.gz.

    The upstream changelog is automatically found by the 
    dh_installchangelogs using the case insensitive match of its file
    name to changelog, changes, changelog.txt, changes.txt, history, 
    history.txt, or changelog.md and searched in the ./ doc/ or docs/
    directories.

6.8. debian/copyright file

    Debian takes the copyright and license matters very seriously.
    The «Debian Policy Manual» enforces having a summary of them in
    the debian/copyright file in the package.

      * «12.5. Copyright information»
      * «2.3. Copyright considerations»
      * «License information»

    The debmake command creates the initial debian/copyright template
    file.

      * Please double check copyright with the licensecheck(1)
        command.
      * Please format it as a «machine-readable debian/copyright file
        (DEP-5)».

    Если команде debmake не была передана опция -P, то команда
    пропускает создаваемые автоматически файлы под разрешительными
    лицензиями.

    Внимание

    Файл debian/copyright должен быть отсортирован таким образом, что
    наиболее общие шаблоны файлов были размещены в начале списка. См.
    «Раздел 15.6, «debmake -k»».

    Примечание

    Если при проверке лицензионной информации вы обнаружите
    какие-либо проблемы, то отправьте сообщение об ошибке в пакете 
    debmake с проблемной частью текста, содержащего информацию об
    авторском праве и лицензии.

6.9. debian/patches/* files

    As demonstrated in «Раздел 5.9, «Step 3 (alternatives):
    Modification to the upstream source»», the debian/patches/
    directory holds

      * patch-file-name.patch files providing -p1 patches and
      * the series file which which defines how these patches are
        applied.

    See how these files are used in:

      * «Раздел 12.6, «dpkg-source -b»» to build the Debian source
        package
      * «Раздел 12.7, «dpkg-source -x»» to extract source files from
        the Debian source package

    Примечание
   
    Header texts of these patches should conform to «DEP-3».

    Примечание

    If you want to use VCS tools such as git, gbp and dgit to create
    and manage these patches after learning basics here, please refer
    to later in «Глава 10, Packaging with git».

6.10. debian/source/include-binaries file

    The «dpkg-source --commit» command functions like dquilt but has
    one advantage over the dquilt command. While the dquilt command
    can’t handle modified binary files, the «dpkg-source --commit»
    command detects modified binary files and lists them in the 
    debian/source/include-binaries file to include them in the Debian
    tarball as a part of the Debian source package.

6.11. debian/watch file

    The uscan(1) command downloads the latest upstream version using
    the debian/watch file. E.g.:

    Basic debian/watch file: 
   
    version=4
    https://ftp.gnu.org/gnu/hello/ @PACKAGE@@ANY_VERSION@@ARCHIVE_EXT@

    The uscan command may verify the authenticity of the upstream
    tarball with optional configuration (see «Раздел 6.12, «debian/
    upstream/signing-key.asc file»»).

    See uscan(1), «Раздел 8.4, «Новый выпуск основной ветки»», «
    Раздел 7.1, «Fix with Files-Excluded»», and «Раздел 10.10,
    «Manage patch queue with gbp-pq»» for more.

6.12. debian/upstream/signing-key.asc file

    Some packages are signed by a GPG key and their authenticity can
    be verified using their public GPG key.

    For example, «GNU hello» can be downloaded via HTTP from https://
    ftp.gnu.org/gnu/hello/ . There are sets of files:

      * hello-версия.tar.gz (исходный код основной ветки)
      * hello-версия.tar.gz.sig (отделённая подпись)

    Выберем самую последнюю версию.

    Download the upstream tarball and its signature. 

    $ wget https://ftp.gnu.org/gnu/hello/hello-2.9.tar.gz
     ...
    $ wget https://ftp.gnu.org/gnu/hello/hello-2.9.tar.gz.sig
     ...
    $ gpg --verify hello-2.9.tar.gz.sig
    gpg: Signature made Thu 10 Oct 2013 08:49:23 AM JST using DSA key ID 80EE4A00
    gpg: Can't check signature: public key not found

    If you know the public GPG key of the upstream maintainer from
    the mailing list, use it as the debian/upstream/signing-key.asc
    file. Otherwise, use the hkp keyserver and check it via your web
    of trust.

    Download public GPG key for the upstream. 

    $ gpg --keyserver hkp://keys.gnupg.net --recv-key 80EE4A00
    gpg: requesting key 80EE4A00 from hkp server keys.gnupg.net
    gpg: key 80EE4A00: public key "Reuben Thomas <rrt@sc3d.org>" imported
    gpg: no ultimately trusted keys found
    gpg: Total number processed: 1
    gpg:               imported: 1
    $ gpg --verify hello-2.9.tar.gz.sig
    gpg: Signature made Thu 10 Oct 2013 08:49:23 AM JST using DSA key ID 80EE4A00
    gpg: Good signature from "Reuben Thomas <rrt@sc3d.org>"
      ...
    Primary key fingerprint: 9297 8852 A62F A5E2 85B2  A174 6808 9F73 80EE 4A00

    Подсказка
   
    If your network environment blocks access to the HKP port 11371,
    use «hkp://keyserver.ubuntu.com:80» instead.

    After confirming the key ID 80EE4A00 is a trustworthy one,
    download its public key into the debian/upstream/signing-key.asc
    file.

    Set public GPG key to debian/upstream/signing-key.asc. 
   
    $ gpg --armor --export 80EE4A00 >debian/upstream/signing-key.asc

    With the above debian/upstream/signing-key.asc file and the
    following debian/watch file, the uscan command can verify the
    authenticity of the upstream tarball after its download. E.g.:

    Improved debian/watch file with GPG support: 

    version=4
    opts="pgpsigurlmangle=s/$/.sig/" \
    https://ftp.gnu.org/gnu/hello/ @PACKAGE@@ANY_VERSION@@ARCHIVE_EXT@

6.13. debian/salsa-ci.yml file

    Install Salsa CI configuration file. See «Раздел 10.3, «Salsa CI
    service»».

6.14. Other debian/* files

    В каталог debian/ можно добавить дополнительные файлы настройки.
    Большинство из них используются для управления командами dh_*,
    предоставляемыми пакетом debhelper, но также имеются
    дополнительные файлы для команд dpkg-source, lintian и gbp.

    Подсказка

    Even an upstream source without its build system can be packaged
    just by using these files. See «Раздел 13.2, «Без Makefile
    (командная оболочка, интерфейс командной оболочки)»» as an
    example.

    The alphabetical list of notable optional debian/binarypackage.*
    configuration files listed below provides very powerful means to
    set the installation path of files. Please note:

      * The "^-x[01234]" superscript notation that appears in the
        following list indicates the minimum value for the debmake -x
        option that generates the associated template file. See «
        Раздел 15.9, «debmake -x»» or debmake(1) for details.
      * For a single binary package, the «binarypackage.» part of the
        filename in the list may be removed.
      * For a multi binary package, a configuration file missing the 
        «binarypackage» part of the filename is applied to the first
        binary package listed in the debian/control.
      * When there are many binary packages, their configurations can
        be specified independently by prefixing their name to their
        configuration filenames such as «package-1.install», «
        package-2.install», etc.
      * Некоторые шаблонные файлы настроек могут не быть созданы
        командой debmake. В таких случаях вам следует создать их с
        помощью редактора.
      * Some configuration template files generated by the debmake
        command with an extra .ex suffix need to be activated by
        removing that suffix.
      * Неиспользуемые шаблонные файлы настроек, созданные командой 
        debmake, следует удалить.
      * Копируйте шаблонные файлы настроек по необходимости в файлы с
        соответствующими именами двоичных пакетов.

        двоичныйпакет.bug-control ^-x3
            устанавливается как usr/share/bug/двоичныйпакет/control в
            двоичныйпакет. См. «Раздел 8.11, «Bug reports»».
        двоичныйпакет.bug-presubj ^-x3
            устанавливается как usr/share/bug/двоичныйпакет/presubj в
            binarypackage. См. «Раздел 8.11, «Bug reports»».
        двоичныйпакет.bug-script ^-x3
            устанавливается как usr/share/bug/двоичныйпакет или usr/
            share/bug/двоичныйпакет/script в двоичныйпакет. См. «
            Раздел 8.11, «Bug reports»».
        binarypackage.bash-completion ^-x3

            List bash completion scripts to be installed.

            The bash-completion package is required for both build
            and user environments.

            См. dh_bash-completion(1).

        clean ^-x2

            List files that should be removed but are not cleaned by
            the dh_auto_clean command.

            См. dh_auto_clean(1) и dh_clean(1).

        compat ^-x4

            Set the debhelper compatibility level. (deprecated)

            Use «Build-Depends: debhelper-compat (= 13)» in debian/
            control to specify the compatibility level and remove 
            debian/compat.

            See «COMPATIBILITY LEVELS» in debhelper(7).

        binarypackage.conffiles ^-x3

            This optional file is installed into the DEBIAN directory
            within the binary package while supplimenting it with all
            the conffiles auto-detected by debhelper.

            This file is primarily useful for using "special" entries
            such as the remove-on-upgrade feature from dpkg(1).

            If the program you’re packaging requires every user to
            modify the configuration files in the /etc directory,
            there are two popular ways to arrange for them not to be
            conffiles, keeping the dpkg command happy and quiet.

              # Создайте символьную ссылку в каталоге /etc,
                указывающую на файл в каталоге /var, создаваемый
                сценариями сопровождающего.
              # Создайте файл с помощью сценариев сопровождающего в
                каталоге /etc.

            См. dh_installdeb(1).

        binarypackage.config ^-x3
            Это config-сценарий debconf, используемый для того, чтобы
            задавать пользователю любые необходимые для настройки
            пакета вопросы. См. «Раздел 9.22, «debconf»».
        двоичныйпакет.cron.hourly ^-x3

            Устанавливается в файл etc/cron/hourly/двоичныйпакет в 
            двоичныйпакет.

            См. dh_installcron(1) и cron(8).

        двоичныйпакет.cron.daily ^-x3

            Устанавливается в файл etc/cron/daily/двоичныйпакет в 
            двоичныйпакет.

            См. dh_installcron(1) и cron(8).

        двоичныйпакет.cron.weekly ^-x3

            Устанавливается в файл etc/cron/weekly/двоичныйпакет в 
            двоичныйпакет.

            См. dh_installcron(1) и cron(8).

        двоичныйпакет.cron.monthly ^-x3

            Installed into the *etc/cron/monthly/*binarypackage file
            in binarypackage.

            См. dh_installcron(1) и cron(8).

        двоичныйпакет.cron.d ^-x3

            Устанавливается в файл etc/cron.d/двоичныйпакет в 
            двоичныйпакет.

            См. dh_installcron(1), cron(8) и crontab(5).

        двоичныйпакет.default ^-x3

            Если такой файл существует, то он устанавливается в etc/
            default/двоичныйпакет в двоичныйпакет.

            См. dh_installinit(1).

        binarypackage.dirs ^-x1

            Содержит список каталогов, которые должны быть созданы в 
            двоичныйпакет.

            См. dh_installdirs(1).

            Это это не требуется, поскольку все команды dh_install*
            автоматически создают необходимые каталоги. Используйте
            этот файл только в том случае, если у вас возникают
            какие-либо затруднения.

        binarypackage.doc-base ^-x1

            Устанавливается как управляющий файл doc-base в 
            двоичныйпакет.

            See dh_installdocs(1) and «Debian doc-base Manual (
            doc-base.html)» provided by the doc-base package.

        binarypackage.docs ^-x1

            Создержит список файлов документации для их установки в 
            двоичныйпакет.

            См. dh_installdocs(1).

        двоичныйпакет.emacsen-compat ^-x3

            Устанавливается в usr/lib/emacsen-common/packages/compat/
            двоичныйпакет в binarypackage.

            См. dh_installemacsen(1).

        двоичныйпакет.emacsen-install ^-x3

            Устанавливается в usr/lib/emacsen-common/packages/install
            /двоичныйпакет в двоичныйпакет.

            См. dh_installemacsen(1).

        двоичныйпакет.emacsen-remove ^-x3

            Устанавливается в usr/lib/emacsen-common/packages/remove/
            двоичныйпакет в двоичныйпакет.

            См. dh_installemacsen(1).

        двоичныйпакет.emacsen-startup ^-x3

            Устанавливается в usr/lib/emacsen-common/packages/startup
            /двоичныйпакет в двоичныйпакет.

            См. dh_installemacsen(1).

        binarypackage.examples ^-x1

            Содержит список файлов или каталогов с примерами для их
            установки в usr/share/doc/двоичныйпакет/examples/ в 
            двоичныйпакет.

            См. dh_installexamples(1).

        gbp.conf ^-x1

            Если этот файл существует, то он используется как файл
            настройки для команды gbp.

            См. gbp.conf(5), gbp(1) и git-buildpackage(1).

        binarypackage.info ^-x1

            Содержит список info-файлов для их установки в 
            двоичныйпакет.

            См. dh_installinfo(1).

        binarypackage.init ^-x4

            Installed into etc/init.d/binarypackage in binarypackage.
            (deprecated)

            См. dh_installinit(1).

        binarypackage.install ^-x1

            Содержит список файлов, которые должны быть установлены,
            но не устанавливаются командой dh_auto_install.

            См. dh_install(1) и dh_auto_install(1).

        binarypackage.links ^-x1

            List pairs of source and destination files to be
            symlinked. Each pair should be put on its own line, with
            the source and destination separated by whitespace.

            См. dh_link(1).

        двоичныйпакет.lintian-overrides ^-x3

            Устанавливается в usr/share/lintian/overrides/
            двоичныйпакет в каталоге сборки пакета. Этот файл
            используется для блокировки ошибочных диагностических
            процедур lintian.

            См. dh_lintian(1), lintian(1) и «Руководство пользователя
            Lintian».

        binarypackage.maintscript ^-x2

            If this optional file exists, debhelper uses this as the
            template to generate DEBIAN/binarypackage.{pre,post}
            {inst,rm} files within the binary package while adding «
            -- "$@"» to the dpkg-maintscript-helper(1) command.

            See dh_installdeb(1) and «Chapter 6 - Package maintainer
            scripts and installation procedure» in the «Debian Policy
            Manual».

        manpage.* ^-x3

            Команда debmake создаёт шаблонные файы страниц
            руководства. Переименуйте эти файлы соответствующим
            образом и обновите их содержимое.

            Debian Policy requires that each program, utility, and
            function should have an associated manual page included
            in the same package. Manual pages are written in nroff
            (1). If you are new to making a manpage, use 
            manpage.asciidoc or manpage.1 as the starting point.

        binarypackage.manpages ^-x1

            Содержит список страниц руководства для их установки.

            См. dh_installman(1).

        двоичныйпакет.menu (устарел, более не устанавливается)

            tech-ctte #741573 decided «Debian should use .desktop
            files as appropriate».

            Файл меню Debian устанавливается в usr/share/menu/
            двоичныйпакет в двоичныйпакет.

            Информацию о формате см. в menufile(5). См. 
            dh_installmenu(1).

        NEWS ^-x3

            Устанавливается в usr/share/doc/двоичныйпакет/NEWS.Debian
            .

            См. dh_installchangelogs(1).

        patches/*

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

            Команда debmake не создаёт файлы заплат.

            См. dpkg-source(1), «Раздел 4.4, «quilt setup»» и «
            Раздел 5.9, «Step 3 (alternatives): Modification to the
            upstream source»».

        patches/series ^-x1
            Последовательность применения файлов заплат patches/*.
        двоичныйпакет.preinst ^-x2, двоичныйпакет.postinst ^-x2, 
        двоичныйпакет.prerm ^-x2, двоичныйпакет.postrm ^-x2

            If these optional files exist, the corresponding files
            are installed into the DEBIAN directory within the binary
            package after enriched by debhelper. Otherwise, these
            files in the DEBIAN directory within the binary package
            is generated by debhelper.

            Whenever possible, simpler binarypackage.maintscript
            should be used instead.

            See dh_installdeb(1) and «Chapter 6 - Package maintainer
            scripts and installation procedure» in the «Debian Policy
            Manual».

            See also debconf-devel(7) and «3.9.1 Prompting in
            maintainer scripts» in the «Debian Policy Manual».

        README.Debian ^-x1

            Устанавливается в первый двоичный пакет, указанный в
            файле debian/control как usr/share/doc/двоичныйпакет/
            README.Debian.

            Этот файл содержит специальную информацию о пакете
            Debian.

            См. dh_installdocs(1).

        README.source ^-x1

            Installed into the first binary package listed in the 
            debian/control file as usr/share/doc/binarypackage/
            README.source.

            If running «dpkg-source -x» on a source package doesn’t
            produce the source of the package, ready for editing, and
            allow one to make changes and run dpkg-buildpackage to
            produce a modified package without taking any additional
            steps, creating this file is recommended.

            See «Debian policy manual section 4.14».

        двоичныйпакет.service ^-x3

            Если этот файл существует, то он устанавливается в lib/
            systemd/system/двоичныйпакет.service в binarypackage.

            См. dh_systemd_enable(1), dh_systemd_start(1) и 
            dh_installinit(1).

        source/format ^-x1

            Формат пакета Debian.

              # Use «3.0 (quilt)» to make this non-native package
                (recommended)
              # Use «3.0 (native)» to make this native package

            See «SOURCE PACKAGE FORMATS» in dpkg-source(1).

        source/lintian-overrides ^-x3

            These file is not installed, but are scanned by the 
            lintian command to provide overrides for the source
            package.

            См. dh_lintian(1) и lintian(1).

        source/local-options ^-x1

            The dpkg-source command uses this content as its options.
            Notable options are:

              # unapply-patches
              # abort-on-upstream-changes
              # auto-commit
              # single-debian-patch

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

            See «FILE FORMATS» in dpkg-source(1).

        source/local-patch-header ^-x1

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

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

            See «FILE FORMATS» in dpkg-source(1).

        source/options ^-x3
            Use source/local-options instead to avoid issues with
            NMUs. See «FILE FORMATS» in dpkg-source(1).
        source/patch-header ^-x4
            Use source/local-patch-header instead to avoid issues
            with NMUs. See «FILE FORMATS» in dpkg-source(1).
        binarypackage.symbols ^-x1

            Файлы символов. Если эти файлы существуют, то они будут
            переданы для обработки и установки команде 
            dpkg-gensymbols.

            См. dh_makeshlibs(1) и «Раздел 9.16, «Библиотека
            символов»»..

        binarypackage.templates ^-x3
            Это файл шаблонов для debconf. Он используется для вывода
            вопросов, необходимых для настройки пакета. См. «
            Раздел 9.22, «debconf»».
        tests/control ^-x1
            This is the RFC822-style test meta data file defined in
            DEP-8. See autopkgtest(1) and «Раздел 9.4, «Непрерывная
            интеграция»».
        TODO ^-x3

            Устанавливается в первый двоичный пакет, указанный в
            файле debian/control как usr/share/doc/двоичныйпакет/
            TODO.Debian.

            См. dh_installdocs(1).

        двоичныйпакет.tmpfile ^-x3

            Если этот файл существует, то он устанавливается в usr/
            lib/tmpfiles.d/двоичныйпакет.conf в двоичныйпакет.

            См. dh_systemd_enable(1), dh_systemd_start(1) и 
            dh_installinit(1).

        binarypackage.upstart ^-x4

            If this exists, it is installed into etc/init/
            package.conf in the package build directory. (deprecated)

            См. dh_installinit(1).

        upstream/metadata ^-x1
            Per-package machine-readable metadata about upstream
            (DEP-12). See «Upstream MEtadata GAthered with YAml
            (UMEGAYA)».


---------------------------------------------------------------------

    ^[11] This is the default up to debhelper v13. At debhelper v14,
    it warns the default change. After debhelper v15, it will change
    the default to DESTDIR=debian/tmp/ .

    ^[12] Для более чем 90% пакетов длина имени пакета равна 24
    символам или меньше этого числа; длина версии основной ветки
    равна 10 символам или меньше, а длина номера редакции Debian
    равна 3 символам или меньше.

    ^[13] Команда debmake создаёт несколько более сложный файл debian
    /rules. Тем не менее, это базовая часть.

    ^[14] This simplicity is available since version 7 of the 
    debhelper package. This guide assumes the use of debhelper
    version 13 or newer.

    ^[15] This is the default up to debhelper v13. At debhelper v14,
    it warns the default change. After debhelper v15, it will change
    the default to DESTDIR=debian/tmp/ .

    ^[16] If you are using the vim editor, make sure to save this
    with the «:wq» command.

Глава 7. Sanitization of the source

    There are a few cases which require to sanitize the source to
    prevent contaminating the generated Debian source package.

      * Non DFSG contents in the upstream source.

          + Debian takes software freedom seriously and follows the
            DFSG.
      * Extraneous auto-generated contents in the upstream source.

          + Debian package should rebuild them under the latest
            system.
      * Extraneous VCS contents in the upstream source.

          + The -i and -I options set in «Раздел 4.5, «devscripts
            setup»» for the dpkg-source(1) command should avoid
            these.

              o The -i option is aimed at the non-native Debian
                package.
              o The -I is aimed at the native Debian package.

    There are several methods to avoid inclusion of undesirable
    contents.

7.1. Fix with Files-Excluded

    This is suitable for avoiding non DFSG contents in the upstream
    source tarball.

      * Укажите список файлов для удаления в строке Files-Excluded
        файла debian/copyright.
      * Укажите URL для загрузки tar-архива основной ветки в файле 
        debian/watch.
      * Запустите команду uscan для загрузки нового tar-архива
        основной ветки.
   
          + Alternatively, use the «gbp import-orig --uscan
            --pristine-tar» command.
      * mk-origtargz invoked from uscan removes excluded files from
        the upstream tarball and repack it as a clean tarball.
      * Получившийся tar-архив будет иметь версию с дополнительным
        суффиком +dfsg.

    See «COPYRIGHT FILE EXAMPLES» in mk-origtargz(1).

7.2. Fix with «debian/rules clean»

    This is suitable for avoiding auto-generated files and removes
    them in the «debian/rules clean» target

    Примечание

    The «debian/rules clean» target is called before the «dpkg-source
    --build» command by the dpkg-buildpackage command and the «
    dpkg-source --build» command ignores removed files.

7.3. Fix with extend-diff-ignore

    This is for the non-native Debian package.

    The problem of extraneous diffs can be fixed by ignoring changes
    made to parts of the source tree by adding the «
    extend-diff-ignore=…​» line in the debian/source/options file.

    debian/source/options to exclude the config.sub, config.guess and
    Makefile files: 
   
    # Don't store changes on autogenerated files
    extend-diff-ignore = "(^|/)(config\.sub|config\.guess|Makefile)$"

    Примечание

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

    Подсказка

    Если используется файл debian/source/local-options, то можно
    скрыть эти настройки из создаваемого пакета с исходным кодом. Это
    может быть полезно в том случае, когда локальные нестандартные
    файлы системы управления версиями вмешиваются в процесс создания
    вашего пакета.

7.4. Fix with tar-ignore

    This is for the native Debian package.

    You can exclude some files in the source tree from the generated
    tarball by tweaking the file glob by adding the «tar-ignore=…​»
    lines in the debian/source/options or debian/source/local-options
    files.

    Примечание

    If, for example, the source package of a native package needs
    files with the file extension .o as a part of the test data, the
    setting in «Раздел 4.5, «devscripts setup»» is too aggressive.
    You can work around this problem by dropping the -I option for 
    DEBUILD_DPKG_BUILDPACKAGE_OPTS in «Раздел 4.5, «devscripts setup»
    » while adding the «tar-ignore=…​» lines in the debian/source/
    local-options file for each package.

7.5. Fix with «git clean -dfx»

    The problem of extraneous contents in the second build can be
    avoided by restoring the source tree by committing the source
    tree to the Git repository before the first build.

    Вы можете восстановить дерево исходного кода до выполнения второй
    сборки. Например:

     $ git reset --hard
     $ git clean -dfx

    This works because the dpkg-source command ignores the contents
    of the typical VCS files in the source tree with the 
    DEBUILD_DPKG_BUILDPACKAGE_OPTS setting in `"Раздел 4.5, «
    devscripts setup»`".

    Подсказка
   
    If the source tree is not managed by a VCS, you should run «git
    init; git add -A .; git commit» before the first build.

Глава 8. More on packaging

    Let’s describe more basics on Debian packaging.

8.1. Package customization

    All customization data for the Debian source package resides in
    the debian/ directory as presented in «Раздел 5.7, «Шаг 3:
    изменение шаблонных файлов»»:

      * The Debian package build system can be customized through the
        debian/rules file (see «Раздел 8.2, «Customized debian/rules»
        »).
      * The Debian package installation path etc. can be customized
        through the addition of configuration files such as package
        .install and package.docs in the debian/ directory for the 
        dh_* commands from the debhelper package (see «Раздел 6.14,
        «Other debian/* files»»).

    When these are not sufficient to make a good Debian package, -p1
    patches of debian/patches/* files are deployed to modify the
    upstream source. These are applied in the sequence defined in the
    debian/patches/series file before building the package as
    presented in «Раздел 5.9, «Step 3 (alternatives): Modification to
    the upstream source»».

    You should address the root cause of the Debian packaging problem
    by the least invasive way. The generated package shall be more
    robust for future upgrades in this way.

    Примечание
   
    Send the patch addressing the root cause to the upstream
    maintainer if it is useful to the upstream.

8.2. Customized debian/rules

    Flexible customization of the Раздел 6.5, «debian/rules file» is
    realized by adding appropriate override_dh_* targets and their
    rules.

    Всякий раз как требуется выполнить какую-то специальную операцию
    для определённой команды dh_foo, вызываемой командой dh, всякое
    автоматическое выполнение её может быть отменено путём добавления
    Makefile-цели override_dh_foo в файл debian/rules.

    The build process may be customized via the upstream provided
    interface such as arguments to the standard source build system
    commands, such as:

      * configure,
      * Makefile,
      * «python -m build», or
      * Build.PL.

    If this is the case, you should add the override_dh_auto_build
    target with «dh_auto_build -- arguments». This ensures passing 
    arguments to the build system after the default parameters that 
    dh_auto_build usually passes.

    Подсказка
   
    Please try not to execute the bare build system commands directly
    if they are supported by the dh_auto_build command.

    См.:

      * «Раздел 5.7, «Шаг 3: изменение шаблонных файлов»» for the
        basic example.
      * «Раздел 9.3, «Note on build system»» to be reminded of the
        challenge involving the underlying build system.
      * «Раздел 9.10, «Multiarch»» for multiarch customization.
      * «Раздел 9.6, «Усиление безопасности компилятора»» for
        hardening customization.

8.3. Variables for debian/rules

    Некоторые определения переменных, которые могут оказаться
    полезными для debian/rules, можно найти в файлах в каталоге /usr/
    share/dpkg/. В частности:

    pkg-info.mk
        Set DEB_SOURCE, DEB_VERSION, DEB_VERSION_EPOCH_UPSTREAM, 
        DEB_VERSION_UPSTREAM_REVISION, DEB_VERSION_UPSTREAM, and 
        DEB_DISTRIBUTION variables obtained from dpkg-parsechangelog
        (1). (useful for backport support etc..)
    vendor.mk
        Set DEB_VENDOR and DEB_PARENT_VENDOR variables; and 
        dpkg_vendor_derives_from macro obtained from dpkg-vendor(1).
        (useful for vendor support (Debian, Ubuntu, …​).)
    architecture.mk
        Set DEB_HOST_* and DEB_BUILD_* variables obtained from 
        dpkg-architecture(1).
    buildflags.mk
        Set CFLAGS, CPPFLAGS, CXXFLAGS, OBJCFLAGS, OBJCXXFLAGS, 
        GCJFLAGS, FFLAGS, FCFLAGS, and LDFLAGS build flags obtained
        from dpkg-buildflags(1).

    Например, можно добавить дополнительную опцию в CONFIGURE_FLAGS
    для архитектур linux-any, добавляя следующее в файл debian/rules:

    DEB_HOST_ARCH_OS ?= $(shell dpkg-architecture -qDEB_HOST_ARCH_OS)
     ...
    ifeq ($(DEB_HOST_ARCH_OS),linux)
    CONFIGURE_FLAGS += --enable-wayland
    endif

    См. «Раздел 9.10, «Multiarch»», dpkg-architecture(1) и 
    dpkg-buildflags(1).

8.4. Новый выпуск основной ветки

    When a new upstream release tarball foo-newvwesion.tar.gz is
    released, the Debian source package can be updated by invoking
    commands in the old source tree as:

    $ uscan
     ... foo-newversion.tar.gz downloaded
    $ uupdate -v newversion ../foo-newversion.tar.gz

      * The debian/watch file in the old source tree must be a valid
        one.
      * This make symlink ../foo_newvwesion.orig.tar.gz pointing to 
        ../foo-newvwesion.tar.gz.
      * Files are extracted from ../foo-newvwesion.tar.gz to ../foo-
        newversion/
      * Files are copied from ../foo-oldversion/debian/ to ../foo-
        newvesion/debian/ .

    After the above, you should refresh debian/patches/* files (see «
    Раздел 8.5, «Manage patch queue with dquilt»») and update debian/
    changelog with the dch(1) command.

    When «debian uupdate» is specified at the end of line in the 
    debian/watch file, uscan automatically executes uupdate(1) after
    downloading the tarball.

8.5. Manage patch queue with dquilt

    You can add, drop, and refresh debian/patches/* files with dquilt
    to manage patch queue.

      * Add a new patch debian/patches/bugname.patch recording the
        upstream source modification on the file buggy_file as:

        $ dquilt push -a
        $ dquilt new bugname.patch
        $ dquilt add buggy_file
        $ vim buggy_file
          ...
        $ dquilt refresh
        $ dquilt header -e
        $ dquilt pop -a

      * Drop (== disable) an existing patch
   
          + Comment out pertinent line in debian/patches/series
          + Erase the patch itself (optional)
      * Refresh debian/patches/* files to make «dpkg-source -b» work
        as expected after updating a Debian package to the new
        upstream release.

         $ uscan; uupdate  # updating to the new upstream release
         $ while dquilt push; do dquilt refresh ; done
         $ dquilt pop -a

          + If conflicts are encountered with «dquilt push» in the
            above, resolve them and run «dquilt refresh» manually for
            each of them.

8.6. Build commands

    Here is a recap of popular low level package build commands.
    There are many ways to do the same thing.

      * dpkg-buildpackage = ядро инструмента для сборки пакета
      * debuild = dpkg-buildpackage + lintian (сборка с очищенными
        переменными окружения)
      * schroot = core of the Debian chroot environment tool
      * sbuild = dpkg-buildpackage on custom schroot (build in the
        chroot)

8.7. Note on sbuild

    The sbuild(1) command is a wrapper script of dpkg-buildpackage
    which builds Debian binary packages in a chroot environment
    managed by the schroot(1) command. For example, building for
    Debian unstable suite can be done as:

     $ sudo sbuild -d unstable

    In schroot(1) terminology, this builds a Debian package in a
    clean ephemeral chroot «chroot:unstable-amd64-sbuild» started as
    a copy of the clean minimal persistent chroot «
    source:unstable-amd64-sbuild».

    This build environment was set up as described in «Раздел 4.6, «
    sbuild setup»» with «sbuild-debian-developer-setup -s unstable»
    which essentially did the following:

     $ sudo mkdir -p /srv/chroot/dist-amd64-sbuild
     $ sudo sbuild-createchroot unstable /srv/chroot/unstable-amd64-sbuild http://deb.debian.org/debian
     $ sudo usermod -a -G sbuild <your_user_name>
     $ sudo newgrp -

    The schroot(1) configuration for unstable-amd64-sbuild was
    generated at /etc/schroot/chroot.d/unstable-amd64-sbuild.$suffix
    :

    [unstable-amd64-sbuild]
    description=Debian sid/amd64 autobuilder
    groups=root,sbuild
    root-groups=root,sbuild
    profile=sbuild
    type=directory
    directory=/srv/chroot/unstable-amd64-sbuild
    union-type=overlay

    Где:

      * The profile defined in the /etc/schroot/sbuild/ directory is
        used to setup the chroot environment.
      * /srv/chroot/unstable-amd64-sbuild directory holds the chroot
        filesystem.
      * /etc/sbuild/unstable-amd64-sbuild is symlinked to /srv/chroot
        /unstable-amd64-sbuild .

    You can update this source chroot «source:unstable-amd64-sbuild»
    by:

     $ sudo sbuild-update -udcar unstable

    You can log into this source chroot «source:unstable-amd64-sbuild
    » by:

     $ sudo sbuild-shell unstable

    Подсказка

    If your source chroot filesystem is missing packages such as 
    libeatmydata1, ccache, and lintian for your needs, you may want
    to install these by logging into it.

8.8. Special build cases

    The orig.tar.gz file may need to be uploaded for a Debian
    revision other than 0 or 1 under some exceptional cases (e.g.,
    for a security upload).

    When an essential package becomes a non-essential one (e.g., 
    adduser), you need to remove it manually from the existing chroot
    environment for its use by piuparts.

8.9. Загрузите orig.tar.gz

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

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

      * dpkg-buildpackage -sa
      * debuild -sa
      * sbuild
      * For «gbp buildpackage», edit the ~/.gbp.conf file.

    Подсказка

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

    Подсказка
   
    Security uploads require including the orig.tar.gz file.

8.10. Пропущенные загрузки

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

      * dpkg-buildpackage -v1.2
      * debuild -v1.2
      * sbuild --debbuildopts -v1.2
      * При использовании gbp buildpackage отредактируйте файл ~
        /.gbp.conf.

8.11. Bug reports

    The reportbug(1) command used for the bug report of binarypackage
    can be customized by the files in usr/share/bug/binarypackage/.

    Команда dh_bugfiles устанавливает эти файлы из шаблонных файлов в
    каталоге debian/.

      * debian/двоичныйпакет.bug-control → usr/share/bug/
        двоичныйпакет/control

          + Этот файл содержит некоторые указания, такие как
            перенаправления отчёта об ошибке другому пакету.
      * debian/двоичныйпакет.bug-presubj → usr/share/bug/
        двоичныйпакет/presubj
   
          + Этот файл отображается пользователю с помощью команды 
            reportbug.
      * debian/двоичныйпакет.bug-script → usr/share/bug/двоичныйпакет
        или usr/share/bug/двоичныйпакет/script

          + Команда reportbug запускает этот сценарий для создания
            шаблонного файла для отчёта об ошибке.

    See dh_bugfiles(1) and «reportbug’s Features for Developers (
    README.developers)»

    Подсказка
   
    If you always remind the bug reporter of something or ask them
    about their situation, use these files to automate it.

Глава 9. Продвинутые темы работы над пакетом

    Let’s describe advanced topics on Debian packaging.

9.1. Historical perspective

    Let me oversimplify historical perspective of Debian packaging
    practices focused on the non-native packaging.

    Debian was started in 1990s when upstream packages were available
    from public FTP sites such as Sunsite. In those early days,
    Debian packaging used Debian source format currently known as the
    Debian source format «1.0»:

      * The Debian source package ships a set of files for the Debian
        source package.

          + package_version.orig.tar.gz : symlink to or copy of the
            upstream released file.
          + package_version-revision.diff.gz : «One big patch» for
            Debian modifications.
          + package_version-revision.dsc : package description.
      * Several workaround approaches such as dpatch, dbs, or cdbs
        were deplyoed to manage multiple topic patches.

    The modern Debian source format «3.0 (quilt)» was invented around
    2008 (see «ProjectsDebSrc3.0»):

      * The Debian source package ships a set of files for the Debian
        source package.

          + package_version.orig.tar.?z : symlink to or copy of the
            upstream released file.
          + package_version-revision.debian.tar.?z : tarball of 
            debian/ for Debian modifications.
   
              o The debian/source/format file contains «3.0 (quilt)».
              o Optional multiple topic patches are stored in the 
                debian/patches/ directory.
          + package_version-revision.dsc : package description.
      * The standarized approach to manage multiple topic patches
        using quilt(1) is deployed for the Debian source format «3.0
        (quilt)».

    Most Debian packages adopted the Debian source formats «3.0
    (quilt)» and «3.0 (native)».

    Now, the git(1) is popular with upstream and Debian developers.
    The git and its associated tools are important part of the modern
    Debian packaging workflow. This modern workflow involving git
    will be mentioned later in «Глава 10, Packaging with git».

9.2. Current trends

    Current Debian packaging practices and their trends are moving
    target. See:

      * «Debian Trends» — Hints for «De facto standard» of Debian
        practices

          + Build systems: dh
          + Debian source format: «3.0 (quilt)»
          + VCS: git
          + VCS Hosting: salsa
          + Rules-Requires-Root: adopted, fakeroot
          + Copyright format: DEP-5
      * «debhelper-compat-upgrade-checklist(7) manpage» — Upgrade
        checklist for debhelper
      * «DEP - Debian Enhancement Proposals» — Formal proposals to
        enhance Debian

    You can also search entire Debian source code data by yourself,
    too.

      * «Debian Sources» — code search tool
   
          + «Debian Code Search» — wiki page describing its usage
      * «Debian Code Search» — another code search tool

9.3. Note on build system

    Auto-generated files of the build system may be found in the
    released upstream tarball. These should be regenerated when
    Debian package is build. E.g.:

      * «dh $@ --with autoreconf» should be used in the debian/rules
        if Autotools (autoconf + automake) are used.

    Some modern build system may be able to download required source
    codes and binary files from arbitrary remote hosts to satisfy
    build requirements. Don’t use this download feature. The official
    Debian package is required to be build only with packages listed
    in Build-Depends: of the debian/control file.

9.4. Непрерывная интеграция

    The dh_auto_test(1) command is a debhelper command that tries to
    automatically run the test suite provided by the upstream
    developer during the Debian package building process.

    The autopkgtest(1) command can be used after the Debian package
    building process. It tests generated Debian binary packages in
    the virtual environment using the debian/tests/control
    RFC822-style metadata file as continuous integration (CI). See:

      * Documents in the /usr/share/doc/autopkgtest/ directory
      * «4. autopkgtest: Automatic testing for packages» of the «
        Ubuntu Packaging Guide»

    Кроме того, в Debian существует ещё несколько других инструментов
    непрерывной интеграции.

      * The Salsa offers «Раздел 10.3, «Salsa CI service»».
      * The debci package: CI platform on top of the autopkgtest
        package
      * Пакет jenkins: платформа непрерывной интеграции общего
        назначения

9.5. Предзагрузка

    Debian cares about supporting new ports or flavours. The new
    ports or flavours require bootstrapping operation for the
    cross-build of the initial minimal native-building system. In
    order to avoid build-dependency loops during bootstrapping, the
    build-dependency needs to be reduced using the DEB_BUILD_PROFILES
    environment variable.

    See Debian wiki: «BuildProfileSpec».

    Подсказка

    If a core package foo build depends on a package bar with deep
    build dependency chains but bar is only used in the test target
    in foo, you can safely mark the bar with <!nocheck> in the 
    Build-depends of foo to avoid build loops.

9.6. Усиление безопасности компилятора

    The compiler hardening support spreading for Debian jessie (8.0)
    demands that we pay extra attention to the packaging.

    Вам следует подробно изнакомиться со следующей справочной
    документацией:

      * Debian wiki: «Hardening»
      * Debian wiki: «Hardening Walkthrough»

    Команда debmake добавляет шаблонные комментарии в файл debian/
    rules, требующиеся для DEB_BUILD_MAINT_OPTIONS, 
    DEB_CFLAGS_MAINT_APPEND и DEB_LDFLAGS_MAINT_APPEND (см. «Глава 5,
    Simple packaging» и dpkg-buildflags(1)).

9.7. Повторяемая сборка

    Here are some recommendations to attain a reproducible build
    result.

      * Не включайте в результат временную метку на основе системного
        времени.
      * Don’t embed the file path of the build environment.
      * Use «dh $@» in the debian/rules to access the latest 
        debhelper features.
      * Export the build environment as «LC_ALL=C.UTF-8» (see «
        Раздел 11.1, «Сборка с использованием кодировки UTF-8»»).
      * Set the timestamp used in the upstream source from the value
        of the debhelper-provided environment variable 
        $SOURCE_DATE_EPOCH.
      * Подробности можно найти на вики-странице «ReproducibleBuilds»
        .

          + «Руководство ReproducibleBuilds».
          + «ReproducibleBuilds TimestampsProposal».

    Управляющий файл 
    имя-исходного-кода_версия-исходного-кода_архитектура.buildinfo,
    создаваемый dpkg-genbuildinfo(1), содержит информацию о сборочном
    окружении. См. deb-buildinfo(5)

9.8. Переменные подстановки

    Кроме того, файл debian/control определяет зависимости пакета, в
    которых может исопльзоваться «механизм подстановки переменных»
    (substvar), который освобождает сопровождающих пакета от рутинной
    работы по отслеживанию большинства простых зависимостей пакета.
    См. deb-substvars(5).

    The debmake command supports the following substvars:

      * ${misc:Depends} для всех двоичных пакетов
      * ${misc:Pre-Depends} для всех мультиархитектурных пакетов
      * ${shlibs:Depends} для всех двоичных пакетов с исполняемыми
        файлами и пакетов библиотек
      * ${python:Depends} для всех пакетов с кодом на языке Python
      * ${python3:Depends} для всех пакетов с кодом на языке Python3
      * ${perl:Depends} для всех пакетов с кодом на языке Perl
      * ${ruby:Depends} для всех пакетов с кодом на языке Ruby

    For the shared library, required libraries found simply by «
    objdump -p /path/to/program | grep NEEDED» are covered by the 
    shlib substvar.

    For Python and other interpreters, required modules found simply
    looking for lines with «import», «use», «require», etc., are
    covered by the corresponding substvars.

    Для остальных программ, не использующих собственные переменные
    подстановки, зависимости обрабатываются переменной misc.

    Для программ командной оболочки POSIX нет простого способа
    определения зависимостей, поэтому их зависимости не
    обрабатываются никакой переменной.

    Для библиотек и модулей, требующихся через механизм динамической
    загрузки, включая механизм «GObject-интроспекция», нет простого
    способа определения зависимостей, поэтому их зависимости не
    обрабатываются никакой переменной.

9.9. Пакет библиотеки

    Packaging library software requires you to perform much more work
    than usual. Here are some reminders for packaging library
    software:

      * The library binary package must be named as in «Раздел 9.17,
        «Library package name»».
      * Debian ships shared libraries such as /usr/lib/<triplet>/lib
        foo-0.1.so.1.0.0 (see «Раздел 9.10, «Multiarch»»).
      * Debian encourages using versioned symbols in the shared
        library (see «Раздел 9.16, «Библиотека символов»»).
      * Debian не поставляет libtool-архивы библиотек *.la.
      * Debian discourages using and shipping *.a static library
        files.

    Before packaging shared library software, see:

      * «Chapter 8 - Shared libraries» of the «Debian Policy Manual»
      * «10.2 Libraries» of the «Debian Policy Manual»
      * «6.7.2. Libraries» of the «Debian Developer’s Reference»

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

      * «Спасение из ада зависимостей» ^[17]

          + This encourages having versioned symbols in the shared
            library.
      * «Debian Library Packaging guide» ^[18]

          + Please read the discussion thread following its
            announcement, too.

9.10. Multiarch

    Multiarch support for cross-architecture installation of binary
    packages (particularly i386 and amd64, but also other
    combinations) in the dpkg and apt packages introduced in Debian 
    wheezy (7.0, May 2013), demands that we pay extra attention to
    packaging.

    Вам следует подробно изнакомиться со следующей справочной
    документацией:

      * Ubuntu вики (основная ветка разработки)

          + «MultiarchSpec»
      * Debian вики (ситуация в Debian)

          + «Поддержка мультиархитектурности в Debian»
          + «Multiarch/Implementation»

    Мультиархитектурность включается с помощью значения <тройки> вида
    i386-linux-gnu или x86_64-linux-gnu в пути установки разделяемых
    библиотек вида /usr/lib/<тройка>/ и т. д.

      * Значение <тройки>, внутренне необходимое для сценариев debhelper,
        устанавливается самими сценариями неявно. Сопровождающему не
        нужно об этом беспокоиться.
      * The <triplet> value used in override_dh_* target scripts must be
        explicitly set in the debian/rules file by the maintainer. The 
        <triplet> value is stored in the $(DEB_HOST_MULTIARCH) variable
        in the following debian/rules snippet example:

        DEB_HOST_MULTIARCH = $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
        ...
        override_dh_install:
                mkdir -p package1/lib/$(DEB_HOST_MULTIARCH)
                cp -dR tmp/lib/. package1/lib/$(DEB_HOST_MULTIARCH)

    См.:

      * «Раздел 8.3, «Variables for debian/rules»»
      * «Раздел 15.2, «debmake -b»»
      * «Раздел 9.12, «Сценарии и примеры разделения пакета»»
      * «dpkg-architecture(1) manpage»

9.11. Split of a Debian binary package

    For well behaving build systems, the split of a Debian binary
    package into small ones can be realized as follows.

      * Создайте записи с определениями метаданных двоичных пакетах в
        файле debian/control для всех двоичных пакетов.
      * Укажите все пути к файлам (относительно каталга debian/tmp) в
        соответствующих файлах debian/двоичныйпакет.install.

    С примерами можно ознакомиться в настоящем руководстве:

      * «Раздел 13.11, «Autotools (multi-binary package)»» (на основе
        Autotools)
      * «Раздел 13.12, «CMake (multi-binary package)»» (на основе
        CMake)

    An intuitive and flexible method to create the initial template 
    debian/control file defining the split of the Debian binary
    packages is accommodated with the -b option. See «Раздел 15.2, «
    debmake -b»».

9.12. Сценарии и примеры разделения пакета

    Ниже приводится несколько типичных сценариев разделения
    мультиархитектурного пакета для следующих примеров исходного кода
    основной ветки разработки, в которых используется команда debmake
    :

      * исходный код библиотеки libfoo-1.0.tar.gz
      * исходный код утилиты bar-1.0.tar.gz, написанный на
        компилируемом языке
      * исходный код утилиты baz-1.0.tar.gz, написанный на
        интерпретируемом языке

    +---------------------------------------------------------------+
    |двоичныйпакет| тип  |Architecture:|Multi-Arch:|   Содержимое   |
    |             |      |             |           |     пакета     |
    |-------------+------+-------------+-----------+----------------|
    |libfoo1      |lib^* |any          |same       |разделяемая     |
    |             |      |             |           |бибиотека,      |
    |             |      |             |           |возможна        |
    |             |      |             |           |совместная      |
    |             |      |             |           |установка       |
    |-------------+------+-------------+-----------+----------------|
    |libfoo-dev   |dev^* |any          |same       |заголовочные    |
    |             |      |             |           |файлы           |
    |             |      |             |           |разделяемой     |
    |             |      |             |           |библиотеки и    |
    |             |      |             |           |проч., возможна |
    |             |      |             |           |совместная      |
    |             |      |             |           |установка       |
    |-------------+------+-------------+-----------+----------------|
    |libfoo-tools |bin^* |any          |foreign    |программы с     |
    |             |      |             |           |поддержкой      |
    |             |      |             |           |времени         |
    |             |      |             |           |исполнения,     |
    |             |      |             |           |совместная      |
    |             |      |             |           |установка       |
    |             |      |             |           |невозможна      |
    |-------------+------+-------------+-----------+----------------|
    |libfoo-doc   |doc^* |all          |foreign    |файлы           |
    |             |      |             |           |документации    |
    |             |      |             |           |разделяемой     |
    |             |      |             |           |библиотеки      |
    |-------------+------+-------------+-----------+----------------|
    |bar          |bin^* |any          |foreign    |скомпилированный|
    |             |      |             |           |файлы программы,|
    |             |      |             |           |совместная      |
    |             |      |             |           |устанвка        |
    |             |      |             |           |невозможна      |
    |-------------+------+-------------+-----------+----------------|
    |bar-doc      |doc^* |all          |foreign    |файлы           |
    |             |      |             |           |документации    |
    |             |      |             |           |программы       |
    |-------------+------+-------------+-----------+----------------|
    |baz          |script|all          |foreign    |файлы           |
    |             |      |             |           |интерпретируемой|
    |             |      |             |           |программы       |
    +---------------------------------------------------------------+

9.13. Multiarch library path

    Debian policy requires to comply with the «Filesystem Hierarchy
    Standard (FHS), version 3.0», with the exceptions noted in «File
    System Structure».

    The most notable exception is the use of /usr/lib/<triplet>/
    instead of /usr/lib<qual>/ (e.g., /lib32/ and /lib64/) to support
    a multiarch library.

    Таблица 9.1. Опции путя мультиархитектурных библиотек

    +---------------------------------------------------------------+
    |Классический |Мультиархитектурный путь|Мультиархитектуный путь |
    |    путь     |        для i386        |       для amd64        |
    |-------------+------------------------+------------------------|
    |/lib/        |/lib/i386-linux-gnu/    |/lib/x86_64-linux-gnu/  |
    |-------------+------------------------+------------------------|
    |/usr/lib/    |/usr/lib/i386-linux-gnu/|/usr/lib/               |
    |             |                        |x86_64-linux-gnu/       |
    +---------------------------------------------------------------+


    Для пакетов на основе Autotools, в которых используется пакет 
    debhelper с (compat>=9), установка этого пути выполняется
    автоматически с помощью команды dh_auto_configure.

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

      * If «./configure» is used in the override_dh_auto_configure
        target in debian/rules, make sure to replace it with «
        dh_auto_configure --» while re-targeting the install path
        from /usr/lib/ to /usr/lib/$(DEB_HOST_MULTIARCH)/.
      * Замените все пути с /usr/lib/ на /usr/lib/*/ в файлах debian/
        foo.install.

    All files installed simultaneously as the multiarch package to
    the same file path should have exactly the same file content. You
    must be careful with differences generated by the data byte order
    and by the compression algorithm.

    Файлы разделяемых библиотек, расположенные в каталогах по
    умолчанию, /usr/lib/ и /usr/lib/<тройка>/, загружаются
    автоматически.

    For shared library files in another path, the GCC option -l must
    be set by the pkg-config command to make them load properly.

9.14. Multiarch header file path

    В мультиархитектурной системе Debian GCC по умолчанию включает и 
    /usr/include/, и /usr/include/<тройка>/.

    If the header file is not in those paths, the GCC option -I must
    be set by the pkg-config command to make "#include <foo.h>" work
    properly.

    Таблица 9.2. Опции пути мультиархитектурного заголовочного файла

    +---------------------------------------------------------------+
    | Классический |  Мультиархитектурный  |Мультиархитектуный путь |
    |     путь     |     путь для i386     |       для amd64        |
    |--------------+-----------------------+------------------------|
    |/usr/include/ |/usr/include/          |/usr/include/           |
    |              |i386-linux-gnu/        |x86_64-linux-gnu/       |
    |--------------+-----------------------+------------------------|
    |/usr/include/ |/usr/include/          |/usr/include/           |
    |имяпакета/    |i386-linux-gnu/        |x86_64-linux-gnu/       |
    |              |имяпакета/             |имяпакета/              |
    |--------------+-----------------------+------------------------|
    |              |/usr/lib/i386-linux-gnu|/usr/lib/               |
    |              |/имяпакета/            |x86_64-linux-gnu/       |
    |              |                       |имяпакета/              |
    +---------------------------------------------------------------+


    The use of the /usr/lib/<triplet>/packagename/ path for the
    library files allows the upstream maintainer to use the same
    install script for the multiatch system with /usr/lib/<triplet>
    and the biarch system with /usr/lib<qual>/. ^[19]

    The use of the file path containing packagename enables having
    more than 2 development libraries simultaneously installed on a
    system.

9.15. Multiarch *.pc file path

    Программа pkg-config используется для получения информации об
    установленных в системе библиотеках. Она сохраняет свои параметры
    настройки в файле *.pc и используется для установки опций -I и -l
    для GCC.

    Таблица 9.3. Опции пути к файлу *.pc

    +---------------------------------------------------------------+
    |Классический |  Мультиархитектурный  | Мультиархитектуный путь |
    |    путь     |     путь для i386     |        для amd64        |
    |-------------+-----------------------+-------------------------|
    |/usr/lib/    |/usr/lib/i386-linux-gnu|/usr/lib/x86_64-linux-gnu|
    |pkgconfig/   |/pkgconfig/            |/pkgconfig/              |
    +---------------------------------------------------------------+


9.16. Библиотека символов

    The symbols support in dpkg introduced in Debian lenny (5.0, May
    2009) helps us to manage the backward ABI compatibility of the
    library package with the same package name. The DEBIAN/symbols
    file in the binary package provides the minimal version
    associated with each symbol.

    An oversimplified method for the library packaging is as follows.

      * Extract the old DEBIAN/symbols file of the immediate previous
        binary package with the «dpkg-deb -e» command.

          + Либо можно использовать команду mc для распаковки файла 
            DEBIAN/symbols.
      * Скопируйте его в файл debian/двоичныйпакет.symbols.

          + Если это первый пакет, то используйте пустой файл.
      * Соберите двоичный пакет.

          + If the dpkg-gensymbols command warns about some new
            symbols:

              o Extract the updated DEBIAN/symbols file with the «
                dpkg-deb -e» command.
              o Удалите номер редакции версии Debian, например, -1,
                из файла.
              o Скопируйте его в файл debian/двоичныйпакет.symbols.
              o Повторно соберите двоичный пакет.
          + If the dpkg-gensymbols command does not warn about new
            symbols:

              o Работа с библиотекой завершена.

    Подробные сведения можно получить, обратившись к следующей
    справочной информации:

      * «8.6.3 The symbols system» of the «Debian Policy Manual»
      * «dh_makeshlibs(1) manapage»
      * «dpkg-gensymbols(1) manapage»
      * «dpkg-shlibdeps(1) manapage»
      * «deb-symbols(5) manapage»

    Также следует ознакомиться со следующей документацией:

      * Debian wiki: «UsingSymbolsFiles»
      * Debian wiki: «Projects/ImprovedDpkgShlibdeps»
      * Debian kde team: «Working with symbols files»
      * «Раздел 13.11, «Autotools (multi-binary package)»»
      * «Раздел 13.12, «CMake (multi-binary package)»»

    Подсказка

    For C++ libraries and other cases where the tracking of symbols
    is problematic, follow «8.6.4 The shlibs system» of the «Debian
    Policy Manual», instead. Please make sure to erase the empty 
    debian/binarypackage.symbols file generated by the debmake
    command. For this case, the DEBIAN/shlibs file is used.

9.17. Library package name

    Let’s consider that the upstream source tarball of the libfoo
    library is updated from libfoo-7.0.tar.gz to libfoo-8.0.tar.gz
    with a new SONAME major version which affects other packages.

    Двоичный пакет библиотеки следует переименовать с libfoo7 в lib
    foo8, чтобы после загрузки пакета, созданного из на осно, в 
    unstable все зависимые пакеты остались в рабочем состоянии.

    Предупреждение

    If the binary library package isn’t renamed, many dependent
    packages in the unstable suite become broken just after the
    library upload even if a binNMU upload is requested. The binNMU
    may not happen immediately after the upload due to several
    reasons.

    Пакет -dev должен соответствовать следующим правилам именования:

      * Используйте имя пакета -dev без номера версии: libfoo-dev

          + This is the typical one for leaf library packages.
          + В архиве может находится только одна версия пакета с
            исходным кодом библиотеки.

              o The associated library package needs to be renamed
                from libfoo7 to libfoo8 to prevent dependency
                breakage in the unstable suite during the library
                transition.
          + This approach should be used if the simple binNMU
            resolves the library dependency quickly for all affected
            packages. (ABI change by dropping the deprecated API
            while keeping the active API unchanged.)
          + This approach may still be a good idea if manual code
            updates, etc. can be coordinated and manageable within
            limited packages. (API change)
      * Используйте имена пакетов -dev с указанием версии: libfoo7
        -dev и libfoo8-dev
   
          + This is typical for many major library packages.
          + В архиве могут находится две версии пакетов с исходным
            кодом библиотеки.

              o Все зависимые пакет должны зависить от libfoo-dev.
              o Пусть и libfoo7-dev, и libfoo8-dev предоставляют lib
                foo-dev.
              o Пакет с исходным кодом следует переименовать в lib
                foo7-7.0.tar.gz и libfoo8-8.0.tar.gz, соответственно,
                из libfoo-?.0.tar.gz.
              o В зависимости от пакета путь установки файлов,
                включающий libfoo7 и libfoo8, соответственно, для
                заголовочных файлов и проч., следует выбирать так,
                чтобы их можно было установить одновременно.
          + По возможности не используйте слишком жёсткий подход.
          + This approach should be used if the update of multiple
            dependent packages require manual code updates, etc. (API
            change) Otherwise, the affected packages become RC buggy
            with FTBFS.

    Подсказка
   
    If the data encoding scheme changes (e.g., latin1 to utf-8), the
    same care as the API change needs to be taken.

    См. «Раздел 9.9, «Пакет библиотеки»».

9.18. Смена библиотек

    When you package a new library package version which affects
    other packages, you must file a transition bug report against the
    release.debian.org pseudo package using the reportbug command
    with the ben file and wait for the approval for its upload from
    the Release Team.

    У команды подготовки выпуска имеется «система отслеживания
    переходов». См. «Transitions».

    Внимание
   
    Please make sure to rename binary packages as in «Раздел 9.17,
    «Library package name»».

9.19. Безопасная binNMU-загрузка

    A «binNMU» is a binary-only non-maintainer upload performed for
    library transitions etc. In a binNMU upload, only the «
    Architecture: any» packages are rebuilt with a suffixed version
    number (e.g. version 2.3.4-3 will become 2.3.4-3+b1). The «
    Architecture: all» packages are not built.

    The dependency defined in the debian/control file among binary
    packages from the same source package should be safe for the
    binNMU. This needs attention if there are both «Architecture: any
    » and «Architecture: all» packages involved in it.

      * «Architecture: any» package: depends on «Architecture: any» 
        foo package

          + Depends: foo (= ${binary:Version})
      * «Architecture: any» package: depends on «Architecture: all» 
        bar package
   
          + Depends: bar (= ${source:Version})
      * «Architecture: all» package: depends on «Architecture: any» 
        baz package

          + Depends: baz (>= ${source:Version}), baz (<< $
            {source:Version}.0~)

9.20. Отладочная информация

    The Debian package is built with the debugging information but
    packaged into the binary package after stripping the debugging
    information as required by «Chapter 10 - Files» of the «Debian
    Policy Manual».

    См.

      * «6.7.9. Best practices for debug packages» of the «Debian
        Developer’s Reference».
      * «18.2 Debugging Information in Separate Files» of the «
        Debugging with gdb»
      * «dh_strip(1) manapage»
      * «strip(1) manapage»
      * «readelf(1) manapage»
      * «objcopy(1) manapage»
      * Debian wiki: «DebugPackage»
      * Debian wiki: «AutomaticDebugPackages»
      * Сообщение в списке рассылки debian-devel: «Информация о
        статусе автоматических отладочных пакетов» (2015-08-15)

9.21. -dbgsym package

    The debugging information is automatically packaged separately as
    the debug package using the dh_strip command with its default
    behavior. The name of such a debug package normally has the 
    -dbgsym suffix.

      * The debian/rules file shouldn’t explicitly contain dh_strip.
      * Set the Build-Depends to debhelper-compat (>=13) while
        removing Build-Depends to debhelper in debian/control.

9.22. debconf

    Пакет debconf позволяет нам настраивать пакеты в ходе их
    установки двуями основными способами:

      * неинтерактивно из предпосевных настроек программы установки
        Debian.
      * interactively from the menu interface (dialog, gnome, kde,
        …​)

          + установка пакета: вызывается командой dpkg
          + установленный пакет: вызывается командой dpkg-reconfigure

    Всё взаимодействие с пользователем в ходе установки пакета должны
    обрабатыватся системой debconf с помощью следующих файлов.

      * debian/binarypackage.config

          + Этот config-сценарий debconf используется для того, чтобы
            задавать любые вопросы, необходимые для настройки пакета.
      * debian/двоичныйпакет.template

          + Этот templates-файл debconf используется для того, чтобы
            задавать любые вопросы, наобходимые для настройки пакета.

    These debconf files are called by package configuration scripts
    in the binary Debian package

      * DEBIAN/binarypackage.preinst
      * DEBIAN/binarypackage.prerm
      * DEBIAN/binarypackage.postinst
      * DEBIAN/binarypackage.postrm

    See dh_installdebconf(1), debconf(7), debconf-devel(7) and «3.9.1
    Prompting in maintainer scripts» in the «Debian Policy Manual».


---------------------------------------------------------------------

    ^[17] Этот документ был написан до появления файла symbols.

    ^[18] The strong preference is to use the SONAME versioned -dev
    package names over the single -dev package name in «Chapter 6.
    Development (-DEV) packages», which does not seem to be shared by
    the former ftp-master (Steve Langasek). This document was written
    before the introduction of the multiarch system and the symbols
    file.

    ^[19] This path is compliant with the FHS. «Filesystem Hierarchy
    Standard: /usr/lib : Libraries for programming and packages»
    states «Applications may use a single subdirectory under /usr/lib
    . If an application uses a subdirectory, all
    architecture-dependent data exclusively used by the application
    must be placed within that subdirectory.»

Глава 10. Packaging with git

    Up to «Глава 9, Продвинутые темы работы над пакетом», we focused
    on packaging operations without using Git or any other VCS. These
    traditional packaging operations were based on the tarball
    released by the upstream as mentioned in «Раздел 9.1, «Historical
    perspective»».

    Currently, the git(1) command is the de-facto platform for the
    VCS tool and is the essential part of both upstream development
    and Debian packaging activities. (See Debian wiki «Debian git
    packaging maintainer branch formats and workflows» for existing
    VCS workflows.)

    Примечание

    Since the non-native Debian source package uses «diff -u» as its
    backend technology for the maintainer modification, it can’t
    represent modification involving symlink, file permissions, nor
    binary data (March 2022 discussion on debian-devel@l.d.o). Please
    avoid making such maintainer modifications even though these can
    be recorded in the Git repository.

    Since VCS workflows are complicated topic and there are many
    practice styles, I only touch on some key points with minimal
    information, here.

    Salsa is the remote Git repository service with associated tools.
    It offers the collaboration platform for Debian packaging
    activities using a custom GitLab application instance. See:

      * «Раздел 10.1, «Salsa repository»»
      * «Раздел 10.2, «Salsa account setup»»
      * «Раздел 10.3, «Salsa CI service»»

    There are 2 styles of branch names for the Git repository used
    for the packaging. See «Раздел 10.4, «Branch names»».

    There are 2 main usage styles for the Git repository for the
    packaging. See:

      * «Раздел 10.5, «Patch unapplied Git repository»»
      * «Раздел 10.6, «Patch applied Git repository»»

    There are 2 notable Debian packaging tools for the Git repository
    for the packaging.

      * gbp(1) and its subcommands:

          + This is a tool designed to work with «Раздел 10.5, «Patch
            unapplied Git repository»».
          + See «Раздел 10.7, «Note on gbp»».
      * dgit(1) and its subcommands:
   
          + This is a tool designed to work with both «Раздел 10.6,
            «Patch applied Git repository»» and «Раздел 10.5, «Patch
            unapplied Git repository»».
          + This contains a tool to upload Debian packages using the 
            dgit server.
          + See «Раздел 10.8, «Note on dgit»».

10.1. Salsa repository

    It is highly desirable to host Debian source code package on
    Salsa. Over 90% of all Debian source code packages are hosted on
    Salsa. ^[20]

    The exact VCS repository hosting an existing Debian source code
    package can be identified by a metadata field Vcs-* which can be
    viewed with the apt-cache showsrc <package-name> command.

10.2. Salsa account setup

    After signing up for an account on Salsa, make sure that the
    following pages have the same e-mail address and GPG keys you
    have configured to be used with Debian, as well as your SSH key:

      * https://salsa.debian.org/-/profile/emails
      * https://salsa.debian.org/-/user_settings/gpg_keys
      * https://salsa.debian.org/-/user_settings/ssh_keys

10.3. Salsa CI service

    Salsa runs Salsa CI service as an instance of GitLab CI for «
    Раздел 9.4, «Непрерывная интеграция»».

    For every «git push» instances, tests which mimic tests run on
    the official Debian package service can be run by setting Salsa
    CI configuration file «Раздел 6.13, «debian/salsa-ci.yml file»»
    as:

    ---
    include:
      - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/recipes/debian.yml

    # Customizations here

10.4. Branch names

    The Git repository for the Debian packaging should have at least
    2 branches:

      * debian-branch to hold the current development work.

          + old style: master (or debian, main, latest, …​)
          + DEP-14 style: debian/sid
      * upstream-branch to hold the upstream releases.

          + old style: upstream
          + DEP-14 style: upstream/latest

    In this tutorial, old style branch names are used in examples for
    simplicity.

    Примечание

    This upstream-branch may need to be created using the tarball
    released by the upstream independent of the upstream Git
    repository since it tends to contain automatically generated
    files.

    The upstream Git repository content can co-exit in the local Git
    repository used for the Debian packaging by adding its copy.
    E.g.:

    $ git remote add upstream-git <url-upstream-git-repo>
    $ git fetch upstream-git master:upstream-master

    This allows easy cherry-picking from the upstream Git repository
    for bug fixes.

10.5. Patch unapplied Git repository

    The patch unapplied Git repository can be summarized as:

      * This seems to be the traditional practice as of 2024.
      * The source tree matches extracted contents by «dpkg-source -x
        --skip-patches» of the Debian source package.

          + The upstream source is recorded in the Git repository
            without changes.
          + The maintainer modified contents are confined within the 
            debian/* directory.
          + Maintainer changes to the upstream source are recorded in
            debian/patches/* files for the Debian source format «3.0
            (quilt)».
      * This repository style is useful for all variants of
        traditional workflows and gdb based workflow:

          + «Раздел 5.7, «Шаг 3: изменение шаблонных файлов»» (no
            patch)
          + «Раздел 5.10, «Patch by «diff -u» approach»»

              o debian/patches/* files can also be generated using «
                git format-patch», «git diff», or «gitk» from git
                commits in the through-away maintainer modification
                branch or from the upstream unreleased commits.
          + «Раздел 5.11, «Patch by dquilt approach»» including the
            last «dquilt pop -a» step
          + «Раздел 10.9, «Patch by «gbp-pq» approach»»
      * Use helper scripts such as dquilt(1) and gbp-pq(1) to manage
        data in debian/patches/* files.

          + Add .pc line to the ~/.gitignore file if dquilt is used.
          + Add unapply-patches and abort-on-upstream-changes lines
            in the debian/source/local-options file.
      * Use «dpkg-source -b» to build the Debian source package.
      * Use dput(1) to upload the Debian source package.

          + Use «dgit --gbp push-source» or «dgit --gbp push» instead
            to upload the Debian package via the dgit server (see «
            dgit-maint-gbp(7)»).

    Примечание

    The debian/source/local-options and debian/source/
    local-patch-header files are meant to be recorded by the git
    command. These aren’t included in the Debian source package.

10.6. Patch applied Git repository

    The patch applied Git repository can be summarized as:

      * The source tree matches extracted contents by «dpkg-source -x
        » of the Debian source package.

          + The source tree is buildable and the same as what NMU
            maintainers see.
          + The source is recorded in the Git repository with
            maintainer changes including the debian/ directory.
          + Maintainer changes to the upstream source are also
            recorded in debian/patches/* files for the Debian source
            format «3.0 (quilt)».

    Use one of workflow styles:

      * dgit-maint-merge(7) workflow.

          + Use this if you don’t intend to record topic patches in
            the Debain source package.
          + Good enough for packages only with trivial modifications
            to the upstream.
          + Only choice for packages with intertwined modification
            histories to the upstream
          + Add auto-commit and single-debian-patch lines in the 
            debian/source/local-options file
          + Use «git checkout upstream; git pull» to pull the new
            upstream commit and use «git checkout master ; git merge
            <new-version-tag>» to merge it to the master branch.
          + Use «dpkg-source -b» to build the Debian source package.
          + Use «dgit push-source» or «dgit push» for uploading the
            Debian package via the dgit server.
          + See «Раздел 5.12, «Patch by «dpkg-source --auto-commit»
            approach»» for example.
      * dgit-maint-debrebase(7) workflow.

          + Use this if you wish to commit maintainer changes to the
            patch applied Git repository with the same granularity as
            patches of «Раздел 10.9, «Patch by «gbp-pq» approach»».
          + Good for packages with multiple sequenced modifications
            to the upstream.
          + Use «dgit build-source» to build the Debian source
            package.
          + Use «dgit push-source» or «dgit push» for uploading the
            Debian package via the dgit server.
          + Details of this workflow are beyond the scope of this
            tutorial document. See «Раздел 10.12, «Note on 
            dgit-maint-debrebase workflow»» for more.

10.7. Note on gbp

    The gbp command is provided by the git-buildpackage package.

      * This command is designed to manage contents of «Раздел 10.5,
        «Patch unapplied Git repository»» efficiently.
      * Use «gbp import-orig» to import the new upstream tar to the
        git repository.

          + 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.
      * Use «gbp import-dsc» to import the previous Debian source
        package to the git repository.
      * Use «gbp dch» to generate the Debian changelog from the git
        commit messages.
      * Use «gbp buildpackage» to build the Debian binary package
        from the git repository.

          + The sbuild package can be used as its clean chroot build
            backend either by configuration or adding «--git-builder=
            'sbuild -A -s --source-only-changes -v -d unstable'»
      * Use «gbp pull» to update the debian, upstream and 
        pristine-tar branches safely from the remote repository.
      * Use «gbp pq» to manage quilt patches without using dquilt
        command.
      * Use «gbp clone REPOSITORY_URL» to clone and set up tracking
        branches for debian, upstream and pristine-tar.

    Package history management with the git-buildpackage package is
    becoming the standard practice for many Debian maintainers. See
    more at:

      * «Сборка пакетов Debian с помощью git-buildpackage»
      * «4 tips to maintain a “3.0 (quilt)” Debian source package in
        a VCS»
      * The systemd packaging practice documentation on «Building
        from source»
      * The workflow mentioned in dgit-maint-gbp(7) which enables to
        use this gbp with dgit

10.8. Note on dgit

    The dgit command is provided by the dgit package.

      * This command is designed to manage contents of «Раздел 10.6,
        «Patch applied Git repository»» efficiently.

          + This enables to access the Debian package repository as
            if it is a git remote repository.
      * This command supports uploading Debian packages using the 
        dgit server from both «Раздел 10.5, «Patch unapplied Git
        repository»» and «Раздел 10.6, «Patch applied Git repository»
        ».

    The new dgit package offers commands to automate packaging
    activities using the git repository as an alternative to still
    popular gbp-buildpackage. Please read their guide:

      * dgit-maint-merge(7) — for the Debian source format «3.0
        (quilt)» package with its changes flowing both ways between
        the upstream Git repository and the Debian Git repository
        which are tightly coupled using «Раздел 10.6, «Patch applied
        Git repository»».
      * dgit-maint-debrebase(7) — for the Debian source format «3.0
        (quilt)» package with its changes flowing mostly one way from
        the upstream Git repository to the Debian Git repository
        using «Раздел 10.6, «Patch applied Git repository»».
      * dgit-maint-gbp(7) — for the Debian source format «3.0 (quilt)
        » package with its Debian Git repository which is kept usable
        also for people using gbp-buildpackage(1) using «Раздел 10.5,
        «Patch unapplied Git repository»».
      * dgit-maint-native(7) — for the Debian source format «3.0
        (native)» package in the Debian Git repository. (No
        maintainer changes)

    The dgit(1) command can push the easy-to-trace change history to
    the https://browse.dgit.debian.org/ site and can upload Debian
    package to the Debian repository properly without using dput(1).

    The concept around dgit is beyond this tutorial document. Please
    start reading relevant information:

      * «dgit: use the Debian archive as a git remote (2015)»
      * «tag2upload (2023)»

10.9. Patch by «gbp-pq» approach

    For «Раздел 10.5, «Patch unapplied Git repository»», you can
    generate debian/patches/* files using the gbp-pq(1) command from 
    git commits in the through-away patch-queue branch.

    Unlike dquilt which offers similar functionality as seen «
    Раздел 5.11, «Patch by dquilt approach»» and «Раздел 8.5, «Manage
    patch queue with dquilt»», gbp-pq doesn’t generate .pc/* files.

10.10. Manage patch queue with gbp-pq

    You can add, drop, and refresh debian/patches/* files with gbp-pq
    to manage patch queue.

    If the package is managed in «Раздел 10.5, «Patch unapplied Git
    repository»» using the git-buildpackage package, you can revise
    the upstream source to fix bug as the maintainer and release a
    new Debian revision using gbp pq.

      * Add a new patch recording the upstream source modification on the
        file buggy_file as:

         $ git checkout master
         $ gbp pq import
        gbp:info: ... imported on 'patch-queue/master
         $ vim buggy_file
          ...
         $ git add buggy_file
         $ git commit
         $ gbp pq export
        gbp:info: On 'patch-queue/master', switching to 'master'
        gbp:info: Generating patches from git (master..patch-queue/master)
         $ git add debian/patches/*
         $ dch -i
         $ git commit -a -m "Closes: #<bug_number>"
         $ git tag debian/<version>-<rev>

      * Drop (== disable) an existing patch

          + Comment out pertinent line in debian/patches/series
          + Erase the patch itself (optional)
      * Refresh debian/patches/* files to make «dpkg-source -b» work as
        expected after updating a Debian package to the new upstream
        release.

         $ git checkout master
         $ gbp pq --force import # ensure patch-queue/master branch
        gbp:info: ... imported on 'patch-queue/master
         $ git checkout master
         $ gbp import-orig --pristine-tar --uscan
          ...
        gbp:info: Successfully imported version ?.?.? of ../packagename_?.?.?.orig.tar.gz
         $ gbp pq rebase
         ... resolve conflicts and commit to patch-queue/master branch
         $ gbp pq export
        gbp:info: On 'patch-queue/master', switching to 'master'
        gbp:info: Generating patches from git (master..patch-queue/master)
         $ git add debian/patches
         $ git commit -m "Update patches"
         $ dch -v <newversion>-1
         $ git commit -a -m "release <newversion>-1"
         $ git tag debian/<newversion>-1

10.11. gbp import-dscs --debsnap

    For Debian source packages named «<source-package>» recorded in
    the snapshot.debian.org archive, an initial git repository
    managed in «Раздел 10.5, «Patch unapplied Git repository»» with
    all of the Debian version history can be generated as follows.

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

10.12. Note on dgit-maint-debrebase workflow

    Here are some hints around dgit-maint-debrebase(7). ^[21]

      * Use «dgit setup-new-tree» to prepare the local git working
        repository.
      * The first maintainer modification commit should contain files
        only in the debian/ directory excluding files in the debian/
        patches directory.
      * debian/patches/* files are generated from the maintainer
        modification commit history using the «dgit quilt-fixup»
        command automatically invoked from «dgit build» and «dgit
        push».
      * Use «git-debrebase new-version <new-version-tag>» to rebase
        the maintainer modification commit history with automatically
        updated debian/changelog.
      * Use «git-debrebase conclude» to make a new pseudomerge (== «
        git merge -s ours») to record Debian package with clean
        ff-history.

    See dgit-maint-debrebase(7), dgit(1) and git-debrebase(1) for
    more.

10.13. Quasi-native Debian packaging

    The quasi-native packaging scheme packages a source without the
    real upstream tarball using the non-native package format.

    Подсказка

    Some people promote this quasi-native packaging scheme even for
    programs written only for Debian since it helps to ease
    communication with the downstream distros such as Ubuntu for bug
    fixes etc.

    This quasi-native packaging scheme involves 2 preparation steps:

      * Organize its source tree almost like native Debian package
        (see «Раздел 6.4, «Родной пакет Debian»») with debian/* files
        with a few exceptions:

          + Make debian/source/format to contain «3.0 (quilt)»
            instead of «3.0 (native)» .
          + Make debian/changelog to contain version-revision instead
            of version .
      * Generate missing upstream tarball preferably without debian/*
        files.

          + For Debian source format «3.0 (quilt)», removal of files
            under debian/ directory is an optional action.

    The rest is the same as the non-native packaging workflow as
    written in «Раздел 6.1, «Работа по созданию пакета»».

    Although this can be done in many ways («Раздел 15.4, «Snapshot
    upstream tarball (-d, -t)»»), you can use the Git repository and 
    «git deborig» as:

     $ cd /path/to/<dirname>
     $ dch -r
      ... set its <version>-<revision>, e.g., 1.0-1
     $ git tag -s debian/1.0-1
     $ git rm -rf debian
     $ git tag -s upstream/1.0
     $ git commit -m upstream/1.0
     $ git reset --hard HEAD^
     $ git deborig
     $ sbuild


---------------------------------------------------------------------

    ^[20] Use of git.debian.org or alioth.debian.org are deprecated
    now.

    ^[21] I may be incorrect, here.

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

    Please also read insightful pages linked from «Notes on Debian»
    by Russ Allbery (long time Debian developer) which have best
    practices for advanced packaging topics.

11.1. Сборка с использованием кодировки UTF-8

    Локалью по умолчанию в сборочном окружении является 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

11.2. Преобразование в кодировку UTF-8

    If upstream documents are encoded in old encoding schemes,
    converting them to UTF-8 is a good idea.

    Use the iconv command in the libc-bin package to convert the
    encoding of plain text files.

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

11.3. Hints for Debugging

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

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

      * Wikipedia: «core dump»

          + «man core»
          + Update the «/etc/security/limits.conf» file to include
            the following:

            * soft core unlimited

          + «ulimit -c unlimited» in ~/.bashrc
          + «ulimit -a» to check
          + Press Ctrl-\ or «kill -ABRT 'PID'» to make a core dump
            file
      * gdb — отладчик GNU

          + «info gdb»
          + «Debugging with GDB» in /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» - Syntax check of a Shell script
      * «sh -x script.sh» - Trace a Shell script
      * «python3 -m py_compile script.py» - Syntax check of a Python
        script
      * «python3 -mtrace --trace script.py» - Trace a Python script
      * «perl -I ../libpath -c script.pl» - Syntax check of a Perl
        script
      * «perl -d:Trace script.pl» - Trace a Perl script

          + 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'» .

Глава 12. Tool usages

    Here are some notable tools around Debian packaging.

    Примечание

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

    Примечание
   
    Examples here use the gz-compression. The xz-compression may be
    used instead.

12.1. debdiff

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

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

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

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

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

    Debian now enforces the source-only upload when developing
    packages. So there may be 2 different *.changes files:

      * package_version-revision_source.changes for the normal
        source-only upload
      * package_version-revision_arch.changes for the binary upload

12.2. dget

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

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

12.3. mk-origtargz

    You can make the upstream tarball ../foo-newversion.tar.[xg]z
    accessible from the Debian source tree as ../foo_newversion
    .orig.tar.[xg]z.

12.4. origtargz

    You can fetch the pre-existing orig tarball of a Debian package
    from various sources, and unpack it with origtargz command.

    This is basically for -2, -3, …​ revisions.

12.5. git deborig

    If the upstream project is hosted on a Git repository without the
    official release of tarball, you can generate its orig tarball
    from the git repository for use by the Debain source package.
    Please, execute «git deborig» from the root of the checked-out
    source tree.

    This is basically for -1 revisions.

12.6. dpkg-source -b

    The «dpkg-source -b» command packs the upstream source tree into
    the Debian source package.

    It expects a series of patches in the debian/patches/ directory
    and their application sequence in debian/patches/series.

    It is compatible with dquilt (see «Раздел 4.4, «quilt setup»»)
    operations and understands the the patch application status from
    the existance of .pc/applied-patches.

    The dpkg-buildpackage command invokes «dpkg-source -b».

12.7. dpkg-source -x

    The «dpkg-source -x» command extracts source tree and applies the
    patches in the debian/patches/ directory using the sequence
    specified in debian/patches/series to the upstream source tree.
    It also adds .pc/applied-patches. (See «Раздел 10.6, «Patch
    applied Git repository»».)

    The «dpkg-source -x --skip-patches» command extracts source tree
    only. It doesn’t add .pc/applied-patches. (See «Раздел 10.5,
    «Patch unapplied Git repository»».)

    Both extracted source trees are ready for building Debian binary
    packages with dpkg-buildpackage, dbuild, sbuild, etc..

12.8. debc

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

    $ debc package_version-rev_arch.changes

12.9. piuparts

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

    $ sudo piuparts package_version-rev_arch.changes

    Примечание
   
    This is a very slow process with remote APT package repository
    access.

12.10. bts

    After uploading the package, you will receive bug reports. It is
    an important duty of a package maintainer to manage these bugs
    properly as described in «5.8. Handling bugs» of the «Debian
    Developer’s Reference».

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

    $ bts severity 123123 wishlist , tags -1 pending

Глава 13. Дополнительные примеры

    There is an old Latin saying: «fabricando fit faber» («practice
    makes perfect»).

    It is highly recommended to practice and experiment with all the
    steps of Debian packaging with simple packages. This chapter
    provides you with many upstream cases for your practice.

    Кроме того, это должно служит в качестве вводных примеров для
    множества тем по программированию.

      * Программирование в командной оболочке POSIX, на языках
        Python3 и C.
      * Method to create a desktop GUI program launcher with icon
        graphics.
      * Conversion of a command from CLI to GUI.
      * Conversion of a program to use gettext for
        internationalization and localization: POSIX shell and C
        sources.
      * Overview of many build systems: Makefile, Python, Autotools,
        and CMake.

    Please note that Debian takes a few things seriously:

      * Свободное ПО
      * Stability and security of OS
      * Универсальная операционная система реализуется через
   
          + свободный выбор источников и исходных кодов основной
            ветки разработки,
          + свободный выбор архитектур ЦП, а также
          + свободный выбор языка пользовательского интерфейса.

    Знакомство с типичным примером работы над пакетом, представленным
    в «Глава 5, Simple packaging», является предварительным условием
    для чтения данной главы.

    Some details are intentionally left vague in the following
    sections. Please try to read the pertinent documentation and
    practice yourself to find them out.

    Подсказка

    The best source of a packaging example is the current Debian
    archive itself. Please use the «Debian Code Search» service to
    find pertinent examples.

13.1. Выборочное применение шаблонов

    Ниже приводится пример создания простого пакета Debian из
    исходного кода без какого-либо содержимого в пустом каталоге.

    This is a good platform to get all the template files without
    making a mess in the upstream source tree you are working on.

    Допустим, пустым каталогом будет debhello-0.1.

     $ mkdir debhello-0.1
     $ tree
    .
    └── debhello-0.1

    2 directories, 0 files

    Let’s generate the maximum amount of template files.

    Let’s also use the «-p debhello -t -u 0.1 -r 1» options to make
    the missing upstream tarball with default -x3 and T options.

     $ cd /path/to/debhello-0.1
     $ debmake -p debhello -t -u 0.1 -r 1
    I: set parameters
     ...

    Проверим созданные шаблонные файлы.

     $ cd /path/to
     $ tree
    .
    ├── debhello-0.1
    │   └── debian
    │       ├── README.Debian
    │       ├── README.source
    │       ├── changelog
    │       ├── clean
    │       ├── control
    │       ├── copyright
    │       ├── debhello.bug-control.ex
    │       ├── debhello.bug-presubj.ex
    │       ├── debhello.bug-script.ex
    │       ├── debhello.conffiles.ex
    │       ├── debhello.cron.d.ex
    │       ├── debhello.cron.daily.ex
    │       ├── debhello.cron.hourly.ex
    │       ├── debhello.cron.monthly.ex
    │       ├── debhello.cron.weekly.ex
    │       ├── debhello.default.ex
    │       ├── debhello.emacsen-install.ex
    │       ├── debhello.emacsen-remove.ex
    │       ├── debhello.emacsen-startup.ex
    │       ├── debhello.lintian-overrides.ex
    │       ├── debhello.service.ex
    │       ├── debhello.tmpfile.ex
    │       ├── dirs
    │       ├── gbp.conf
    │       ├── install
    │       ├── links
    │       ├── maintscript.ex
    │       ├── manpage.1.ex
    │       ├── manpage.asciidoc.ex
    │       ├── manpage.md.ex
    │       ├── manpage.sgml.ex
    │       ├── manpage.xml.ex
    │       ├── patches
    │       │   └── series
    │       ├── postinst.ex
    │       ├── postrm.ex
    │       ├── preinst.ex
    │       ├── prerm.ex
    │       ├── rules
    │       ├── salsa-ci.yml
    │       ├── source
    │       │   ├── format
    │       │   ├── lintian-overrides.ex
    │       │   ├── local-options.ex
    │       │   ├── local-patch-header.ex
    │       │   ├── options.ex
    │       │   └── patch-header.ex
    │       ├── tests
    │       │   └── control
    │       ├── upstream
    │       │   └── metadata
    │       └── watch
    ├── debhello-0.1.tar.gz
    └── debhello_0.1.orig.tar.gz -> debhello-0.1.tar.gz

    7 directories, 50 files

    Теперь вы можете скопировать любой из созданных в каталоге 
    debhello-0.1/debian/ шаблонных файлов в ваш пакет, при
    необходимости их переименовав.

13.2. Без Makefile (командная оболочка, интерфейс командной оболочки)

    Ниже приводится пример создания простого пакета Debian из
    программы с интерфесом командной оболочки, написанной для
    командной оболочки POSIX и не имеющей системы сборки.

    Допустим tar-архив основной ветки имеет имя debhello-0.2.tar.gz.

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

    For example:

     $ tar -xzmf debhello-0.2.tar.gz
     $ cd debhello-0.2
     $ sudo cp scripts/hello /bin/hello
     ...

    Let’s get this source as tar file from a remote site and make it
    the Debian package.

    Загрузим debhello-0.2.tar.gz. 

     $ wget http://www.example.org/download/debhello-0.2.tar.gz
     ...
     $ tar -xzmf debhello-0.2.tar.gz
     $ tree
    .
    ├── debhello-0.2
    │   ├── README.md
    │   ├── data
    │   │   ├── hello.desktop
    │   │   └── hello.png
    │   ├── man
    │   │   └── hello.1
    │   └── scripts
    │       └── hello
    └── debhello-0.2.tar.gz

    5 directories, 6 files

    Итак, сценарий командной оболочки POSIX hello является очень
    простым.

    hello (v=0.2). 

     $ cat debhello-0.2/scripts/hello
    #!/bin/sh -e
    echo "Hello from the shell!"
    echo ""
    echo -n "Type Enter to exit this program: "
    read X

    Here, hello.desktop supports the «Desktop Entry Specification».

    hello.desktop (v=0.2). 

     $ cat debhello-0.2/data/hello.desktop
    [Desktop Entry]
    Name=Hello
    Name[fr]=Bonjour
    Comment=Greetings
    Comment[fr]=Salutations
    Type=Application
    Keywords=hello
    Exec=hello
    Terminal=true
    Icon=hello.png
    Categories=Utility;

    Here, hello.png is the icon graphics file.

    Let’s package this with the debmake command. Here, the -b':sh'
    option is used to specify that the generated binary package is a
    shell script.

     $ cd /path/to/debhello-0.2
     $ debmake -b':sh' -x1
    I: set parameters
     ...
    I: sanity check of parameters
    I: pkg="debhello", ver="0.2", rev="1"
    I: *** start packaging in "debhello-0.2". ***
    I: provide debhello_0.2.orig.tar.gz for non-native Debian package
    I: pwd = "/path/to"
    I: $ ln -sf debhello-0.2.tar.gz debhello_0.2.orig.tar.gz
    I: pwd = "/path/to/debhello-0.2"
    I: parse binary package settings: :sh
    I: binary package=debhello Type=script / Arch=all M-A=foreign
    I: analyze the source tree
    I: build_type = Unknown
    I: scan source for copyright+license text and file extensions
    I:  25 %, ext = md
     ...

    Проверим созданные шаблонные файлы.

    Дерево исходного кода после простого выполнения debmake. (v=
    0.2). 

     $ cd /path/to
     $ tree
    .
    ├── debhello-0.2
    │   ├── README.md
    │   ├── data
    │   │   ├── hello.desktop
    │   │   └── hello.png
    │   ├── debian
    │   │   ├── README.Debian
    │   │   ├── README.source
    │   │   ├── changelog
    │   │   ├── clean
    │   │   ├── control
    │   │   ├── copyright
    │   │   ├── dirs
    │   │   ├── gbp.conf
    │   │   ├── install
    │   │   ├── links
    │   │   ├── patches
    │   │   │   └── series
    │   │   ├── rules
    │   │   ├── salsa-ci.yml
    │   │   ├── source
    │   │   │   ├── format
    │   │   │   ├── local-options.ex
    │   │   │   └── local-patch-header.ex
    │   │   ├── tests
    │   │   │   └── control
    │   │   ├── upstream
    │   │   │   └── metadata
    │   │   └── watch
    │   ├── man
    │   │   └── hello.1
    │   └── scripts
    │       └── hello
    ├── debhello-0.2.tar.gz
    └── debhello_0.2.orig.tar.gz -> debhello-0.2.tar.gz

    10 directories, 26 files

    debian/rules (шаблонный файл, v=0.2): 

     $ cd /path/to/debhello-0.2
     $ cat debian/rules
    #!/usr/bin/make -f
    # You must remove unused comment lines for the released package.
    #export DH_VERBOSE = 1

    %:
            dh $@

    По сути, это стандартный файл debian/rules, использующий команду 
    dh. Поскольку это пакет со сценарием, этот шаблонный файл debian/
    rules не имеет содержимого, связанного с флагом сборки.

    debian/control (шаблонный файл, v=0.2): 

     $ cat debian/control
    Source: debhello
    Section: unknown
    Priority: optional
    Maintainer: "Osamu Aoki" <osamu@debian.org>
    Build-Depends: debhelper-compat (= 13)
    Standards-Version: 4.6.2
    Homepage: <insert the upstream URL, if relevant>
    Rules-Requires-Root: no
    #Vcs-Git: https://salsa.debian.org/debian/debhello.git
    #Vcs-Browser: https://salsa.debian.org/debian/debhello

    Package: debhello
    Architecture: all
    Multi-Arch: foreign
    Depends: ${misc:Depends}
    Description: auto-generated package by debmake
     This Debian binary package was auto-generated by the
     debmake(1) command provided by the debmake package.

    Since this is the shell script package, the debmake command sets 
    «Architecture: all» and «Multi-Arch: foreign». Also, it sets
    required substvar parameters as «Depends: ${misc:Depends}». These
    are explained in «Глава 6, Basics for packaging».

    Since this upstream source lacks the upstream Makefile, that
    functionality needs to be provided by the maintainer. This
    upstream source contains only a script file and data files and no
    C source files; the build process can be skipped but the install
    process needs to be implemented. For this case, this is achieved
    cleanly by adding the debian/install and debian/manpages files
    without complicating the debian/rules file.

    Сделаем этот пакет Debian лучше.

    debian/rules (версия сопровождающего, v=0.2): 

     $ cd /path/to/debhello-0.2
     $ vim debian/rules
     ... hack, hack, hack, ...
     $ cat debian/rules
    #!/usr/bin/make -f
    export DH_VERBOSE = 1

    %:
            dh $@

    debian/control (версия сопровождающего, v=0.2): 

     $ vim debian/control
     ... hack, hack, hack, ...
     $ cat debian/control
    Source: debhello
    Section: devel
    Priority: optional
    Maintainer: Osamu Aoki <osamu@debian.org>
    Build-Depends: debhelper-compat (= 13)
    Standards-Version: 4.6.2
    Homepage: https://salsa.debian.org/debian/debmake-doc
    Rules-Requires-Root: no

    Package: debhello
    Architecture: all
    Multi-Arch: foreign
    Depends: ${misc:Depends}
    Description: Simple packaging example for debmake
     This Debian binary package is an example package.
     (This is an example only)

    Предупреждение
   
    If you leave «Section: unknown» in the template debian/control
    file unchanged, the lintian error may cause a build failure.

    debian/install (версия сопровождающего, v=0.2): 

     $ vim debian/install
     ... hack, hack, hack, ...
     $ cat debian/install
    data/hello.desktop usr/share/applications
    data/hello.png usr/share/pixmaps
    scripts/hello usr/bin

    debian/manpages (версия сопровождающего, v=0.2): 

     $ vim debian/manpages
     ... hack, hack, hack, ...
     $ cat debian/manpages
    man/hello.1

    В каталоге debian/ имеются и другие шаблонные файлы. Их также
    следует обновить.

    Шаблонные файлы в каталоге debian/. (v=0.2): 

     $ rm -f debian/clean debian/dirs debian/links
     $ rm -f debian/README.source debian/source/*.ex
     $ rm -rf debian/patches
     $ tree -F debian
    debian/
    ├── README.Debian
    ├── changelog
    ├── control
    ├── copyright
    ├── gbp.conf
    ├── install
    ├── manpages
    ├── rules*
    ├── salsa-ci.yml
    ├── source/
    │   └── format
    ├── tests/
    │   └── control
    ├── upstream/
    │   └── metadata
    └── watch

    4 directories, 13 files

    В данном дереве исходного кода вы можете создать неродной пакет
    Debian с помощью команды debuild (или её эквивалента). Вывод это
    команды очень подробен, в нём объясняется, что происходит, и
    выглядит это следующим образом.

     $ cd /path/to/debhello-0.2
     $ debuild
     dpkg-buildpackage -us -uc -ui -i
    dpkg-buildpackage: info: source package debhello
    dpkg-buildpackage: info: source version 0.2-1
    dpkg-buildpackage: info: source distribution unstable
    dpkg-buildpackage: info: source changed by Osamu Aoki <osamu@debian.org>
     dpkg-source -i --before-build .
    dpkg-buildpackage: info: host architecture amd64
     debian/rules clean
    dh clean
       dh_clean
            rm -f debian/debhelper-build-stamp
     ...
     debian/rules binary
    dh binary
       dh_update_autotools_config
       dh_autoreconf
       create-stamp debian/debhelper-build-stamp
       dh_prep
            rm -f -- debian/debhello.substvars
            rm -fr -- debian/.debhelper/generated/debhello/ debian/debhello/ debi...
       dh_auto_install --destdir=debian/debhello/
     ...
    Finished running lintian.

    Проверим результат сборки.

    Командой debuild были созданы следующие файлы debhello версии 0.2
    : 

     $ cd /path/to
     $ tree -FL 1
    ./
    ├── debhello-0.2/
    ├── debhello-0.2.tar.gz
    ├── debhello_0.2-1.debian.tar.xz
    ├── debhello_0.2-1.dsc
    ├── debhello_0.2-1_all.deb
    ├── debhello_0.2-1_amd64.build
    ├── debhello_0.2-1_amd64.buildinfo
    ├── debhello_0.2-1_amd64.changes
    └── debhello_0.2.orig.tar.gz -> debhello-0.2.tar.gz

    2 directories, 8 files

    Вы видите все созданные файлы.

      * The debhello_0.2.orig.tar.gz file is a symlink to the
        upstream tarball.
      * The debhello_0.2-1.debian.tar.xz file contains the maintainer
        generated contents.
      * The debhello_0.2-1.dsc file is the meta data file for the
        Debian source package.
      * The debhello_0.2-1_all.deb file is the Debian binary package.
      * The debhello_0.2-1_amd64.build file is the build log file.
      * The debhello_0.2-1_amd64.buildinfo file is the meta data file
        generated by dpkg-genbuildinfo(1).
      * The debhello_0.2-1_amd64.changes file is the meta data file
        for the Debian binary package.

    The debhello_0.2-1.debian.tar.xz file contains the Debian changes
    to the upstream source as follows.

    Сжатое содержимое архива debhello_0.2-1.debian.tar.xz: 

     $ tar -tzf debhello-0.2.tar.gz
    debhello-0.2/
    debhello-0.2/data/
    debhello-0.2/data/hello.desktop
    debhello-0.2/data/hello.png
    debhello-0.2/man/
    debhello-0.2/man/hello.1
    debhello-0.2/scripts/
    debhello-0.2/scripts/hello
    debhello-0.2/README.md
     $ tar --xz -tf debhello_0.2-1.debian.tar.xz
    debian/
    debian/README.Debian
    debian/changelog
    debian/control
    debian/copyright
    debian/gbp.conf
    debian/install
    debian/manpages
    debian/rules
    debian/salsa-ci.yml
    debian/source/
    debian/source/format
    debian/tests/
    debian/tests/control
    debian/upstream/
    debian/upstream/metadata
    debian/watch

    The debhello_0.2-1_amd64.deb file contains the files to be
    installed as follows.

    The binary package contents of debhello_0.2-1_all.deb: 

     $ dpkg -c debhello_0.2-1_all.deb
    drwxr-xr-x root/root ...  ./
    drwxr-xr-x root/root ...  ./usr/
    drwxr-xr-x root/root ...  ./usr/bin/
    -rwxr-xr-x root/root ...  ./usr/bin/hello
    drwxr-xr-x root/root ...  ./usr/share/
    drwxr-xr-x root/root ...  ./usr/share/applications/
    -rw-r--r-- root/root ...  ./usr/share/applications/hello.desktop
    drwxr-xr-x root/root ...  ./usr/share/doc/
    drwxr-xr-x root/root ...  ./usr/share/doc/debhello/
    -rw-r--r-- root/root ...  ./usr/share/doc/debhello/README.Debian
    -rw-r--r-- root/root ...  ./usr/share/doc/debhello/changelog.Debian.gz
    -rw-r--r-- root/root ...  ./usr/share/doc/debhello/copyright
    drwxr-xr-x root/root ...  ./usr/share/man/
    drwxr-xr-x root/root ...  ./usr/share/man/man1/
    -rw-r--r-- root/root ...  ./usr/share/man/man1/hello.1.gz
    drwxr-xr-x root/root ...  ./usr/share/pixmaps/
    -rw-r--r-- root/root ...  ./usr/share/pixmaps/hello.png

    Here is the generated dependency list of debhello_0.2-1_all.deb.

    The generated dependency list of debhello_0.2-1_all.deb: 
   
     $ dpkg -f debhello_0.2-1_all.deb pre-depends \
                depends recommends conflicts breaks

    (No extra dependency packages required since this is a POSIX
    shell program.)

    Примечание

    If you wish to replace upstream provided PNG file data/hello.png
    with maintainer provided one debian/hello.png, editing debian/
    install isn’t enough. When you add debian/hello.png, you need to
    add a line «include-binaries» to debian/source/options since PNG
    is a binary file. See dpkg-source(1).

13.3. Makefile (командная оболочка, интерфейс командной оболочки)

    Ниже приводится пример создания простого пакета Debian из
    программы с интерфесом командной оболочки, написанной для
    командной оболочки POSIX и использующей в качестве системы сборки
    Makefile.

    Допустим tar-архив основной ветки имеет имя debhello-1.0.tar.gz.

    Предполагается, что этот тип исходного кода будет установлен как
    несистемный файл:

     $ tar -xzmf debhello-1.0.tar.gz
     $ cd debhello-1.0
     $ make install

    Debian packaging requires changing this «make install» process to
    install files to the target system image location instead of the
    normal location under /usr/local.

    Получитм исходный код и создадим пакет Debian.

    Загрузим debhello-1.0.tar.gz. 

     $ wget http://www.example.org/download/debhello-1.0.tar.gz
     ...
     $ tar -xzmf debhello-1.0.tar.gz
     $ tree
    .
    ├── debhello-1.0
    │   ├── Makefile
    │   ├── README.md
    │   ├── data
    │   │   ├── hello.desktop
    │   │   └── hello.png
    │   ├── man
    │   │   └── hello.1
    │   └── scripts
    │       └── hello
    └── debhello-1.0.tar.gz

    5 directories, 7 files

    Here, the Makefile uses $(DESTDIR) and $(prefix) properly. All
    other files are the same as in «Раздел 13.2, «Без Makefile
    (командная оболочка, интерфейс командной оболочки)»» and most of
    the packaging activities are the same.

    Makefile (v=1.0). 

     $ cat debhello-1.0/Makefile
    prefix = /usr/local

    all:
            : # do nothing

    install:
            install -D scripts/hello \
                    $(DESTDIR)$(prefix)/bin/hello
            install -m 644 -D data/hello.desktop \
                    $(DESTDIR)$(prefix)/share/applications/hello.desktop
            install -m 644 -D data/hello.png \
                    $(DESTDIR)$(prefix)/share/pixmaps/hello.png
            install -m 644 -D man/hello.1 \
                    $(DESTDIR)$(prefix)/share/man/man1/hello.1

    clean:
            : # do nothing

    distclean: clean

    uninstall:
            -rm -f $(DESTDIR)$(prefix)/bin/hello
            -rm -f $(DESTDIR)$(prefix)/share/applications/hello.desktop
            -rm -f $(DESTDIR)$(prefix)/share/pixmaps/hello.png
            -rm -f $(DESTDIR)$(prefix)/share/man/man1/hello.1

    .PHONY: all install clean distclean uninstall

    Let’s package this with the debmake command. Here, the -b':sh'
    option is used to specify that the generated binary package is a
    shell script.

     $ cd /path/to/debhello-1.0
     $ debmake -b':sh' -x1
    I: set parameters
     ...
    I: sanity check of parameters
    I: pkg="debhello", ver="1.0", rev="1"
    I: *** start packaging in "debhello-1.0". ***
    I: provide debhello_1.0.orig.tar.gz for non-native Debian package
    I: pwd = "/path/to"
    I: $ ln -sf debhello-1.0.tar.gz debhello_1.0.orig.tar.gz
    I: pwd = "/path/to/debhello-1.0"
    I: parse binary package settings: :sh
    I: binary package=debhello Type=script / Arch=all M-A=foreign
    I: analyze the source tree
    I: build_type = make
    I: scan source for copyright+license text and file extensions
    I:  25 %, ext = md
     ...

    Let’s inspect the notable template files generated.

    debian/rules (шаблонный файл, v=1.0): 

     $ cd /path/to/debhello-1.0
     $ cat debian/rules
    #!/usr/bin/make -f
    # You must remove unused comment lines for the released package.
    #export DH_VERBOSE = 1
   
    %:
            dh $@

    #override_dh_auto_install:
    #       dh_auto_install -- prefix=/usr

    #override_dh_install:
    #       dh_install --list-missing -X.pyc -X.pyo

    Сделаем этот пакет Debian лучше.

    debian/rules (версия сопровождающего, v=1.0): 

     $ cd /path/to/debhello-1.0
     $ vim debian/rules
     ... hack, hack, hack, ...
     $ cat debian/rules
    #!/usr/bin/make -f
    export DH_VERBOSE = 1

    %:
            dh $@

    override_dh_auto_install:
            dh_auto_install -- prefix=/usr

    Since this upstream source has the proper upstream Makefile,
    there is no need to create debian/install and debian/manpages
    files.

    Файл debian/control в точности совпадает с тем же файлом из
    случая «Раздел 13.2, «Без Makefile (командная оболочка, интерфейс
    командной оболочки)»».

    В каталоге debian/ имеются и другие шаблонные файлы. Их также
    следует обновить.

    Шаблонные файлы в каталоге debian/. (v=1.0): 

     $ rm -f debian/clean debian/dirs debian/install debian/links
     $ rm -f debian/README.source debian/source/*.ex
     $ rm -rf debian/patches
     $ tree -F debian
    debian/
    ├── README.Debian
    ├── changelog
    ├── control
    ├── copyright
    ├── gbp.conf
    ├── rules*
    ├── salsa-ci.yml
    ├── source/
    │   └── format
    ├── tests/
    │   └── control
    ├── upstream/
    │   └── metadata
    └── watch

    4 directories, 11 files

    The rest of the packaging activities are practically the same as
    the ones in «Раздел 13.2, «Без Makefile (командная оболочка,
    интерфейс командной оболочки)»».

13.4. pyproject.toml (Python3, CLI)

    Here is an example of creating a simple Debian package from a
    Python3 CLI program using pyproject.toml.

    Получитм исходный код и создадим пакет Debian.

    Загрузим debhello-1.1.tar.gz. 

     $ wget http://www.example.org/download/debhello-1.1.tar.gz
     ...
     $ tar -xzmf debhello-1.1.tar.gz
     $ tree
    .
    ├── debhello-1.1
    │   ├── LICENSE
    │   ├── MANIFEST.in
    │   ├── README.md
    │   ├── data
    │   │   ├── hello.desktop
    │   │   └── hello.png
    │   ├── manpages
    │   │   └── hello.1
    │   ├── pyproject.toml
    │   └── src
    │       └── debhello
    │           ├── __init__.py
    │           └── main.py
    └── debhello-1.1.tar.gz

    6 directories, 10 files

    Here, the content of this debhello source tree as follows.

    pyproject.toml (v=1.1) — PEP 517 configuration. 

     $ cat debhello-1.1/pyproject.toml
    [build-system]
    requires = ["setuptools >= 61.0"]  # REQUIRED if [build-system] table is used...
    build-backend = "setuptools.build_meta"  # If not defined, then legacy behavi...

    [project]
    name = "debhello"
    version = "1.1.0"
    description = "Hello Python (CLI)"
    readme = {file = "README.md", content-type = "text/markdown"}
    requires-python = ">=3.12"
    license = {file = "LICENSE.txt"}
    keywords = ["debhello"]
    authors = [
      {name = "Osamu Aoki", email = "osamu@debian.org" },
    ]
    maintainers = [
      {name = "Osamu Aoki", email = "osamu@debian.org" },
    ]
    classifiers = [
      "Development Status :: 5 - Production/Stable",
      "Intended Audience :: Developers",
            "Topic :: System :: Archiving :: Packaging",
      "License :: OSI Approved :: MIT License",
      "Programming Language :: Python :: 3",
      "Programming Language :: Python :: 3.12",
      "Programming Language :: Python :: 3 :: Only",
      # Others
      "Operating System :: POSIX :: Linux",
      "Natural Language :: English",
    ]
    [project.urls]
    "Homepage" = "https://salsa.debian.org/debian/debmake"
    "Bug Reports" = "https://salsa.debian.org/debian/debmake/issues"
    "Source" = "https://salsa.debian.org/debian/debmake"
    [project.scripts]
    hello = "debhello.main:main"
    [tool.setuptools]
    package-dir = {"" = "src"}
    packages = ["debhello"]
    include-package-data = true

    MANIFEST.in (v=1.1) — for tar-ball. 

     $ cat debhello-1.1/MANIFEST.in
    include data/*
    include manpages/*

    src/debhello/__init__.py (v=1.1). 

     $ cat debhello-1.1/src/debhello/__init__.py
    """
    debhello program (CLI)
    """

    src/debhello/main.py (v=1.1) — command entry point. 

     $ cat debhello-1.1/src/debhello/main.py
    """
    debhello program
    """

    import sys

    __version__ = '1.1.0'

    def main():  # needed for console script
        print(' ========== Hello Python3 ==========')
        print('argv = {}'.format(sys.argv))
        print('version = {}'.format(debhello.__version__))
        return

    if __name__ == "__main__":
        sys.exit(main())

    Let’s package this with the debmake command. Here, the -b':py3'
    option is used to specify the generated binary package containing
    Python3 script and module files.

     $ cd /path/to/debhello-1.1
     $ debmake -b':py3' -x1
    I: set parameters
     ...
    I: sanity check of parameters
    I: pkg="debhello", ver="1.1", rev="1"
    I: *** start packaging in "debhello-1.1". ***
    I: provide debhello_1.1.orig.tar.gz for non-native Debian package
    I: pwd = "/path/to"
    I: $ ln -sf debhello-1.1.tar.gz debhello_1.1.orig.tar.gz
    I: pwd = "/path/to/debhello-1.1"
    I: parse binary package settings: :py3
    I: binary package=debhello Type=python3 / Arch=all M-A=foreign
    I: analyze the source tree
    W: setuptools build system.
    I: build_type = Python (pyproject.toml: PEP-518, PEP-621, PEP-660)
    I: scan source for copyright+license text and file extensions
     ...

    Let’s inspect the notable template files generated.

    debian/rules (шаблонный файл, v=1.1): 

     $ cd /path/to/debhello-1.1
     $ cat debian/rules
    #!/usr/bin/make -f
    # You must remove unused comment lines for the released package.
    #export DH_VERBOSE = 1

    %:
            dh $@ --with python3 --buildsystem=pybuild

    По сути, это стандартный файл debian/rules, использующий команду 
    dh.

    The use of the «--with python3» option invokes dh_python3 to
    calculate Python dependencies, add maintainer scripts to byte
    compiled files, etc. See dh_python3(1).

    The use of the «--buildsystem=pybuild» option invokes various
    build systems for requested Python versions in order to build
    modules and extensions. See pybuild(1).

    debian/control (шаблонный файл, v=1.1): 

     $ cat debian/control
    Source: debhello
    Section: unknown
    Priority: optional
    Maintainer: "Osamu Aoki" <osamu@debian.org>
    Build-Depends: debhelper-compat (= 13),
                   dh-python,
                   pybuild-plugin-pyproject,
                   python3-all,
                   python3-setuptools
    Standards-Version: 4.6.2
    Homepage: <insert the upstream URL, if relevant>
    Rules-Requires-Root: no
    #Vcs-Git: https://salsa.debian.org/debian/debhello.git
    #Vcs-Browser: https://salsa.debian.org/debian/debhello
    #X-Python3-Version: >= 3.7

    Package: debhello
    Architecture: all
    Multi-Arch: foreign
    Depends: ${misc:Depends}, ${python3:Depends}
    Description: auto-generated package by debmake
     This Debian binary package was auto-generated by the
     debmake(1) command provided by the debmake package.

    Since this is the Python3 package, the debmake command sets «
    Architecture: all» and «Multi-Arch: foreign». Also, it sets
    required substvar parameters as «Depends: ${python3:Depends}, $
    {misc:Depends}». These are explained in «Глава 6, Basics for
    packaging».

    Сделаем этот пакет Debian лучше.

    debian/rules (версия сопровождающего, v=1.1): 

     $ cd /path/to/debhello-1.1
     $ vim debian/rules
     ... hack, hack, hack, ...
     $ cat debian/rules
    #!/usr/bin/make -f
    export PYBUILD_NAME=debhello
    export PYBUILD_VERBOSE=1
    export DH_VERBOSE=1

    %:
            dh $@ --with python3 --buildsystem=pybuild

    debian/control (версия сопровождающего, v=1.1): 

     $ vim debian/control
     ... hack, hack, hack, ...
     $ cat debian/control
    Source: debhello
    Section: devel
    Priority: optional
    Maintainer: Osamu Aoki <osamu@debian.org>
    Build-Depends: debhelper-compat (= 13),
                   pybuild-plugin-pyproject,
                   python3-all
    Standards-Version: 4.6.2
    Rules-Requires-Root: no
    Vcs-Browser: https://salsa.debian.org/debian/debmake-doc
    Vcs-Git: https://salsa.debian.org/debian/debmake-doc.git
    Homepage: https://salsa.debian.org/debian/debmake-doc

    Package: debhello
    Architecture: all
    Depends: ${misc:Depends}, ${python3:Depends}
    Description: Simple packaging example for debmake
     This is an example package to demonstrate Debian packaging using
     the debmake command.
     .
     The generated Debian package uses the dh command offered by the
     debhelper package and the dpkg source format `3.0 (quilt)'.

    В каталоге debian/ имеются и другие шаблонные файлы. Их также
    следует обновить.

    This debhello command comes with the upstream-provided manpage
    and desktop file but the upstream pyproject.toml doesn’t install
    them. So you need to update debian/install and debian/manpages as
    follows:

    debian/install (maintainer version, v=1.1): 

     $ vim debian/copyright
     ... hack, hack, hack, ...
     $ cat debian/copyright
    Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
    Upstream-Name: debhello
    Upstream-Contact: Osamu Aoki <osamu@debian.org>
    Source: https://salsa.debian.org/debian/debmake-doc

    Files:     *
    Copyright: 2015-2024 Osamu Aoki <osamu@debian.org>
    License:   Expat
     Permission is hereby granted, free of charge, to any person obtaining a
     copy of this software and associated documentation files (the "Software"),
     to deal in the Software without restriction, including without limitation
     the rights to use, copy, modify, merge, publish, distribute, sublicense,
     and/or sell copies of the Software, and to permit persons to whom the
     Software is furnished to do so, subject to the following conditions:
     .
     The above copyright notice and this permission notice shall be included
     in all copies or substantial portions of the Software.
     .
     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
     IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
     CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

    debian/manpages (maintainer version, v=1.1): 

     $ vim debian/install
     ... hack, hack, hack, ...
     $ cat debian/install
    data/hello.desktop usr/share/applications
    data/hello.png usr/share/pixmaps

    The rest of the packaging activities are practically the same as
    the ones in «Раздел 13.3, «Makefile (командная оболочка,
    интерфейс командной оболочки)»».

    Шаблонные файл в каталоге debian/. (v=1.1): 

     $ rm -f debian/clean debian/dirs debian/links
     $ rm -f debian/README.source debian/source/*.ex
     $ rm -rf debian/patches
     $ tree -F debian
    debian/
    ├── README.Debian
    ├── changelog
    ├── control
    ├── copyright
    ├── gbp.conf
    ├── install
    ├── manpages
    ├── rules*
    ├── salsa-ci.yml
    ├── source/
    │   └── format
    ├── tests/
    │   └── control
    ├── upstream/
    │   └── metadata
    └── watch

    4 directories, 13 files

    Here is the generated dependency list of debhello_1.1-1_all.deb.

    The generated dependency list of debhello_1.1-1_all.deb: 

     $ dpkg -f debhello_1.1-1_all.deb pre-depends \
                depends recommends conflicts breaks
    Depends: python3:any

13.5. Makefile (командная оболочка, графический интерфейс
пользователя)

    Ниже приводится пример создания простого пакета Debian из
    программы с графическим интерфейсом пользователя, написанной для
    командной оболочки POSIX и использующей в качестве системы сборки
    Makefile.

    This upstream is based on «Раздел 13.3, «Makefile (командная
    оболочка, интерфейс командной оболочки)»» with enhanced GUI
    support.

    Допустим, tar-архив основной ветки имеет имя debhello-1.2.tar.gz.

    Получитм исходный код и создадим пакет Debian.

    Загрузим debhello-1.2.tar.gz. 

     $ wget http://www.example.org/download/debhello-1.2.tar.gz
     ...
     $ tar -xzmf debhello-1.2.tar.gz
     $ tree
    .
    ├── debhello-1.2
    │   ├── Makefile
    │   ├── README.md
    │   ├── data
    │   │   ├── hello.desktop
    │   │   └── hello.png
    │   ├── man
    │   │   └── hello.1
    │   └── scripts
    │       └── hello
    └── debhello-1.2.tar.gz

    5 directories, 7 files

    Итак, сценарий hello был переписан таким образом, чтобы для
    создания графического интерфейса пользователя на основе GTK+
    использовалась команда zenity.

    hello (v=1.2). 

     $ cat debhello-1.2/scripts/hello
    #!/bin/sh -e
    zenity --info --title "hello" --text "Hello from the shell!"

    Файл desktop должен быть обновлён и должен содержать строку 
    Terminal=false, поскольку эта программа имеет графический
    интерфейс.

    hello.desktop (v=1.2). 

     $ cat debhello-1.2/data/hello.desktop
    [Desktop Entry]
    Name=Hello
    Name[fr]=Bonjour
    Comment=Greetings
    Comment[fr]=Salutations
    Type=Application
    Keywords=hello
    Exec=hello
    Terminal=false
    Icon=hello.png
    Categories=Utility;

    All other files are the same as in «Раздел 13.3, «Makefile
    (командная оболочка, интерфейс командной оболочки)»».

    Let’s package this with the debmake command. Here, the «-b':sh'»
    option is used to specify that the generated binary package is a
    shell script.

     $ cd /path/to/debhello-1.2
     $ debmake -b':sh' -x1
    I: set parameters
     ...
    I: sanity check of parameters
    I: pkg="debhello", ver="1.2", rev="1"
    I: *** start packaging in "debhello-1.2". ***
    I: provide debhello_1.2.orig.tar.gz for non-native Debian package
    I: pwd = "/path/to"
    I: $ ln -sf debhello-1.2.tar.gz debhello_1.2.orig.tar.gz
    I: pwd = "/path/to/debhello-1.2"
    I: parse binary package settings: :sh
    I: binary package=debhello Type=script / Arch=all M-A=foreign
    I: analyze the source tree
    I: build_type = make
    I: scan source for copyright+license text and file extensions
    I:  25 %, ext = md
     ...

    Let’s inspect the notable template files generated.

    debian/control (шаблонный файл, v=1.2): 

     $ cat debian/control
    Source: debhello
    Section: unknown
    Priority: optional
    Maintainer: "Osamu Aoki" <osamu@debian.org>
    Build-Depends: debhelper-compat (= 13)
    Standards-Version: 4.6.2
    Homepage: <insert the upstream URL, if relevant>
    Rules-Requires-Root: no
    #Vcs-Git: https://salsa.debian.org/debian/debhello.git
    #Vcs-Browser: https://salsa.debian.org/debian/debhello

    Package: debhello
    Architecture: all
    Multi-Arch: foreign
    Depends: ${misc:Depends}
    Description: auto-generated package by debmake
     This Debian binary package was auto-generated by the
     debmake(1) command provided by the debmake package.

    Сделаем этот пакет Debian лучше.

    debian/control (версия сопровождающего, v=1.2): 

     $ vim debian/control
     ... hack, hack, hack, ...
     $ cat debian/control
    Source: debhello
    Section: devel
    Priority: optional
    Maintainer: Osamu Aoki <osamu@debian.org>
    Build-Depends: debhelper-compat (= 13)
    Standards-Version: 4.6.2
    Homepage: https://salsa.debian.org/debian/debmake-doc
    Rules-Requires-Root: no

    Package: debhello
    Architecture: all
    Multi-Arch: foreign
    Depends: zenity, ${misc:Depends}
    Description: Simple packaging example for debmake
     This Debian binary package is an example package.
     (This is an example only)

    Please note the manually added zenity dependency.

    Файл debian/rules полностью совпадает с тем же файлом из «
    Раздел 13.3, «Makefile (командная оболочка, интерфейс командной
    оболочки)»».

    В каталоге debian/ имеются и другие шаблонные файлы. Их также
    следует обновить.

    Шаблонные файлы в каталоге debian/. (v=1.2): 

     $ rm -f debian/clean debian/dirs debian/install debian/links
     $ rm -f debian/README.source debian/source/*.ex
     $ rm -rf debian/patches
     $ tree -F debian
    debian/
    ├── README.Debian
    ├── changelog
    ├── control
    ├── copyright
    ├── gbp.conf
    ├── rules*
    ├── salsa-ci.yml
    ├── source/
    │   └── format
    ├── tests/
    │   └── control
    ├── upstream/
    │   └── metadata
    └── watch

    4 directories, 11 files

    The rest of the packaging activities are practically the same as
    in «Раздел 13.3, «Makefile (командная оболочка, интерфейс
    командной оболочки)»».

    Here is the generated dependency list of debhello_1.2-1_all.deb.

    The generated dependency list of debhello_1.2-1_all.deb: 

     $ dpkg -f debhello_1.2-1_all.deb pre-depends \
                depends recommends conflicts breaks
    Depends: zenity

13.6. pyproject.toml (Python3, GUI)

    Here is an example of creating a simple Debian package from a
    Python3 GUI program using pyproject.toml.

    Допустим tar-архив основной ветки имеет имя debhello-1.3.tar.gz.

    Получитм исходный код и создадим пакет Debian.

    Загрузим debhello-1.3.tar.gz. 

     $ wget http://www.example.org/download/debhello-1.3.tar.gz
     ...
     $ tar -xzmf debhello-1.3.tar.gz
     $ tree
    .
    ├── debhello-1.3
    │   ├── LICENSE
    │   ├── MANIFEST.in
    │   ├── README.md
    │   ├── data
    │   │   ├── hello.desktop
    │   │   └── hello.png
    │   ├── manpages
    │   │   └── hello.1
    │   ├── pyproject.toml
    │   └── src
    │       └── debhello
    │           ├── __init__.py
    │           └── main.py
    └── debhello-1.3.tar.gz

    6 directories, 10 files

    Here, the content of this debhello source tree as follows.

    pyproject.toml (v=1.3) — PEP 517 configuration. 

     $ cat debhello-1.3/pyproject.toml
    [build-system]
    requires = ["setuptools >= 61.0"]  # REQUIRED if [build-system] table is used...
    build-backend = "setuptools.build_meta"  # If not defined, then legacy behavi...

    [project]
    name = "debhello"
    version = "1.3.0"
    description = "Hello Python (GUI)"
    readme = {file = "README.md", content-type = "text/markdown"}
    requires-python = ">=3.12"
    license = {file = "LICENSE.txt"}
    keywords = ["debhello"]
    authors = [
      {name = "Osamu Aoki", email = "osamu@debian.org" },
    ]
    maintainers = [
      {name = "Osamu Aoki", email = "osamu@debian.org" },
    ]
    classifiers = [
      "Development Status :: 5 - Production/Stable",
      "Intended Audience :: Developers",
            "Topic :: System :: Archiving :: Packaging",
      "License :: OSI Approved :: MIT License",
      "Programming Language :: Python :: 3",
      "Programming Language :: Python :: 3.12",
      "Programming Language :: Python :: 3 :: Only",
      # Others
      "Operating System :: POSIX :: Linux",
      "Natural Language :: English",
    ]
    [project.urls]
    "Homepage" = "https://salsa.debian.org/debian/debmake"
    "Bug Reports" = "https://salsa.debian.org/debian/debmake/issues"
    "Source" = "https://salsa.debian.org/debian/debmake"
    [project.scripts]
    hello = "debhello.main:main"
    [tool.setuptools]
    package-dir = {"" = "src"}
    packages = ["debhello"]
    include-package-data = true

    MANIFEST.in (v=1.3) — for tar-ball. 

     $ cat debhello-1.3/MANIFEST.in
    include data/*
    include manpages/*

    src/debhello/__init__.py (v=1.3). 

     $ cat debhello-1.3/src/debhello/__init__.py
    """
    debhello program (GUI)
    """

    src/debhello/main.py (v=1.3) — command entry point. 

     $ cat debhello-1.3/src/debhello/main.py
    #!/usr/bin/python3
    from gi.repository import Gtk

    __version__ = '1.3.0'

    class TopWindow(Gtk.Window):

        def __init__(self):
            Gtk.Window.__init__(self)
            self.title = "Hello World!"
            self.counter = 0
            self.border_width = 10
            self.set_default_size(400, 100)
            self.set_position(Gtk.WindowPosition.CENTER)
            self.button = Gtk.Button(label="Click me!")
            self.button.connect("clicked", self.on_button_clicked)
            self.add(self.button)
            self.connect("delete-event", self.on_window_destroy)

        def on_window_destroy(self, *args):
            Gtk.main_quit(*args)

        def on_button_clicked(self, widget):
            self.counter += 1
            widget.set_label("Hello, World!\nClick count = %i" % self.counter)

    def main():
        window = TopWindow()
        window.show_all()
        Gtk.main()

    if __name__ == '__main__':
        main()

    Let’s package this with the debmake command. Here, the -b':py3'
    option is used to specify that the generated binary package
    contains Python3 script and module files.

     $ cd /path/to/debhello-1.3
     $ debmake -b':py3' -x1
    I: set parameters
     ...
    I: sanity check of parameters
    I: pkg="debhello", ver="1.3", rev="1"
    I: *** start packaging in "debhello-1.3". ***
    I: provide debhello_1.3.orig.tar.gz for non-native Debian package
    I: pwd = "/path/to"
    I: $ ln -sf debhello-1.3.tar.gz debhello_1.3.orig.tar.gz
    I: pwd = "/path/to/debhello-1.3"
    I: parse binary package settings: :py3
    I: binary package=debhello Type=python3 / Arch=all M-A=foreign
    I: analyze the source tree
    W: setuptools build system.
    I: build_type = Python (pyproject.toml: PEP-518, PEP-621, PEP-660)
    I: scan source for copyright+license text and file extensions
     ...

    The result is practically the same as in «Раздел 13.4,
    «pyproject.toml (Python3, CLI)»».

    Сделаем этот пакет Debian лучше.

    debian/rules (версия сопровождающего, v=1.3): 

     $ cd /path/to/debhello-1.3
     $ vim debian/rules
     ... hack, hack, hack, ...
     $ cat debian/rules
    #!/usr/bin/make -f
    export PYBUILD_NAME=debhello
    export PYBUILD_VERBOSE=1
    export DH_VERBOSE=1

    %:
            dh $@ --with python3 --buildsystem=pybuild

    debian/control (версия сопровождающего, v=1.3): 

     $ vim debian/control
     ... hack, hack, hack, ...
     $ cat debian/control
    Source: debhello
    Section: devel
    Priority: optional
    Maintainer: Osamu Aoki <osamu@debian.org>
    Build-Depends: debhelper-compat (= 13),
                   pybuild-plugin-pyproject,
                   python3-all
    Standards-Version: 4.6.2
    Homepage: https://salsa.debian.org/debian/debmake-doc
    Rules-Requires-Root: no

    Package: debhello
    Architecture: all
    Multi-Arch: foreign
    Depends: gir1.2-gtk-3.0, python3-gi, ${misc:Depends}, ${python3:Depends}
    Description: Simple packaging example for debmake
     This Debian binary package is an example package.
     (This is an example only)

    Please note the manually added python3-gi and gir1.2-gtk-3.0
    dependencies.

    The rest of the packaging activities are practically the same as
    in <pyproject>>.

    Here is the generated dependency list of debhello_1.3-1_all.deb.

    The generated dependency list of debhello_1.3-1_all.deb: 

     $ dpkg -f debhello_1.3-1_all.deb pre-depends \
                depends recommends conflicts breaks
    Depends: gir1.2-gtk-3.0, python3-gi, python3:any

13.7. Makefile (single-binary package)

    Here is an example of creating a simple Debian package from a
    simple C source program using the Makefile as its build system.

    Это — пример улучшенного исходного кода основной ветки из «
    Глава 5, Simple packaging». Он содержит страницу руководства,
    файл desktop, а также иконку рабочего стола. Кроме того, чтобы
    этот пример имел большую практическую ценность, исходный
    кодкомпануется с внешней библиотекой libm.

    Допустим tar-архив основной ветки имеет имя debhello-1.4.tar.gz.

    Предполагается, что этот тип исходного кода будет установлен как
    несистемный файл:

     $ tar -xzmf debhello-1.4.tar.gz
     $ cd debhello-1.4
     $ make
     $ make install

    Debian packaging requires changing this «make install» process to
    install files into the target system image location instead of
    the normal location under /usr/local.

    Получитм исходный код и создадим пакет Debian.

    Загрузим debhello-1.4.tar.gz. 

     $ wget http://www.example.org/download/debhello-1.4.tar.gz
     ...
     $ tar -xzmf debhello-1.4.tar.gz
     $ tree
    .
    ├── debhello-1.4
    │   ├── LICENSE
    │   ├── Makefile
    │   ├── README.md
    │   ├── data
    │   │   ├── hello.desktop
    │   │   └── hello.png
    │   ├── man
    │   │   └── hello.1
    │   └── src
    │       ├── config.h
    │       └── hello.c
    └── debhello-1.4.tar.gz

    5 directories, 9 files

    Ниже приводится содержимое этого архива с исходным кодом.

    src/hello.c (v=1.4): 

     $ cat debhello-1.4/src/hello.c
    #include "config.h"
    #include <math.h>
    #include <stdio.h>
    int
    main()
    {
            printf("Hello, I am " PACKAGE_AUTHOR "!\n");
            printf("4.0 * atan(1.0) = %10f8\n", 4.0*atan(1.0));
            return 0;
    }

    src/config.h (v=1.4): 

     $ cat debhello-1.4/Makefile
    prefix = /usr/local

    all: src/hello

    src/hello: src/hello.c
            $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $^ -lm

    install: src/hello
            install -D src/hello \
                    $(DESTDIR)$(prefix)/bin/hello
            install -m 644 -D data/hello.desktop \
                    $(DESTDIR)$(prefix)/share/applications/hello.desktop
            install -m 644 -D data/hello.png \
                    $(DESTDIR)$(prefix)/share/pixmaps/hello.png
            install -m 644 -D man/hello.1 \
                    $(DESTDIR)$(prefix)/share/man/man1/hello.1

    clean:
            -rm -f src/hello

    distclean: clean

    uninstall:
            -rm -f $(DESTDIR)$(prefix)/bin/hello
            -rm -f $(DESTDIR)$(prefix)/share/applications/hello.desktop
            -rm -f $(DESTDIR)$(prefix)/share/pixmaps/hello.png
            -rm -f $(DESTDIR)$(prefix)/share/man/man1/hello.1

    .PHONY: all install clean distclean uninstall

    Makefile (v=1.4): 
   
     $ cat debhello-1.4/src/config.h
    #define PACKAGE_AUTHOR "Osamu Aoki"

    Заметьте, что этот файл Makefile имеет соответствующую цель 
    install для страницы руководства, файла desktop и иконки рабочего
    стола.

    Создадим пакет из этого исходного кода с помощью команды debmake.

     $ cd /path/to/debhello-1.4
     $ debmake -x1
    I: set parameters
     ...
    I: sanity check of parameters
    I: pkg="debhello", ver="1.4", rev="1"
    I: *** start packaging in "debhello-1.4". ***
    I: provide debhello_1.4.orig.tar.gz for non-native Debian package
    I: pwd = "/path/to"
    I: $ ln -sf debhello-1.4.tar.gz debhello_1.4.orig.tar.gz
    I: pwd = "/path/to/debhello-1.4"
    I: parse binary package settings:
    I: binary package=debhello Type=bin / Arch=any M-A=foreign
    I: analyze the source tree
    I: build_type = make
    I: scan source for copyright+license text and file extensions
    I:  33 %, ext = c
     ...

    The result is practically the same as in «Раздел 5.6, «Step 2:
    Generate template files with debmake»».

    Let’s make this Debian package, which is practically the same as
    in «Раздел 5.7, «Шаг 3: изменение шаблонных файлов»», better as
    the maintainer.

    If the DEB_BUILD_MAINT_OPTIONS environment variable is not
    exported in debian/rules, lintian warns «W: debhello:
    hardening-no-relro usr/bin/hello» for the linking of libm.

    The debian/control file makes it exactly the same as the one in «
    Раздел 5.7, «Шаг 3: изменение шаблонных файлов»», since the libm
    library is always available as a part of libc6 (Priority:
    required).

    В каталоге debian/ имеются и другие шаблонные файлы. Их также
    следует обновить.

    Шаблонные файлы в каталоге debian/. (v=1.4): 

     $ rm -f debian/clean debian/dirs debian/links
     $ rm -f debian/README.source debian/source/*.ex
     $ rm -rf debian/patches
     $ tree -F debian
    debian/
    ├── README.Debian
    ├── changelog
    ├── control
    ├── copyright
    ├── gbp.conf
    ├── install
    ├── rules*
    ├── salsa-ci.yml
    ├── source/
    │   └── format
    ├── tests/
    │   └── control
    ├── upstream/
    │   └── metadata
    └── watch

    4 directories, 12 files

    Остальные работы по подготовке пакета практически полностью
    совпадают с описанными в «Раздел 5.8, «Step 4: Building package
    with debuild»».

    Here is the generated dependency list of all binary packages.

    The generated dependency list of all binary packages (v=1.4): 

     $ dpkg -f debhello-dbgsym_1.4-1_amd64.deb pre-depends \
                depends recommends conflicts breaks
    Depends: debhello (= 1.4-1)
     $ dpkg -f debhello_1.4-1_amd64.deb pre-depends \
                depends recommends conflicts breaks
    Depends: libc6 (>= 2.34)

13.8. Makefile.in + configure (single-binary package)

    Here is an example of creating a simple Debian package from a
    simple C source program using Makefile.in and configure as its
    build system.

    This is an enhanced upstream source example for «Раздел 13.7,
    «Makefile (single-binary package)»». This also links to an
    external library, libm, and this source is configurable using
    arguments to the configure script, which generates the Makefile
    and src/config.h files.

    Допустим tar-архив основной ветки имеет имя debhello-1.5.tar.gz.

    Этот тип исходного кода предполагает установку в виде
    несистемного файла, например, как

     $ tar -xzmf debhello-1.5.tar.gz
     $ cd debhello-1.5
     $ ./configure --with-math
     $ make
     $ make install

    Получитм исходный код и создадим пакет Debian.

    Загрузим debhello-1.5.tar.gz. 

     $ wget http://www.example.org/download/debhello-1.5.tar.gz
     ...
     $ tar -xzmf debhello-1.5.tar.gz
     $ tree
    .
    ├── debhello-1.5
    │   ├── LICENSE
    │   ├── Makefile.in
    │   ├── README.md
    │   ├── configure
    │   ├── data
    │   │   ├── hello.desktop
    │   │   └── hello.png
    │   ├── man
    │   │   └── hello.1
    │   └── src
    │       └── hello.c
    └── debhello-1.5.tar.gz

    5 directories, 9 files

    Ниже приводится содержимое этого архива с исходным кодом.

    src/hello.c (v=1.5): 

     $ cat debhello-1.5/src/hello.c
    #include "config.h"
    #ifdef WITH_MATH
    #  include <math.h>
    #endif
    #include <stdio.h>
    int
    main()
    {
            printf("Hello, I am " PACKAGE_AUTHOR "!\n");
    #ifdef WITH_MATH
            printf("4.0 * atan(1.0) = %10f8\n", 4.0*atan(1.0));
    #else
            printf("I can't do MATH!\n");
    #endif
            return 0;
    }

    Makefile.in (v=1.5): 

     $ cat debhello-1.5/Makefile.in
    prefix = @prefix@

    all: src/hello

    src/hello: src/hello.c
            $(CC) @VERBOSE@ \
                    $(CPPFLAGS) \
                    $(CFLAGS) \
                    $(LDFLAGS) \
                    -o $@ $^ \
                    @LINKLIB@

    install: src/hello
            install -D src/hello \
                    $(DESTDIR)$(prefix)/bin/hello
            install -m 644 -D data/hello.desktop \
                    $(DESTDIR)$(prefix)/share/applications/hello.desktop
            install -m 644 -D data/hello.png \
                    $(DESTDIR)$(prefix)/share/pixmaps/hello.png
            install -m 644 -D man/hello.1 \
                    $(DESTDIR)$(prefix)/share/man/man1/hello.1

    clean:
            -rm -f src/hello

    distclean: clean

    uninstall:
            -rm -f $(DESTDIR)$(prefix)/bin/hello
            -rm -f $(DESTDIR)$(prefix)/share/applications/hello.desktop
            -rm -f $(DESTDIR)$(prefix)/share/pixmaps/hello.png
            -rm -f $(DESTDIR)$(prefix)/share/man/man1/hello.1

    .PHONY: all install clean distclean uninstall

    configure (v=1.5): 

     $ cat debhello-1.5/configure
    #!/bin/sh -e
    # default values
    PREFIX="/usr/local"
    VERBOSE=""
    WITH_MATH="0"
    LINKLIB=""
    PACKAGE_AUTHOR="John Doe"

    # parse arguments
    while [ "${1}" != "" ]; do
      VAR="${1%=*}" # Drop suffix =*
      VAL="${1#*=}" # Drop prefix *=
      case "${VAR}" in
      --prefix)
        PREFIX="${VAL}"
        ;;
      --verbose|-v)
        VERBOSE="-v"
        ;;
      --with-math)
        WITH_MATH="1"
        LINKLIB="-lm"
        ;;
      --author)
        PACKAGE_AUTHOR="${VAL}"
        ;;
      *)
        echo "W: Unknown argument: ${1}"
      esac
      shift
    done

    # setup configured Makefile and src/config.h
    sed -e "s,@prefix@,${PREFIX}," \
        -e "s,@VERBOSE@,${VERBOSE}," \
        -e "s,@LINKLIB@,${LINKLIB}," \
        <Makefile.in >Makefile
    if [ "${WITH_MATH}" = 1 ]; then
    echo "#define WITH_MATH" >src/config.h
    else
    echo "/* not defined: WITH_MATH */" >src/config.h
    fi
    echo "#define PACKAGE_AUTHOR \"${PACKAGE_AUTHOR}\"" >>src/config.h

    Please note that the configure command replaces strings with @…​@
    in Makefile.in to produce Makefile and creates src/config.h.

    Создадим пакет из этого исходного кода с помощью команды debmake.

     $ cd /path/to/debhello-1.5
     $ debmake -x1
    I: set parameters
     ...
    I: sanity check of parameters
    I: pkg="debhello", ver="1.5", rev="1"
    I: *** start packaging in "debhello-1.5". ***
    I: provide debhello_1.5.orig.tar.gz for non-native Debian package
    I: pwd = "/path/to"
    I: $ ln -sf debhello-1.5.tar.gz debhello_1.5.orig.tar.gz
    I: pwd = "/path/to/debhello-1.5"
    I: parse binary package settings:
    I: binary package=debhello Type=bin / Arch=any M-A=foreign
    I: analyze the source tree
    I: build_type = configure
    I: scan source for copyright+license text and file extensions
    I:  17 %, ext = in
     ...

    Полученный результат похож на то, что описано в «Раздел 5.6,
    «Step 2: Generate template files with debmake»», но полностью они
    не совпадают.

    Let’s inspect the notable template files generated.

    debian/rules (шаблонный файл, v=1.5): 

     $ cd /path/to/debhello-1.5
     $ cat debian/rules
    #!/usr/bin/make -f
    # You must remove unused comment lines for the released package.
    #export DH_VERBOSE = 1
    #export DEB_BUILD_MAINT_OPTIONS = hardening=+all
    #export DEB_CFLAGS_MAINT_APPEND  = -Wall -pedantic
    #export DEB_LDFLAGS_MAINT_APPEND = -Wl,-O1

    %:
            dh $@

    Сделаем этот пакет Debian лучше.

    debian/rules (версия сопровождающего, v=1.5): 

     $ cd /path/to/debhello-1.5
     $ vim debian/rules
     ... hack, hack, hack, ...
     $ cat debian/rules
    #!/usr/bin/make -f
    export DH_VERBOSE = 1
    export DEB_BUILD_MAINT_OPTIONS = hardening=+all
    export DEB_CFLAGS_MAINT_APPEND  = -Wall -pedantic
    export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed

    %:
            dh $@

    override_dh_auto_configure:
            dh_auto_configure -- \
                    --with-math \
                    --author="Osamu Aoki"

    В каталоге debian/ имеются и другие шаблонные файлы. Их также
    следует обновить.

    Остальные работы по подготовке пакета практически полностью
    совпадают с описанными в «Раздел 5.8, «Step 4: Building package
    with debuild»».

13.9. Autotools (single-binary package)

    Here is an example of creating a simple Debian package from a
    simple C source program using Autotools = Autoconf and Automake (
    Makefile.am and configure.ac) as its build system.

    This source usually comes with the upstream auto-generated 
    Makefile.in and configure files, too. This source can be packaged
    using these files as in «Раздел 13.8, «Makefile.in + configure
    (single-binary package)»» with the help of the autotools-dev
    package.

    The better alternative is to regenerate these files using the
    latest Autoconf and Automake packages if the upstream provided 
    Makefile.am and configure.ac are compatible with the latest
    version. This is advantageous for porting to new CPU
    architectures, etc. This can be automated by using the «--with
    autoreconf» option for the dh command.

    Допустим tar-архив основной ветки имеет имя debhello-1.6.tar.gz.

    Этот тип исходного кода предполагает установку в виде
    несистемного файла, например, как

     $ tar -xzmf debhello-1.6.tar.gz
     $ cd debhello-1.6
     $ autoreconf -ivf # optional
     $ ./configure --with-math
     $ make
     $ make install

    Получитм исходный код и создадим пакет Debian.

    Загрузим debhello-1.6.tar.gz. 

     $ wget http://www.example.org/download/debhello-1.6.tar.gz
     ...
     $ tar -xzmf debhello-1.6.tar.gz
     $ tree
    .
    ├── debhello-1.6
    │   ├── LICENSE
    │   ├── Makefile.am
    │   ├── README.md
    │   ├── configure.ac
    │   ├── data
    │   │   ├── hello.desktop
    │   │   └── hello.png
    │   ├── man
    │   │   ├── Makefile.am
    │   │   └── hello.1
    │   └── src
    │       ├── Makefile.am
    │       └── hello.c
    └── debhello-1.6.tar.gz

    5 directories, 11 files

    Ниже приводится содержимое этого архива с исходным кодом.

    src/hello.c (v=1.6): 

     $ cat debhello-1.6/src/hello.c
    #include "config.h"
    #ifdef WITH_MATH
    #  include <math.h>
    #endif
    #include <stdio.h>
    int
    main()
    {
            printf("Hello, I am " PACKAGE_AUTHOR "!\n");
    #ifdef WITH_MATH
            printf("4.0 * atan(1.0) = %10f8\n", 4.0*atan(1.0));
    #else
            printf("I can't do MATH!\n");
    #endif
            return 0;
    }

    Makefile.am (v=1.6): 

     $ cat debhello-1.6/Makefile.am
    SUBDIRS = src man
     $ cat debhello-1.6/man/Makefile.am
    dist_man_MANS = hello.1
     $ cat debhello-1.6/src/Makefile.am
    bin_PROGRAMS = hello
    hello_SOURCES = hello.c

    configure.ac (v=1.6): 

     $ cat debhello-1.6/configure.ac
    #                                               -*- Autoconf -*-
    # Process this file with autoconf to produce a configure script.
    AC_PREREQ([2.69])
    AC_INIT([debhello],[2.1],[foo@example.org])
    AC_CONFIG_SRCDIR([src/hello.c])
    AC_CONFIG_HEADERS([config.h])
    echo "Standard customization chores"
    AC_CONFIG_AUX_DIR([build-aux])
    AM_INIT_AUTOMAKE([foreign])
    # Add #define PACKAGE_AUTHOR ... in config.h with a comment
    AC_DEFINE(PACKAGE_AUTHOR, ["Osamu Aoki"], [Define PACKAGE_AUTHOR])
    echo "Add --with-math option functionality to ./configure"
    AC_ARG_WITH([math],
      [AS_HELP_STRING([--with-math],
        [compile with math library  @<:@default=yes@:>@])],
      [],
      [with_math="yes"]
      )
    echo "==== withval   := \"$withval\""
    echo "==== with_math := \"$with_math\""
    # m4sh if-else construct
    AS_IF([test "x$with_math" != "xno"],[
      echo "==== Check include: math.h"
      AC_CHECK_HEADER(math.h,[],[
        AC_MSG_ERROR([Couldn't find math.h.] )
      ])
      echo "==== Check library: libm"
      AC_SEARCH_LIBS(atan, [m])
      #AC_CHECK_LIB(m, atan)
      echo "==== Build with LIBS := \"$LIBS\""
      AC_DEFINE(WITH_MATH, [1], [Build with the math library])
    ],[
      echo "==== Skip building with math.h."
      AH_TEMPLATE(WITH_MATH, [Build without the math library])
    ])
    # Checks for programs.
    AC_PROG_CC
    AC_CONFIG_FILES([Makefile
                     man/Makefile
                     src/Makefile])
    AC_OUTPUT

    Подсказка

    Without «foreign» strictness level specified in AM_INIT_AUTOMAKE
    () as above, automake defaults to «gnu» strictness level
    requiring several files in the top-level directory. See «3.2
    Strictness» in the automake document.

    Создадим пакет из этого исходного кода с помощью команды debmake.

     $ cd /path/to/debhello-1.6
     $ debmake -x1
    I: set parameters
     ...
    I: sanity check of parameters
    I: pkg="debhello", ver="1.6", rev="1"
    I: *** start packaging in "debhello-1.6". ***
    I: provide debhello_1.6.orig.tar.gz for non-native Debian package
    I: pwd = "/path/to"
    I: $ ln -sf debhello-1.6.tar.gz debhello_1.6.orig.tar.gz
    I: pwd = "/path/to/debhello-1.6"
    I: parse binary package settings:
    I: binary package=debhello Type=bin / Arch=any M-A=foreign
    I: analyze the source tree
    I: build_type = Autotools with autoreconf
    I: scan source for copyright+license text and file extensions
    I:  33 %, ext = am
     ...

    Получившийся результат похож на то, что было описано в «
    Раздел 13.8, «Makefile.in + configure (single-binary package)»»,
    но не совпадает с ним в точности.

    Let’s inspect the notable template files generated.

    debian/rules (шаблонный файл, v=1.6): 

     $ cd /path/to/debhello-1.6
     $ cat debian/rules
    #!/usr/bin/make -f
    # You must remove unused comment lines for the released package.
    #export DH_VERBOSE = 1
    #export DEB_BUILD_MAINT_OPTIONS = hardening=+all
    #export DEB_CFLAGS_MAINT_APPEND  = -Wall -pedantic
    #export DEB_LDFLAGS_MAINT_APPEND = -Wl,-O1

    %:
            dh $@ --with autoreconf

    #override_dh_install:
    #       dh_install --list-missing -X.la -X.pyc -X.pyo

    Сделаем этот пакет Debian лучше.

    debian/rules (версия сопровождающего, v=1.6): 

     $ cd /path/to/debhello-1.6
     $ vim debian/rules
     ... hack, hack, hack, ...
     $ cat debian/rules
    #!/usr/bin/make -f
    export DH_VERBOSE = 1
    export DEB_BUILD_MAINT_OPTIONS = hardening=+all
    export DEB_CFLAGS_MAINT_APPEND  = -Wall -pedantic
    export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed

    %:
            dh $@ --with autoreconf

    override_dh_auto_configure:
            dh_auto_configure -- \
                    --with-math

    В каталоге debian/ имеются и другие шаблонные файлы. Их также
    следует обновить.

    Остальные работы по подготовке пакета практически полностью
    совпадают с описанными в «Раздел 5.8, «Step 4: Building package
    with debuild»».

13.10. CMake (single-binary package)

    Here is an example of creating a simple Debian package from a
    simple C source program using CMake (CMakeLists.txt and some
    files such as config.h.in) as its build system.

    The cmake command generates the Makefile file based on the 
    CMakeLists.txt file and its -D option. It also configures the
    file as specified in its configure_file(…​) by replacing strings
    with @…​@ and changing the #cmakedefine …​ line.

    Допустим tar-архив основной ветки имеет имя debhello-1.7.tar.gz.

    Этот тип исходного кода предполагает установку в виде
    несистемного файла, например, как

     $ tar -xzmf debhello-1.7.tar.gz
     $ cd debhello-1.7
     $ mkdir obj-x86_64-linux-gnu # for out-of-tree build
     $ cd obj-x86_64-linux-gnu
     $ cmake ..
     $ make
     $ make install

    Получитм исходный код и создадим пакет Debian.

    Загрузим debhello-1.7.tar.gz. 

     $ wget http://www.example.org/download/debhello-1.7.tar.gz
     ...
     $ tar -xzmf debhello-1.7.tar.gz
     $ tree
    .
    ├── debhello-1.7
    │   ├── CMakeLists.txt
    │   ├── LICENSE
    │   ├── README.md
    │   ├── data
    │   │   ├── hello.desktop
    │   │   └── hello.png
    │   ├── man
    │   │   ├── CMakeLists.txt
    │   │   └── hello.1
    │   └── src
    │       ├── CMakeLists.txt
    │       ├── config.h.in
    │       └── hello.c
    └── debhello-1.7.tar.gz

    5 directories, 11 files

    Ниже приводится содержимое этого архива с исходным кодом.

    src/hello.c (v=1.7): 

     $ cat debhello-1.7/src/hello.c
    #include "config.h"
    #ifdef WITH_MATH
    #  include <math.h>
    #endif
    #include <stdio.h>
    int
    main()
    {
            printf("Hello, I am " PACKAGE_AUTHOR "!\n");
    #ifdef WITH_MATH
            printf("4.0 * atan(1.0) = %10f8\n", 4.0*atan(1.0));
    #else
            printf("I can't do MATH!\n");
    #endif
            return 0;
    }

    src/config.h.in (v=1.7): 

     $ cat debhello-1.7/src/config.h.in
    /* name of the package author */
    #define PACKAGE_AUTHOR "@PACKAGE_AUTHOR@"
    /* math library support */
    #cmakedefine WITH_MATH

    CMakeLists.txt (v=1.7): 

     $ cat debhello-1.7/CMakeLists.txt
    cmake_minimum_required(VERSION 2.8)
    project(debhello)
    set(PACKAGE_AUTHOR "Osamu Aoki")
    add_subdirectory(src)
    add_subdirectory(man)
     $ cat debhello-1.7/man/CMakeLists.txt
    install(
      FILES ${CMAKE_CURRENT_SOURCE_DIR}/hello.1
      DESTINATION share/man/man1
    )
     $ cat debhello-1.7/src/CMakeLists.txt
    # Always define HAVE_CONFIG_H
    add_definitions(-DHAVE_CONFIG_H)
    # Interactively define WITH_MATH
    option(WITH_MATH "Build with math support" OFF)
    #variable_watch(WITH_MATH)
    # Generate config.h from config.h.in
    configure_file(
      "${CMAKE_CURRENT_SOURCE_DIR}/config.h.in"
      "${CMAKE_CURRENT_BINARY_DIR}/config.h"
    )
    include_directories("${CMAKE_CURRENT_BINARY_DIR}")
    add_executable(hello hello.c)
    install(TARGETS hello
      RUNTIME DESTINATION bin
    )

    Создадим пакет из этого исходного кода с помощью команды debmake.

     $ cd /path/to/debhello-1.7
     $ debmake -x1
    I: set parameters
     ...
    I: sanity check of parameters
    I: pkg="debhello", ver="1.7", rev="1"
    I: *** start packaging in "debhello-1.7". ***
    I: provide debhello_1.7.orig.tar.gz for non-native Debian package
    I: pwd = "/path/to"
    I: $ ln -sf debhello-1.7.tar.gz debhello_1.7.orig.tar.gz
    I: pwd = "/path/to/debhello-1.7"
    I: parse binary package settings:
    I: binary package=debhello Type=bin / Arch=any M-A=foreign
    I: analyze the source tree
    I: build_type = Cmake
    I: scan source for copyright+license text and file extensions
    I:  33 %, ext = text
     ...

    Получившийся результат похож на то, что было описано в «
    Раздел 13.8, «Makefile.in + configure (single-binary package)»»,
    но не совпадает с ним в точности.

    Let’s inspect the notable template files generated.

    debian/rules (шаблонный файл, v=1.7): 

     $ cd /path/to/debhello-1.7
     $ cat debian/rules
    #!/usr/bin/make -f
    # You must remove unused comment lines for the released package.
    #export DH_VERBOSE = 1
    #export DEB_BUILD_MAINT_OPTIONS = hardening=+all
    #export DEB_CFLAGS_MAINT_APPEND  = -Wall -pedantic
    #export DEB_LDFLAGS_MAINT_APPEND = -Wl,-O1

    %:
            dh $@

    #override_dh_auto_configure:
    #       dh_auto_configure -- \
    #             -DCMAKE_LIBRARY_ARCHITECTURE="$(DEB_TARGET_MULTIARCH)"

    debian/control (шаблонный файл, v=1.7): 

     $ cat debian/control
    Source: debhello
    Section: unknown
    Priority: optional
    Maintainer: "Osamu Aoki" <osamu@debian.org>
    Build-Depends: cmake, debhelper-compat (= 13)
    Standards-Version: 4.6.2
    Homepage: <insert the upstream URL, if relevant>
    Rules-Requires-Root: no
    #Vcs-Git: https://salsa.debian.org/debian/debhello.git
    #Vcs-Browser: https://salsa.debian.org/debian/debhello

    Package: debhello
    Architecture: any
    Multi-Arch: foreign
    Depends: ${misc:Depends}, ${shlibs:Depends}
    Description: auto-generated package by debmake
     This Debian binary package was auto-generated by the
     debmake(1) command provided by the debmake package.

    Сделаем этот пакет Debian лучше.

    debian/rules (версия сопровождающего, v=1.7): 

     $ cd /path/to/debhello-1.7
     $ vim debian/rules
     ... hack, hack, hack, ...
     $ cat debian/rules
    #!/usr/bin/make -f
    export DH_VERBOSE = 1
    export DEB_BUILD_MAINT_OPTIONS = hardening=+all
    export DEB_CFLAGS_MAINT_APPEND  = -Wall -pedantic
    export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed

    %:
            dh $@

    override_dh_auto_configure:
            dh_auto_configure -- -DWITH-MATH=1

    debian/control (версия сопровждающего, v=1.7): 

     $ vim debian/control
     ... hack, hack, hack, ...
     $ cat debian/control
    Source: debhello
    Section: devel
    Priority: optional
    Maintainer: Osamu Aoki <osamu@debian.org>
    Build-Depends: cmake, debhelper-compat (= 13)
    Standards-Version: 4.6.2
    Homepage: https://salsa.debian.org/debian/debmake-doc
    Rules-Requires-Root: no

    Package: debhello
    Architecture: any
    Multi-Arch: foreign
    Depends: ${misc:Depends}, ${shlibs:Depends}
    Description: Simple packaging example for debmake
     This Debian binary package is an example package.
     (This is an example only)

    В каталоге debian/ имеются и другие шаблонные файлы. Их также
    следует обновить.

    Остальные работы по подготовке пакета практически полностью
    совпадают с описанными в «Раздел 13.8, «Makefile.in + configure
    (single-binary package)»».

13.11. Autotools (multi-binary package)

    Here is an example of creating a set of Debian binary packages
    including the executable package, the shared library package, the
    development file package, and the debug symbol package from a
    simple C source program using Autotools = Autoconf and Automake
    (which use Makefile.am and configure.ac as their input files) as
    its build system.

    Let’s package this in the same way as in «Раздел 13.9, «Autotools
    (single-binary package)»».

    Допустим tar-архив основной ветки имеет имя debhello-2.0.tar.gz.

    Этот тип исходного кода предполагает установку в виде
    несистемного файла, например, как

     $ tar -xzmf debhello-2.0.tar.gz
     $ cd debhello-2.0
     $ autoreconf -ivf # optional
     $ ./configure --with-math
     $ make
     $ make install

    Получитм исходный код и создадим пакет Debian.

    Загрузим debhello-2.0.tar.gz. 

     $ wget http://www.example.org/download/debhello-2.0.tar.gz
     ...
     $ tar -xzmf debhello-2.0.tar.gz
     $ tree
    .
    ├── debhello-2.0
    │   ├── LICENSE
    │   ├── Makefile.am
    │   ├── README.md
    │   ├── configure.ac
    │   ├── data
    │   │   ├── hello.desktop
    │   │   └── hello.png
    │   ├── lib
    │   │   ├── Makefile.am
    │   │   ├── sharedlib.c
    │   │   └── sharedlib.h
    │   ├── man
    │   │   ├── Makefile.am
    │   │   └── hello.1
    │   └── src
    │       ├── Makefile.am
    │       └── hello.c
    └── debhello-2.0.tar.gz

    6 directories, 14 files

    Ниже приводится содержимое этого архива с исходным кодом.

    src/hello.c (v=2.0): 

     $ cat debhello-2.0/src/hello.c
    #include "config.h"
    #include <stdio.h>
    #include <sharedlib.h>
    int
    main()
    {
            printf("Hello, I am " PACKAGE_AUTHOR "!\n");
            sharedlib();
            return 0;
    }

    lib/sharedlib.h и lib/sharedlib.c (v=1.6): 

     $ cat debhello-2.0/lib/sharedlib.h
    int sharedlib();
     $ cat debhello-2.0/lib/sharedlib.c
    #include <stdio.h>
    int
    sharedlib()
    {
            printf("This is a shared library!\n");
            return 0;
    }

    Makefile.am (v=2.0): 

     $ cat debhello-2.0/Makefile.am
    # recursively process `Makefile.am` in SUBDIRS
    SUBDIRS = lib src man
     $ cat debhello-2.0/man/Makefile.am
    # manpages (distributed in the source package)
    dist_man_MANS = hello.1
     $ cat debhello-2.0/lib/Makefile.am
    # libtool librares to be produced
    lib_LTLIBRARIES = libsharedlib.la

    # source files used for lib_LTLIBRARIES
    libsharedlib_la_SOURCES = sharedlib.c

    # C pre-processor flags used for lib_LTLIBRARIES
    #libsharedlib_la_CPPFLAGS =

    # Headers files to be installed in <prefix>/include
    include_HEADERS = sharedlib.h

    # Versioning Libtool Libraries with version triplets
    libsharedlib_la_LDFLAGS = -version-info 1:0:0
     $ cat debhello-2.0/src/Makefile.am
    # program executables to be produced
    bin_PROGRAMS = hello

    # source files used for bin_PROGRAMS
    hello_SOURCES = hello.c

    # C pre-processor flags used for bin_PROGRAMS
    AM_CPPFLAGS = -I$(srcdir) -I$(top_srcdir)/lib

    # Extra options for the linker for hello
    # hello_LDFLAGS =

    # Libraries the `hello` binary to be linked
    hello_LDADD = $(top_srcdir)/lib/libsharedlib.la

    configure.ac (v=2.0): 

     $ cat debhello-2.0/configure.ac
    #                                               -*- Autoconf -*-
    # Process this file with autoconf to produce a configure script.
    AC_PREREQ([2.69])
    AC_INIT([debhello],[2.2],[foo@example.org])
    AC_CONFIG_SRCDIR([src/hello.c])
    AC_CONFIG_HEADERS([config.h])
    echo "Standard customization chores"
    AC_CONFIG_AUX_DIR([build-aux])

    AM_INIT_AUTOMAKE([foreign])

    # Set default to --enable-shared --disable-static
    LT_INIT([shared disable-static])

    # find the libltdl sources in the libltdl sub-directory
    LT_CONFIG_LTDL_DIR([libltdl])

    # choose one
    LTDL_INIT([recursive])
    #LTDL_INIT([subproject])
    #LTDL_INIT([nonrecursive])

    # Add #define PACKAGE_AUTHOR ... in config.h with a comment
    AC_DEFINE(PACKAGE_AUTHOR, ["Osamu Aoki"], [Define PACKAGE_AUTHOR])
    # Checks for programs.
    AC_PROG_CC

    # only for the recursive case
    AC_CONFIG_FILES([Makefile
                     lib/Makefile
                     man/Makefile
                     src/Makefile])
    AC_OUTPUT

    Создадим пакет с помощью команды debmake в виде нескольких
    пакетов:

      * debhello: type = bin
      * libsharedlib1: type = lib
      * libsharedlib-dev: type = dev

    Here, the -b\',libsharedlib1,libsharedlib-dev' option is used to
    specify the generated binary packages.

     $ cd /path/to/debhello-2.0
     $ debmake -b',libsharedlib1,libsharedlib-dev' -x1
    I: set parameters
     ...
    I: sanity check of parameters
    I: pkg="debhello", ver="2.0", rev="1"
    I: *** start packaging in "debhello-2.0". ***
    I: provide debhello_2.0.orig.tar.gz for non-native Debian package
    I: pwd = "/path/to"
    I: $ ln -sf debhello-2.0.tar.gz debhello_2.0.orig.tar.gz
    I: pwd = "/path/to/debhello-2.0"
    I: parse binary package settings: ,libsharedlib1,libsharedlib-dev
    I: binary package=debhello Type=bin / Arch=any M-A=foreign
    I: binary package=libsharedlib1 Type=lib / Arch=any M-A=same
    I: binary package=libsharedlib-dev Type=dev / Arch=any M-A=same
    I: analyze the source tree
    I: build_type = Autotools with autoreconf
     ...

    Получившийся результат похож на то, что было описано в «
    Раздел 13.8, «Makefile.in + configure (single-binary package)»»,
    но имеет большее количество шаблонных файлов.

    Let’s inspect the notable template files generated.

    debian/rules (шаблонный файл, v=2.0): 

     $ cd /path/to/debhello-2.0
     $ cat debian/rules
    #!/usr/bin/make -f
    # You must remove unused comment lines for the released package.
    #export DH_VERBOSE = 1
    #export DEB_BUILD_MAINT_OPTIONS = hardening=+all
    #export DEB_CFLAGS_MAINT_APPEND  = -Wall -pedantic
    #export DEB_LDFLAGS_MAINT_APPEND = -Wl,-O1

    %:
            dh $@ --with autoreconf

    #override_dh_install:
    #       dh_install --list-missing -X.la -X.pyc -X.pyo

    Сделаем этот пакет Debian лучше.

    debian/rules (версия сопровождающего, v=2.0): 

     $ cd /path/to/debhello-2.0
     $ vim debian/rules
     ... hack, hack, hack, ...
     $ cat debian/rules
    #!/usr/bin/make -f
    export DH_VERBOSE = 1
    export DEB_BUILD_MAINT_OPTIONS = hardening=+all
    export DEB_CFLAGS_MAINT_APPEND  = -Wall -pedantic
    export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed

    %:
            dh $@ --with autoreconf

    override_dh_missing:
            dh_missing -X.la

    debian/control (версия сопровождающего, v=2.0): 

     $ vim debian/control
     ... hack, hack, hack, ...
     $ cat debian/control
    Source: debhello
    Section: devel
    Priority: optional
    Maintainer: Osamu Aoki <osamu@debian.org>
    Build-Depends: debhelper-compat (= 13), dh-autoreconf
    Standards-Version: 4.6.2
    Homepage: https://salsa.debian.org/debian/debmake-doc
    Rules-Requires-Root: no

    Package: debhello
    Architecture: any
    Multi-Arch: foreign
    Depends: libsharedlib1 (= ${binary:Version}),
             ${misc:Depends},
             ${shlibs:Depends}
    Description: Simple packaging example for debmake
     This package contains the compiled binary executable.
     .
     This Debian binary package is an example package.
     (This is an example only)

    Package: libsharedlib1
    Section: libs
    Architecture: any
    Multi-Arch: same
    Pre-Depends: ${misc:Pre-Depends}
    Depends: ${misc:Depends}, ${shlibs:Depends}
    Description: Simple packaging example for debmake
     This package contains the shared library.

    Package: libsharedlib-dev
    Section: libdevel
    Architecture: any
    Multi-Arch: same
    Depends: libsharedlib1 (= ${binary:Version}), ${misc:Depends}
    Description: Simple packaging example for debmake
     This package contains the development files.

    debian/*.install (версия сопровождающего, v=2.0): 

     $ vim debian/copyright
     ... hack, hack, hack, ...
     $ cat debian/copyright
    Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
    Upstream-Name: debhello
    Upstream-Contact: Osamu Aoki <osamu@debian.org>
    Source: https://salsa.debian.org/debian/debmake-doc

    Files:     *
    Copyright: 2015-2021 Osamu Aoki <osamu@debian.org>
    License:   Expat
     Permission is hereby granted, free of charge, to any person obtaining a
     copy of this software and associated documentation files (the "Software"),
     to deal in the Software without restriction, including without limitation
     the rights to use, copy, modify, merge, publish, distribute, sublicense,
     and/or sell copies of the Software, and to permit persons to whom the
     Software is furnished to do so, subject to the following conditions:
     .
     The above copyright notice and this permission notice shall be included
     in all copies or substantial portions of the Software.
     .
     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
     IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
     CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

    Since this upstream source creates the proper auto-generated 
    Makefile, there is no need to create debian/install and debian/
    manpages files.

    В каталоге debian/ имеются и другие шаблонные файлы. Их также
    следует обновить.

    Шабонные файлы в каталоге debian/. (v=2.0): 

     $ rm -f debian/clean debian/dirs debian/install debian/links
     $ rm -f debian/README.source debian/source/*.ex
     $ rm -rf debian/patches
     $ tree -F debian
    debian/
    ├── README.Debian
    ├── changelog
    ├── control
    ├── copyright
    ├── debhello.dirs
    ├── debhello.doc-base
    ├── debhello.docs
    ├── debhello.examples
    ├── debhello.info
    ├── debhello.install
    ├── debhello.links
    ├── debhello.manpages
    ├── gbp.conf
    ├── libsharedlib-dev.install
    ├── libsharedlib1.install
    ├── libsharedlib1.symbols
    ├── rules*
    ├── salsa-ci.yml
    ├── source/
    │   └── format
    ├── tests/
    │   └── control
    ├── upstream/
    │   └── metadata
    └── watch

    4 directories, 22 files

    Остальные работы по подготовке пакета практически полностью
    совпадают с описанными в «Раздел 13.8, «Makefile.in + configure
    (single-binary package)»».

    Here are the generated dependency list of all binary packages.

    The generated dependency list of all binary packages (v=2.0): 

     $ dpkg -f debhello-dbgsym_2.0-1_amd64.deb pre-depends \
                depends recommends conflicts breaks
    Depends: debhello (= 2.0-1)
     $ dpkg -f debhello_2.0-1_amd64.deb pre-depends \
                depends recommends conflicts breaks
    Depends: libsharedlib1 (= 2.0-1), libc6 (>= 2.34)
     $ dpkg -f libsharedlib-dev_2.0-1_amd64.deb pre-depends \
                depends recommends conflicts breaks
    Depends: libsharedlib1 (= 2.0-1)
     $ dpkg -f libsharedlib1-dbgsym_2.0-1_amd64.deb pre-depends \
                depends recommends conflicts breaks
    Depends: libsharedlib1 (= 2.0-1)
     $ dpkg -f libsharedlib1_2.0-1_amd64.deb pre-depends \
                depends recommends conflicts breaks
    Depends: libc6 (>= 2.2.5)

13.12. CMake (multi-binary package)

    Here is an example of creating a set of Debian binary packages
    including the executable package, the shared library package, the
    development file package, and the debug symbol package from a
    simple C source program using CMake (CMakeLists.txt and some
    files such as config.h.in) as its build system.

    Допустим tar-архив основной ветки имеет имя debhello-2.1.tar.gz.

    Этот тип исходного кода предполагает установку в виде
    несистемного файла, например, как

     $ tar -xzmf debhello-2.1.tar.gz
     $ cd debhello-2.1
     $ mkdir obj-x86_64-linux-gnu
     $ cd obj-x86_64-linux-gnu
     $ cmake ..
     $ make
     $ make install

    Получитм исходный код и создадим пакет Debian.

    Загрузим debhello-2.1.tar.gz. 

     $ wget http://www.example.org/download/debhello-2.1.tar.gz
     ...
     $ tar -xzmf debhello-2.1.tar.gz
     $ tree
    .
    ├── debhello-2.1
    │   ├── CMakeLists.txt
    │   ├── LICENSE
    │   ├── README.md
    │   ├── data
    │   │   ├── hello.desktop
    │   │   └── hello.png
    │   ├── lib
    │   │   ├── CMakeLists.txt
    │   │   ├── sharedlib.c
    │   │   └── sharedlib.h
    │   ├── man
    │   │   ├── CMakeLists.txt
    │   │   └── hello.1
    │   └── src
    │       ├── CMakeLists.txt
    │       ├── config.h.in
    │       └── hello.c
    └── debhello-2.1.tar.gz

    6 directories, 14 files

    Ниже приводится содержимое этого архива с исходным кодом.

    src/hello.c (v=2.1): 

     $ cat debhello-2.1/src/hello.c
    #include "config.h"
    #include <stdio.h>
    #include <sharedlib.h>
    int
    main()
    {
            printf("Hello, I am " PACKAGE_AUTHOR "!\n");
            sharedlib();
            return 0;
    }

    src/config.h.in (v=2.1): 

     $ cat debhello-2.1/src/config.h.in
    /* name of the package author */
    #define PACKAGE_AUTHOR "@PACKAGE_AUTHOR@"

    lib/sharedlib.c и lib/sharedlib.h (v=2.1): 

     $ cat debhello-2.1/lib/sharedlib.h
    int sharedlib();
     $ cat debhello-2.1/lib/sharedlib.c
    #include <stdio.h>
    int
    sharedlib()
    {
            printf("This is a shared library!\n");
            return 0;
    }

    CMakeLists.txt (v=2.1): 

     $ cat debhello-2.1/CMakeLists.txt
    cmake_minimum_required(VERSION 2.8)
    project(debhello)
    set(PACKAGE_AUTHOR "Osamu Aoki")
    add_subdirectory(lib)
    add_subdirectory(src)
    add_subdirectory(man)
     $ cat debhello-2.1/man/CMakeLists.txt
    install(
      FILES ${CMAKE_CURRENT_SOURCE_DIR}/hello.1
      DESTINATION share/man/man1
    )
     $ cat debhello-2.1/src/CMakeLists.txt
    # Always define HAVE_CONFIG_H
    add_definitions(-DHAVE_CONFIG_H)
    # Generate config.h from config.h.in
    configure_file(
      "${CMAKE_CURRENT_SOURCE_DIR}/config.h.in"
      "${CMAKE_CURRENT_BINARY_DIR}/config.h"
      )
    include_directories("${CMAKE_CURRENT_BINARY_DIR}")
    include_directories("${CMAKE_SOURCE_DIR}/lib")

    add_executable(hello hello.c)
    target_link_libraries(hello sharedlib)
    install(TARGETS hello
      RUNTIME DESTINATION bin
    )

    Создадим пакет из этого исходного кода с помощью команды debmake.

     $ cd /path/to/debhello-2.1
     $ debmake -b',libsharedlib1,libsharedlib-dev' -x1
    I: set parameters
     ...
    I: sanity check of parameters
    I: pkg="debhello", ver="2.1", rev="1"
    I: *** start packaging in "debhello-2.1". ***
    I: provide debhello_2.1.orig.tar.gz for non-native Debian package
    I: pwd = "/path/to"
    I: $ ln -sf debhello-2.1.tar.gz debhello_2.1.orig.tar.gz
    I: pwd = "/path/to/debhello-2.1"
    I: parse binary package settings: ,libsharedlib1,libsharedlib-dev
    I: binary package=debhello Type=bin / Arch=any M-A=foreign
    I: binary package=libsharedlib1 Type=lib / Arch=any M-A=same
    I: binary package=libsharedlib-dev Type=dev / Arch=any M-A=same
    I: analyze the source tree
    I: build_type = Cmake
     ...

    Получившийся результат похож на то, что было описано в «
    Раздел 13.8, «Makefile.in + configure (single-binary package)»»,
    но не совпадает с ним в точности.

    Let’s inspect the notable template files generated.

    debian/rules (шаблонный файл, v=2.1): 

     $ cd /path/to/debhello-2.1
     $ cat debian/rules
    #!/usr/bin/make -f
    # You must remove unused comment lines for the released package.
    #export DH_VERBOSE = 1
    #export DEB_BUILD_MAINT_OPTIONS = hardening=+all
    #export DEB_CFLAGS_MAINT_APPEND  = -Wall -pedantic
    #export DEB_LDFLAGS_MAINT_APPEND = -Wl,-O1

    %:
            dh $@

    #override_dh_auto_configure:
    #       dh_auto_configure -- \
    #             -DCMAKE_LIBRARY_ARCHITECTURE="$(DEB_TARGET_MULTIARCH)"

    Сделаем этот пакет Debian лучше.

    debian/rules (версия сопровождающего, v=2.1): 

     $ cd /path/to/debhello-2.1
     $ vim debian/rules
     ... hack, hack, hack, ...
     $ cat debian/rules
    #!/usr/bin/make -f
    export DH_VERBOSE = 1
    export DEB_BUILD_MAINT_OPTIONS = hardening=+all
    export DEB_CFLAGS_MAINT_APPEND  = -Wall -pedantic
    export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
    DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)

    %:
            dh $@

    override_dh_auto_configure:
            dh_auto_configure -- \
                  -DCMAKE_LIBRARY_ARCHITECTURE="$(DEB_HOST_MULTIARCH)"

    debian/control (версия сопровождающего, v=2.1): 

     $ vim debian/control
     ... hack, hack, hack, ...
     $ cat debian/control
    Source: debhello
    Section: devel
    Priority: optional
    Maintainer: Osamu Aoki <osamu@debian.org>
    Build-Depends: cmake, debhelper-compat (= 13)
    Standards-Version: 4.6.2
    Homepage: https://salsa.debian.org/debian/debmake-doc
    Rules-Requires-Root: no

    Package: debhello
    Architecture: any
    Multi-Arch: foreign
    Depends: libsharedlib1 (= ${binary:Version}),
             ${misc:Depends},
             ${shlibs:Depends}
    Description: Simple packaging example for debmake
     This package contains the compiled binary executable.
     .
     This Debian binary package is an example package.
     (This is an example only)

    Package: libsharedlib1
    Section: libs
    Architecture: any
    Multi-Arch: same
    Pre-Depends: ${misc:Pre-Depends}
    Depends: ${misc:Depends}, ${shlibs:Depends}
    Description: Simple packaging example for debmake
     This package contains the shared library.

    Package: libsharedlib-dev
    Section: libdevel
    Architecture: any
    Multi-Arch: same
    Depends: libsharedlib1 (= ${binary:Version}), ${misc:Depends}
    Description: Simple packaging example for debmake
     This package contains the development files.

    debian/*.install (версия сопровождающего, v=2.1): 

     $ vim debian/copyright
     ... hack, hack, hack, ...
     $ cat debian/copyright
    Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
    Upstream-Name: debhello
    Upstream-Contact: Osamu Aoki <osamu@debian.org>
    Source: https://salsa.debian.org/debian/debmake-doc

    Files:     *
    Copyright: 2015-2021 Osamu Aoki <osamu@debian.org>
    License:   Expat
     Permission is hereby granted, free of charge, to any person obtaining a
     copy of this software and associated documentation files (the "Software"),
     to deal in the Software without restriction, including without limitation
     the rights to use, copy, modify, merge, publish, distribute, sublicense,
     and/or sell copies of the Software, and to permit persons to whom the
     Software is furnished to do so, subject to the following conditions:
     .
     The above copyright notice and this permission notice shall be included
     in all copies or substantial portions of the Software.
     .
     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
     IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
     CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

    Файл CMakeList.txt из основной ветки необходимо изменить тк,
    чтобы в нём была обеспечена поддержка мультиархитектурных путей.

    debian/patches/* (версия сопровождающего, v=2.1): 

     ... hack, hack, hack, ...
     $ cat debian/libsharedlib1.symbols
    libsharedlib.so.1 libsharedlib1 #MINVER#
     sharedlib@Base 2.1

    Since this upstream source creates the proper auto-generated 
    Makefile, there is no need to create debian/install and debian/
    manpages files.

    В каталоге debian/ имеются и другие шаблонные файлы. Их также
    следует обновить.

    Шаблонные файлы в каталоге debian/. (v=2.1): 

     $ rm -f debian/clean debian/dirs debian/install debian/links
     $ rm -f debian/README.source debian/source/*.ex
     $ tree -F debian
    debian/
    ├── README.Debian
    ├── changelog
    ├── control
    ├── copyright
    ├── debhello.dirs
    ├── debhello.doc-base
    ├── debhello.docs
    ├── debhello.examples
    ├── debhello.info
    ├── debhello.install
    ├── debhello.links
    ├── debhello.manpages
    ├── gbp.conf
    ├── libsharedlib-dev.install
    ├── libsharedlib1.install
    ├── libsharedlib1.symbols
    ├── patches/
    │   ├── 000-cmake-multiarch.patch
    │   └── series
    ├── rules*
    ├── salsa-ci.yml
    ├── source/
    │   └── format
    ├── tests/
    │   └── control
    ├── upstream/
    │   └── metadata
    └── watch

    5 directories, 24 files

    Остальные работы по подготовке пакета практически полностью
    совпадают с описанными в «Раздел 13.8, «Makefile.in + configure
    (single-binary package)»».

    Here are the generated dependency list of all binary packages.

    The generated dependency list of all binary packages (v=2.1): 

     $ dpkg -f debhello-dbgsym_2.1-1_amd64.deb pre-depends \
                depends recommends conflicts breaks
    Depends: debhello (= 2.1-1)
     $ dpkg -f debhello_2.1-1_amd64.deb pre-depends \
                depends recommends conflicts breaks
    Depends: libsharedlib1 (= 2.1-1), libc6 (>= 2.34)
     $ dpkg -f libsharedlib-dev_2.1-1_amd64.deb pre-depends \
                depends recommends conflicts breaks
    Depends: libsharedlib1 (= 2.1-1)
     $ dpkg -f libsharedlib1-dbgsym_2.1-1_amd64.deb pre-depends \
                depends recommends conflicts breaks
    Depends: libsharedlib1 (= 2.1-1)
     $ dpkg -f libsharedlib1_2.1-1_amd64.deb pre-depends \
                depends recommends conflicts breaks
    Depends: libc6 (>= 2.2.5)

13.13. Интернационализация

    Here is an example of updating the simple upstream C source 
    debhello-2.0.tar.gz presented in «Раздел 13.11, «Autotools
    (multi-binary package)»» for internationalization (i18n) and
    creating the updated upstream C source debhello-2.0.tar.gz.

    In the real situation, the package should already be
    internationalized. So this example is educational for you to
    understand how this internationalization is implemented.

    Подсказка

    The routine maintainer activity for the i18n is simply to add
    translation po files reported to you via the Bug Tracking System
    (BTS) to the po/ directory and to update the language list in the
    po/LINGUAS file.

    Получитм исходный код и создадим пакет Debian.

    Загрузим debhello-2.0.tar.gz (i18n). 

     $ wget http://www.example.org/download/debhello-2.0.tar.gz
     ...
     $ tar -xzmf debhello-2.0.tar.gz
     $ tree
    .
    ├── debhello-2.0
    │   ├── LICENSE
    │   ├── Makefile.am
    │   ├── README.md
    │   ├── configure.ac
    │   ├── data
    │   │   ├── hello.desktop
    │   │   └── hello.png
    │   ├── lib
    │   │   ├── Makefile.am
    │   │   ├── sharedlib.c
    │   │   └── sharedlib.h
    │   ├── man
    │   │   ├── Makefile.am
    │   │   └── hello.1
    │   └── src
    │       ├── Makefile.am
    │       └── hello.c
    └── debhello-2.0.tar.gz

    6 directories, 14 files

    Internationalize this source tree with the gettextize command and
    remove files auto-generated by Autotools.

    запустим gettextize (i18n): 

     $ cd /path/to/debhello-2.0
     $ gettextize
    Creating po/ subdirectory
    Creating build-aux/ subdirectory
    Copying file ABOUT-NLS
    Copying file build-aux/config.rpath
    Not copying intl/ directory.
    Copying file po/Makefile.in.in
    Copying file po/Makevars.template
    Copying file po/Rules-quot
    Copying file po/boldquot.sed
    Copying file po/en@boldquot.header
    Copying file po/en@quot.header
    Copying file po/insert-header.sin
    Copying file po/quot.sed
    Copying file po/remove-potcdate.sin
    Creating initial po/POTFILES.in
    Creating po/ChangeLog
    Creating directory m4
    Copying file m4/gettext.m4
    Copying file m4/iconv.m4
    Copying file m4/lib-ld.m4
    Copying file m4/lib-link.m4
    Copying file m4/lib-prefix.m4
    Copying file m4/nls.m4
    Copying file m4/po.m4
    Copying file m4/progtest.m4
    Creating m4/ChangeLog
    Updating Makefile.am (backup is in Makefile.am~)
    Updating configure.ac (backup is in configure.ac~)
    Creating ChangeLog

    Please use AM_GNU_GETTEXT([external]) in order to cause autoconfiguration
    to look for an external libintl.

    Please create po/Makevars from the template in po/Makevars.template.
    You can then remove po/Makevars.template.

    Please fill po/POTFILES.in as described in the documentation.

    Please run 'aclocal' to regenerate the aclocal.m4 file.
    You need aclocal from GNU automake 1.9 (or newer) to do this.
    Then run 'autoconf' to regenerate the configure file.

    You will also need config.guess and config.sub, which you can get from the CV...
    of the 'config' project at http://savannah.gnu.org/. The commands to fetch th...
    are
    $ wget 'http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/conf...
    $ wget 'http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/conf...

    You might also want to copy the convenience header file gettext.h
    from the /usr/share/gettext directory into your package.
    It is a wrapper around <libintl.h> that implements the configure --disable-nl...
    option.

    Press Return to acknowledge the previous 6 paragraphs.
     $ rm -rf m4 build-aux *~

    Проверим созданные файлы в каталоге po/.

    файлы в каталоге po (i18n): 

     $ ls -l po
    total 60
    -rw-rw-r-- 1 osamu osamu   494 Jul 24 10:14 ChangeLog
    -rw-rw-r-- 1 osamu osamu 17577 Jul 24 10:14 Makefile.in.in
    -rw-rw-r-- 1 osamu osamu  3376 Jul 24 10:14 Makevars.template
    -rw-rw-r-- 1 osamu osamu    59 Jul 24 10:14 POTFILES.in
    -rw-rw-r-- 1 osamu osamu  2203 Jul 24 10:14 Rules-quot
    -rw-rw-r-- 1 osamu osamu   217 Jul 24 10:14 boldquot.sed
    -rw-rw-r-- 1 osamu osamu  1337 Jul 24 10:14 en@boldquot.header
    -rw-rw-r-- 1 osamu osamu  1203 Jul 24 10:14 en@quot.header
    -rw-rw-r-- 1 osamu osamu   672 Jul 24 10:14 insert-header.sin
    -rw-rw-r-- 1 osamu osamu   153 Jul 24 10:14 quot.sed
    -rw-rw-r-- 1 osamu osamu   432 Jul 24 10:14 remove-potcdate.sin

    Let’s update the configure.ac by adding «AM_GNU_GETTEXT
    ([external])», etc..

    configure.ac (i18n): 

     $ vim configure.ac
     ... hack, hack, hack, ...
     $ cat configure.ac
    #                                               -*- Autoconf -*-
    # Process this file with autoconf to produce a configure script.
    AC_PREREQ([2.69])
    AC_INIT([debhello],[2.2],[foo@example.org])
    AC_CONFIG_SRCDIR([src/hello.c])
    AC_CONFIG_HEADERS([config.h])
    echo "Standard customization chores"
    AC_CONFIG_AUX_DIR([build-aux])

    AM_INIT_AUTOMAKE([foreign])

    # Set default to --enable-shared --disable-static
    LT_INIT([shared disable-static])

    # find the libltdl sources in the libltdl sub-directory
    LT_CONFIG_LTDL_DIR([libltdl])
   
    # choose one
    LTDL_INIT([recursive])
    #LTDL_INIT([subproject])
    #LTDL_INIT([nonrecursive])

    # Add #define PACKAGE_AUTHOR ... in config.h with a comment
    AC_DEFINE(PACKAGE_AUTHOR, ["Osamu Aoki"], [Define PACKAGE_AUTHOR])
    # Checks for programs.
    AC_PROG_CC

    # desktop file support required
    AM_GNU_GETTEXT_VERSION([0.19.3])
    AM_GNU_GETTEXT([external])

    # only for the recursive case
    AC_CONFIG_FILES([Makefile
                     po/Makefile.in
                     lib/Makefile
                     man/Makefile
                     src/Makefile])
    AC_OUTPUT

    Let’s create the po/Makevars file from the po/Makevars.template
    file.

    po/Makevars (i18n): 

     ... hack, hack, hack, ...
     $ diff -u po/Makevars.template po/Makevars
    --- po/Makevars.template        2024-07-24 10:14:46.440850967 +0900
    +++ po/Makevars 2024-07-24 10:14:46.520852183 +0900
    @@ -18,14 +18,14 @@
     # or entity, or to disclaim their copyright.  The empty string stands for
     # the public domain; in this case the translators are expected to disclaim
     # their copyright.
    -COPYRIGHT_HOLDER = Free Software Foundation, Inc.
    +COPYRIGHT_HOLDER = Osamu Aoki <osamu@debian.org>

     # This tells whether or not to prepend "GNU " prefix to the package
     # name that gets inserted into the header of the $(DOMAIN).pot file.
     # Possible values are "yes", "no", or empty.  If it is empty, try to
     # detect it automatically by scanning the files in $(top_srcdir) for
     # "GNU packagename" string.
    -PACKAGE_GNU =
    +PACKAGE_GNU = no

     # This is the email address or URL to which the translators shall report
     # bugs in the untranslated strings:
     $ rm po/Makevars.template

    Let’s update C sources for the i18n version by wrapping strings
    with _(…​).

    src/hello.c (i18n): 

     ... hack, hack, hack, ...
     $ cat src/hello.c
    #include "config.h"
    #include <stdio.h>
    #include <sharedlib.h>
    #include <libintl.h>
    #define _(string) gettext (string)
    int
    main()
    {
            printf(_("Hello, I am " PACKAGE_AUTHOR "!\n"));
            sharedlib();
            return 0;
    }

    lib/sharedlib.c (i18n): 

     ... hack, hack, hack, ...
     $ cat lib/sharedlib.c
    #include <stdio.h>
    #include <libintl.h>
    #define _(string) gettext (string)
    int
    sharedlib()
    {
            printf(_("This is a shared library!\n"));
            return 0;
    }

    The new gettext (v=0.19) can handle the i18n version of the
    desktop file directly.

    data/hello.desktop.in (i18n): 

     $ fgrep -v '[ja]=' data/hello.desktop > data/hello.desktop.in
     $ rm data/hello.desktop
     $ cat data/hello.desktop.in
    [Desktop Entry]
    Name=Hello
    Comment=Greetings
    Type=Application
    Keywords=hello
    Exec=hello
    Terminal=true
    Icon=hello.png
    Categories=Utility;

    Приведём список входных файлов для извлечения переводных строк в 
    po/POTFILES.in.

    po/POTFILES.in (i18n): 

     ... hack, hack, hack, ...
     $ cat po/POTFILES.in
    src/hello.c
    lib/sharedlib.c
    data/hello.desktop.in

    Here is the updated root Makefile.am with po added to the SUBDIRS
    environment variable.

    Makefile.am (i18n): 

     $ cat Makefile.am
    # recursively process `Makefile.am` in SUBDIRS
    SUBDIRS = po lib src man

    ACLOCAL_AMFLAGS = -I m4

    EXTRA_DIST = build-aux/config.rpath m4/ChangeLog

    Let’s make a translation template file, debhello.pot.

    po/debhello.pot (i18n): 

     $ xgettext -f po/POTFILES.in -d debhello -o po/debhello.pot -k_
     $ cat po/debhello.pot
    # SOME DESCRIPTIVE TITLE.
    # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
    # This file is distributed under the same license as the PACKAGE package.
    # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
    #
    #, fuzzy
    msgid ""
    msgstr ""
    "Project-Id-Version: PACKAGE VERSION\n"
    "Report-Msgid-Bugs-To: \n"
    "POT-Creation-Date: 2024-07-24 10:14+0900\n"
    "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
    "Language-Team: LANGUAGE <LL@li.org>\n"
    "Language: \n"
    "MIME-Version: 1.0\n"
    "Content-Type: text/plain; charset=CHARSET\n"
    "Content-Transfer-Encoding: 8bit\n"

    #: src/hello.c:9
    #, c-format
    msgid "Hello, I am "
    msgstr ""

    #: lib/sharedlib.c:7
    #, c-format
    msgid "This is a shared library!\n"
    msgstr ""

    #: data/hello.desktop.in:3
    msgid "Hello"
    msgstr ""

    #: data/hello.desktop.in:4
    msgid "Greetings"
    msgstr ""

    #: data/hello.desktop.in:6
    msgid "hello"
    msgstr ""

    Let’s add a translation for French.

    po/LINGUAS и po/fr.po (i18n): 

     $ echo 'fr' > po/LINGUAS
     $ cp po/debhello.pot po/fr.po
     $ vim po/fr.po
     ... hack, hack, hack, ...
     $ cat po/fr.po
    # SOME DESCRIPTIVE TITLE.
    # This file is put in the public domain.
    # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
    #
    msgid ""
    msgstr ""
    "Project-Id-Version: debhello 2.2\n"
    "Report-Msgid-Bugs-To: foo@example.org\n"
    "POT-Creation-Date: 2015-03-01 20:22+0900\n"
    "PO-Revision-Date: 2015-02-21 23:18+0900\n"
    "Last-Translator: Osamu Aoki <osamu@debian.org>\n"
    "Language-Team: French <LL@li.org>\n"
    "Language: ja\n"
    "MIME-Version: 1.0\n"
    "Content-Type: text/plain; charset=UTF-8\n"
    "Content-Transfer-Encoding: 8bit\n"

    #: src/hello.c:34
    #, c-format
    msgid "Hello, my name is %s!\n"
    msgstr "Bonjour, je m'appelle %s!\n"

    #: lib/sharedlib.c:29
    #, c-format
    msgid "This is a shared library!\n"
    msgstr "Ceci est une bibliothèque partagée!\n"

    #: data/hello.desktop.in:3
    msgid "Hello"
    msgstr ""

    #: data/hello.desktop.in:4
    msgid "Greetings"
    msgstr "Salutations"

    #: data/hello.desktop.in:6
    msgid "hello"
    msgstr ""

    #: data/hello.desktop.in:9
    msgid "hello.png"
    msgstr ""

    Работа над подготовкой пакета практически полностью совпадает с
    тем, что описывается в «Раздел 13.11, «Autotools (multi-binary
    package)»».

    You can find more i18n examples by following «Раздел 13.14,
    «Детали»».

13.14. Детали

    Детали представенных в документации примеров, а также их
    вариантов, можно получить следующим образом.

    Как получить детали. 

     $ apt-get source debmake-doc
     $ cd debmake-doc*
     $ cd examples
     $ view examples/README.md

    Follow the exact instruction in examples/README.md.

     $ cd examples
     $ make

    Now, each directory named as examples/debhello-?.?_build-?
    contains the Debian packaging example.

      * эмулированный журнал активности командной строки консоли:
        файл .log
      * эмулированный журнал активности командной строки консоли
        (короткий): файл .slog
      * срез образа дерева исходного кода после выполнения команды 
        debmake: каталог debmake
      * snapshot source tree image after proper packaging: the packge
        directory
      * срез образа дерева исходного кода после выполнения команды 
        debuild: каталог test

    Notable examples are:

      * the POSIX shell script with Makefile with i18n (v=3.0),
      * the C source with Makefile.in + configure with i18n (v=3.2),
      * the C source with Autotools with i18n with i18n (v=3.3), and
      * the C source with CMake with i18n (v=3.4).

Глава 14. Страница руководства debmake(1)

14.1. НАЗВАНИЕ

    debmake - program to make a Debian source package

14.2. СИНТАКСИС

    debmake [-h] [-c | -k] [-n | -a package-version.orig.tar.gz | -d
    | -t ] [-p package] [-u version] [-r revision] [-z extension] [-b
    "binarypackage[:type], …​]" [-e foo@example.org] [-f "firstname
    lastname"] [-i "buildtool" | -j] [-l license_file] [-m] [-o file]
    [-q] [-s] [-v] [-w "addon, …​"] [-x [01234]] [-y] [-L] [-P] [-T]

14.3. ОПИСАНИЕ

    debmake помогает собрать пакет Debian из исходного кода основной
    ветки разработки. Обычно это делается следующим образом:

      * Загружается tar-архив основной ветки разработки в виде файла 
        пакет-версия.tar.gz.
      * Исходный код распаковывается, создаются файлы в каталоге 
        пакет-версия/.
      * Вызывается debmake в каталоге пакет-версия/, возможно, без
        аргументов.
      * Файлы в каталоге package-version/debian/ настраиваются
        вручную.
      * dpkg-buildpackage (usually from its wrapper debuild or sbuild
        ) is invoked in the package-version/ directory to make Debian
        packages.

    Обязательно защитите путём соответствующего включения в кавычки
    аргументы опций -b, -f, -l и -w от вмешательства командной
    оболочки.

14.3.1. необязательные аргументы:

    -h, --help
        показать справочное сообщение и выйти.
    -c, --copyright

        сканировать исходный код на предмет текста об авторском праве
        и лицензировании и выйти.

          o -c: простой стиль вывода
          o -cc: обычный стиль вывода (схож с файлом debian/copyright
            )
          o -ccc: отладочный стиль вывода
    -k, --kludge

        сравнить файл debian/copyright с исходным кодом и выйти.

        Файл debian/copyright должен быть организован таким образом,
        что наиболее общие файловые шаблоны размещаются раньше
        конкретных исключений.

          o -k: простой стиль вывода
          o -kk: подробный стиль вывода
    -n, --native

        make a native Debian source package without .orig.tar.gz.
        This makes a Debian source format «3.0 (native)» package.

        If you are thinking of packaging a Debian-specific source
        tree with debian/ in it into a native Debian package, please
        think otherwise. You can use the «debmake -d -i debuild» or «
        debmake -t -i debuild» commands to make a Debian non-native
        package using the Debian source format «3.0 (quilt)» The only
        difference is that the debian/changelog file must use the
        non-native version scheme: version-revision. The non-native
        package is more friendly to downstream distributions.

    -a пакет-версия.tar.gz, --archive пакет-версия.tar.gz

        использовать непосредственно tar-архив с исходным кодом
        основной ветки. (отменяются опции -p, -u, -z)

        The upstream tarball may be specified as package_version
        .orig.tar.gz and tar.gz. For other cases, it may be tar.bz2,
        or tar.xz.

        Если в имени указанного tar-архива основной ветки содержатся
        буквы в верхнем регистре, то в имени пакета Debian они будут
        преобразованы в буквы нижнего регистра.

        If the specified argument is the URL (http://, https://, or
        ftp://) to the upstream tarball, the upstream tarball is
        downloaded from the URL using wget or curl.

    -d, --dist

        run the «make dist» command equivalents first to generate the
        upstream tarball and use it.

        The «debmake -d» command is designed to run in the package/
        directory hosting the upstream VCS with the build system
        supporting the «make dist» command equivalents. (automake/
        autoconf, …​)

    -t, --tar

        run the «tar» command to generate the upstream tarball and
        use it.

        The «debmake -t» command is designed to run in the package/
        directory hosting the upstream VCS. Unless you provide the
        upstream version with the -u option or with the debian/
        changelog file, a snapshot upstream version is generated in
        the 0\~%y%m%d%H%M format, e.g., 0~1403012359, from the UTC
        date and time. The generated tarball excludes the debian/
        directory found in the upstream VCS. (It also excludes
        typical VCS directories: .git/, .hg/, .svn/, .CVS/.)

    -p пакет, --package пакет
        установить имя пакета Debian.
    -u версия, --upstreamversion версия
        установить версию пакета основной ветки.
    -r редакция, --revision редакция
        установить номер редации пакета Debian.
    -z расширение, --targz расширение
        set the tarball type, extension=(tar.gz|tar.bz2|tar.xz).
        (alias: z, b, x)
    -b "binarypackage[:type],…​", --binaryspec "binarypackage
    [:type],…​"

        set the binary package specs by a comma separated list of 
        binarypackage:type pairs. Here, binarypackage is the binary
        package name, and the optional type is chosen from the
        following type values:

          o bin: C/C++ compiled ELF binary code package (any,
            foreign) (default, alias: "", i.e., null-string)
          o data: Data (fonts, graphics, …​) package (all, foreign)
            (alias: da)
          o dev: пакет с библиотекой разработки (any, same)
            (псевдоним: de)
          o doc: пакет документации (all, foreign) (псевдоним: do)
          o lib: пакет с библиотекой (any, same) (псевдоним: l)
          o perl: пакет со сценарием на языке Perl (all, foreign)
            (псевдоним: pl)
          o python3: Python (version 3) script package (all, foreign)
            (alias: py3, python, py)
          o ruby: пакет со сценарием на языке Ruby (all, foreign)
            (псевдоним: rb)
          o nodejs: Node.js based JavaScript package (all, foreign)
            (alias: js)
          o script: Shell and other interpretted language script
            package (all, foreign) (alias: sh)

        The pair values in the parentheses, such as (any, foreign),
        are the Architecture and Multi-Arch stanza values set in the 
        debian/control file. In many cases, the debmake command makes
        good guesses for type from binarypackage. If type is not
        obvious, type is set to bin.

        Here are examples for typical binary package split scenarios
        where the upstream Debian source package name is foo:

          o Generating an executable binary package foo:

              # «-b’foo:bin'», or its short form `-b'-'`", or no -b
                option
          o Generating an executable (python3) binary package 
            python3-foo:

              # «-b’python3-foo:py'», or its short form «
                -b’python3-foo'»
          o Generating a data package foo:

              # «-b’foo:data'», or its short form «-b'-:data'»
          o Generating a executable binary package foo and a
            documentation one foo-doc:

              # «-b’foo:bin,foo-doc:doc'», or its short form «
                -b'-:-doc'»
          o Generating a executable binary package foo, a library
            package libfoo1, and a library development package 
            libfoo-dev:

              # «-b’foo:bin,libfoo1:lib,libfoo-dev:dev'» or its short
                form «-b'-,libfoo1,libfoo-dev'»

        Если содержимое дерева исходного кода не совпадает с
        настройками поля тип, то команда debmake выводит
        предупреждение.

    -e foo@example.org, --email foo@example.org

        установить адрес электронной почты.

        По умолчанию берётся значение переменной окружения $DEBEMAIL.

    -f "имя фамилия", --fullname "имя фамилия"

        установить имя и фамилию.

        По умолчанию берётся значение переменной окружения 
        $DEBFULLNAME.

    -i "инструментсборки", --invoke "инструментсборки"

        invoke "buildtool" at the end of execution. buildtool may be 
        «dpkg-buildpackage», «debuild», «sbuild», etc.

        По умолчанию никакая программа не выполняется.

        Передача этой опции автоматически приводит к передаче опции 
        --local.

    -j, --judge

        запустить dpkg-depcheck для выявления сборочных зависимостей
        и определения путей файлов. Файлы журнала располагаются в
        родительском каталоге.

          o package.build-dep.log: файл журнала dpkg-depcheck.
          o package.install.log: файл журнала, в который записываются
            файлы из каталога debian/tmp.
    -l "license_file,…​", --license "license_file,…​"

        add formatted license text to the end of the debian/copyright
        file holding license scan results.

        The default is to add COPYING and LICENSE, and license_file
        needs to list only the additional file names all separated by
        «,».

    -m, --monoarch
        подготовить пакеты без поддержки мультиархитектурности.
    -o файл, --option файл

        read optional parameters from file. (This is not for everyday
        use.)

        The content of file is sourced as the Python code at the end
        of para.py. For example, the package description can be
        specified by the following file.

        para['desc'] = 'program short description'
        para['desc_long'] = '''\
         program long description which you wish to include.
         .
         Empty line is space + .
         You keep going on ...
        '''

    -q, --quitearly
        выйти до создания файлов в каталоге debian/.
    -s, --spec
        use upstream spec (pyproject.py for Python, etc.) for the
        package description.
    -v, --version
        показать информацию о версии.
    -w "addon,…​", --with "addon,…​"

        добавить дополнительные аргументы опции --with команды dh(1)
        в качестве дополнений в файл debian/rules.

        The addon values are listed all separated by «,», e.g., «-w
        "python3,autoreconf"».

        For Autotools based packages, autoreconf as addon to run «
        autoreconf -i -v -f» for every package building is default
        behavior of the dh(1) command.

        For Autotools based packages, if they install Python (version
        3) programs, setting python3 as addon to the debmake command
        argument is needed since this is non-obvious. But for 
        pyproject.toml based Python packages, setting python3 as 
        addon to the debmake command argument is not needed since
        this is obvious and the debmake command automatically set it
        to the dh(1) command.

    -x n, --extra n

        generate configuration files as templates. (Please note 
        debian/changelog, debian/control, debian/copyright, and 
        debian/rules are bare minimum configuration files to build a
        Debian binary package.)

        The number n determines which configuration templates are
        generated.

          o -x0: all required configuration template files. (selected
            option if any of these files already exist)
          o -x1: all -x0 files + desirable configuration template
            files with binary package type supports.
          o -x2: all -x1 files + normal configuration template files
            with maintainer script supports.
          o -x3: all -x2 files + optional configuration template
            files. (default optuin)
          o -x4: all -x3 files + deprecated configuration template
            files.

    Some configuration template files are generated with the extra 
    .ex suffix to ease their removal. To activate these, rename their
    file names to the ones without the .ex suffix and edit their
    contents. Existing configuration files are never overwritten. If
    you wish to update some of the existing configuration files,
    please rename them before running the debmake command and
    manually merge the generated configuration files with the old
    renamed ones.

    -y, --yes
        «force yes» for all prompts. (without option: «ask [Y/n]»;
        doubled option: «force no»)
    -L, --local
        создать файлы настройки для локального пакета, чтобы
        перехитрить проверки lintian(1).
    -P, --pedantic
        педантично проверять автоматически создаваемые файлы.
    -T, --tutorial
        output tutorial comment lines in template files. default when
        -x3 or -x4 is set.

14.4. ПРИМЕРЫ

    For a well behaving source, you can build a good-for-local-use
    installable single Debian binary package easily with one command.
    Test install of such a package generated in this way offers a
    good alternative to the traditional «make install» command
    installing into the /usr/local directory since the Debian package
    can be removed cleanly by the «dpkg -P '…​'» command. Here are
    some examples of how to build such test packages. (These should
    work in most cases. If the -d option does not work, try the -t
    option instead.)

    For a typical C program source tree packaged with autoconf/
    automake:

      * debmake -d -i debuild

    For a typical Python (version 3) module source tree:

      * debmake -s -d -b":python3" -i debuild

    For a typical Python (version 3) module in the package-version
    .tar.gz archive:

      * debmake -s -a package-version.tar.gz -b":python3" -i debuild

    Для обычного модуля языка Perl в виде архива пакет-версия.tar.gz:

      * debmake -a package-version.tar.gz -b":perl" -i debuild

14.5. ВСПОМОГАТЕЛЬНЫЕ ПАКЕТЫ

    Для работы над пакетами может потребоваться установка некоторых
    дополнительных специализированных вспомогательных пакетов.

      * Python (version 3) programs may require the 
        pybuild-plugin-pyproject package.
      * The Autotools (autoconf + automake) build system may require 
        autotools-dev or dh-autoreconf package.
      * Ruby programs may require the gem2deb package.
      * Node.js based JavaScript programs may require the 
        pkg-js-tools package.
      * Java programs may require the javahelper package.
      * Для программ для окружения Gnome может потребоваться пакет 
        gobject-introspection.
      * и т. д.

14.6. ПРЕДОСТЕРЕЖЕНИЯ

    Although debmake is meant to provide template files for the
    package maintainer to work on, actual packaging activities are
    often performed without using debmake while referencing only
    existing similar packages and «Debian Policy Manual». All
    template files generated by debmake are required to be modified
    manually.

    There are 2 positive points for debmake:

      * debmake helps to write terse packaging tutorial «Guide for
        Debian Maintainers» (debmake-doc package).
      * debmake provides short extracted license texts as debian/
        copyright in decent accuracy to help license review.

    Please double check copyright with the licensecheck(1) command.

    There are some limitations for what characters may be used as a
    part of the Debian package. The most notable limitation is the
    prohibition of uppercase letters in the package name. Here is a
    summary as a set of regular expressions:

      * Upstream package name (-p): [-+.a-z0-9]{2,}
      * Binary package name (-b): [-+.a-z0-9]{2,}
      * Upstream version (-u): [0-9][-+.:~a-z0-9A-Z]*
      * Debian revision (-r): [0-9][+.~a-z0-9A-Z]*

    See the exact definition in «Chapter 5 - Control files and their
    fields» in the «Debian Policy Manual».

    debmake assumes relatively simple packaging cases. So all
    programs related to the interpreter are assumed to be «
    Architecture: all». This is not always true.

14.7. ОТЛАДКА

    Сообщения об ошибках отправляйте с помощью команды reportbug для
    пакета debmake.

    Набор символов в переменной окружении $DEBUG определяет уровень
    вывода журнала.

      * i: main.py logging
      * p: para.py logging
      * s: checkdep5.py check_format_style() logging
      * y: checkdep5.py split_years_name() logging
      * b: checkdep5.py parse_lines() 1 logging — content_state scan
        loop: begin-loop
      * m: checkdep5.py parse_lines() 2 logging — content_state scan
        loop: after regex match
      * e: checkdep5.py parse_lines() 3 logging — content_state scan
        loop: end-loop
      * a: checkdep5.py parse_lines() 4 logging — print author/
        translator section text
      * f: checkdep5.py check_all_license() 1 logging — input
        filename for the copyright scan
      * l: checkdep5.py check_all_license() 2 logging — print license
        section text
      * c: checkdep5.py check_all_license() 3 logging — print
        copyright section text
      * k: checkdep5.py check_all_license() 4 logging — sort key for
        debian/copyright stanza
      * r: sed.py logging
      * w: cat.py logging
      * n: kludge.py logging («debmake -k»)

    Use this feature as:

     $ DEBUG=ipsybmeaflckrwn debmake ...

    See README.developer in the source for more.

14.8. АВТОР

    Copyright © 2014-2024 Osamu Aoki <osamu@debian.org>

14.9. ЛИЦЕНЗИЯ

    Лицензия Expat

14.10. СМОТРИТЕ ТАКЖЕ

    The debmake-doc package provides the «Guide for Debian
    Maintainers» in plain text, HTML and PDF formats under the /usr/
    share/doc/debmake-doc/ directory.

    See also dpkg-source(1), deb-control(5), debhelper(7), dh(1), 
    dpkg-buildpackage(1), debuild(1), quilt(1), dpkg-depcheck(1), 
    sbuild(1), gbp-buildpackage(1), and gbp-pq(1) manpages.

Глава 15. debmake options

    Here are some additional explantion for debmake options.

15.1. Shortcut options (-a, -i)

    Команда debmake предлагает 2 опции для выполнения быстрых
    действий.

      * -a : открыть tar-архив основной ветки
      * -i : выполнить сценарий для сборки двоичного пакета

    Действия из примера, приведённого выше в «Глава 5, Simple
    packaging», можно выполнить с помощью следующей простой команды.

     $ debmake -a package-1.0.tar.gz -i debuild

    Подсказка
   
    A URL such as «https://www.example.org/DL/package-1.0.tar.gz» may
    be used for the -a option.

    Подсказка

    A URL such as «https://arm.koji.fedoraproject.org/packages/ibus/
    1.5.7/3.fc21/src/ibus-1.5.7-3.fc21.src.rpm» may be used for the 
    -a option, too.

15.2. debmake -b

    The debmake command with the -b option provides an intuitive and
    flexible method to create the initial template debian/control
    file defining the split of the Debian binary packages with
    following stanzas:

      * Package:
      * Architecture: (e.g. amd64)
      * Multi-Arch: (see «Раздел 9.10, «Multiarch»»)
      * Depends:
      * Pre-Depends:

    The debmake command also sets an appropriate set of substvars
    used in each pertinent dependency stanza.

    Ниже приводится цитата соответствующей части страницы руководства
    debmake.

    -b "binarypackage[:type],…​", --binaryspec "binarypackage
    [:type],…​"

        set the binary package specs by a comma separated list of 
        binarypackage:type pairs. Here, binarypackage is the binary
        package name, and the optional type is chosen from the
        following type values:

          o bin: C/C++ compiled ELF binary code package (any,
            foreign) (default, alias: "", i.e., null-string)
          o data: Data (fonts, graphics, …​) package (all, foreign)
            (alias: da)
          o dev: пакет с библиотекой разработки (any, same)
            (псевдоним: de)
          o doc: пакет документации (all, foreign) (псевдоним: do)
          o lib: пакет с библиотекой (any, same) (псевдоним: l)
          o perl: пакет со сценарием на языке Perl (all, foreign)
            (псевдоним: pl)
          o python3: Python (version 3) script package (all, foreign)
            (alias: py3, python, py)
          o ruby: пакет со сценарием на языке Ruby (all, foreign)
            (псевдоним: rb)
          o nodejs: Node.js based JavaScript package (all, foreign)
            (alias: js)
          o script: Shell and other interpretted language script
            package (all, foreign) (alias: sh)

        The pair values in the parentheses, such as (any, foreign),
        are the Architecture and Multi-Arch stanza values set in the 
        debian/control file. In many cases, the debmake command makes
        good guesses for type from binarypackage. If type is not
        obvious, type is set to bin.

        Here are examples for typical binary package split scenarios
        where the upstream Debian source package name is foo:

          o Generating an executable binary package foo:

              # «-b’foo:bin'», or its short form `-b'-'`", or no -b
                option
          o Generating an executable (python3) binary package 
            python3-foo:

              # «-b’python3-foo:py'», or its short form «
                -b’python3-foo'»
          o Generating a data package foo:

              # «-b’foo:data'», or its short form «-b'-:data'»
          o Generating a executable binary package foo and a
            documentation one foo-doc:

              # «-b’foo:bin,foo-doc:doc'», or its short form «
                -b'-:-doc'»
          o Generating a executable binary package foo, a library
            package libfoo1, and a library development package 
            libfoo-dev:

              # «-b’foo:bin,libfoo1:lib,libfoo-dev:dev'» or its short
                form «-b'-,libfoo1,libfoo-dev'»

        Если содержимое дерева исходного кода не совпадает с
        настройками поля тип, то команда debmake выводит
        предупреждение.

15.3. debmake -cc

    The debmake command with the -cc option can make a summary of the
    copyright and license for the entire source tree to standard
    output.

     $ tar -xvzf package-1.0.tar.gz
     $ cd package-1.0
     $ debmake -cc | less

    Опция -c позволяет получить более краткий отчёт.

15.4. Snapshot upstream tarball (-d, -t)

    This test building scheme is good for the git repository
    organized as described in gbp-buildpackage(7) which uses the
    master, upstream, and pristine-tar branches.

    The upstream snapshot from the upstream source tree in the
    upstream VCS can be made with the -d option if the upstream
    supports the «make dist» equivalence.

     $ cd /path/to/upstream-vcs
     $ debmake -d -i debuild

    С другой стороны, то же самое можно сделать с помощью опции -t в
    том случае, если с помощью команды tar можно создать tar-архив
    основной ветки.

     $ cd /path/to/upstream-vcs
     $ debmake -p package -t -i debuild

    Unless you provide the upstream version with the -u option or
    with the debian/changelog file, a snapshot upstream version is
    generated in the 0~%y%m%d%H%M format, e.g., 0~1403012359, from
    the UTC date and time.

    If the upstream VCS is hosted in the package/ directory instead
    of the upstream-vcs/ directory, the «-p package» can be skipped.

    If the upstream source tree in the VCS contains the debian/*
    files, the debmake command with either the -d option or the -t
    option combined with the -i option automates the making of a
    non-native Debian package from the VCS snapshot while using these
    debian/* files.

     $ cp -r /path/to/package-0~1403012359/debian/. /path/to/upstream-vcs/debian
     $ dch
       ... update debian/changelog
     $ git add -A .; git commit -m "vcs with debian/*"
     $ debmake -t -p package -i debuild

    This non-native Debian binary package building scheme without the
    real upstream tarball is considered as the quasi-native Debian
    package. See «Раздел 10.13, «Quasi-native Debian packaging»».

15.5. debmake -j

    This is an experimental feature.

    The generation of a functioning multi-binary package always
    requires more manual work than that of a functioning single
    binary package. The test build of the source package is the
    essential part of it.

    Например, создадим пакет из того же архива package-1.0.tar.gz
    (см. «Глава 5, Simple packaging») с поддержкой набора из
    нескольких двоичных пакетов.

      * Запустите команду debmake с опцией -j для выполнения тестовой
        сборки и создания отчёта.

         $ debmake -j -a package-1.0.tar.gz

      * Check the last lines of the package.build-dep.log file to
        judge build dependencies for Build-Depends. (You do not need
        to list packages used by debhelper, perl, or fakeroot
        explicitly in Build-Depends. This technique is useful for the
        generation of a single binary package, too.)
      * Проверьте содержимое файла пакет.install.log для определения
        путей установки файлов, чтобы решить, как разделить эти файлы
        на несколько пакетов.
      * Начните работу над пакетом с помощью команды debmake.

         $ rm -rf package-1.0
         $ tar -xvzf package-1.0.tar.gz
         $ cd package-1.0
         $ debmake -b"package1:type1, ..."

      * Обновите файлы debian/control и debian/двоичныйпакет.install,
        используя полученную выше информацию.
      * При необходимости обновите другие файлы debian/*.
      * Build the Debian package with the debuild command or its
        equivalent.

         $ debuild

      * All binary package entries specified in the debian/
        binarypackage.install file are generated as 
        binarypackage_version-revision_arch.deb.

    Примечание

    The -j option for the debmake command invokes dpkg-depcheck(1) to
    run debian/rules under strace(1) to obtain library dependencies.
    Unfortunately, this is very slow. If you know the library package
    dependencies from other sources such as the SPEC file in the
    source, you may just run the "debmake …​" command without the -j
    option and run the «debian/rules install» command to check the
    install paths of the generated files.

15.6. debmake -k

    This is an experimental feature.

    При обновлении пакета до нового выпуска основной ветки команда 
    debmake может проверить содержимое существующего файла debian/
    copyright и сравнить его с информацией об авторских правах и
    лицензировании для всего обновлённого дерева исходного кода
    целиком.

     $ cd package-vcs
     $ gbp import-orig --uscan --pristine-tar
     ... update source with the new upstream release
     $ debmake -k | less

    The «debmake -k» command parses the debian/copyright file from
    the top to the bottom and compares the license of all the
    non-binary files in the current package with the license
    described in the last matching file pattern entry of the debian/
    copyright file.

    При редактировании автоматически созданного файла debian/
    copyright убедитесь, что наиболее общие шаблоны файлов помещены в
    верхней части списка.

    Подсказка
   
    For all new upstream releases, run the «debmake -k» command to
    ensure that the debian/copyright file is current.

15.7. debmake -P

    Команда debmake, запущенная с опцией -P, педантично проверяет
    создаваемые автоматически файлы на предмет наличия текста об
    автоских правах и лицензировании, даже если они подпадают под
    действие разрешительной лицензии.

    This option affects not only the content of the debian/copyright
    file generated by normal execution, but also the output by the
    execution with the -k, -c, -cc, and -ccc options.

15.8. debmake -T

    The debmake command invoked with the -T option additionally
    prints verbose tutorial comment lines. The lines marked with ###
    in the template files are part of the verbose tutorial comment
    lines.

15.9. debmake -x

    Количество шаблонных файлов, создаваемых командой debmake зависит
    от опции -x[01234].

      * See «Раздел 13.1, «Выборочное применение шаблонов»» for
        cherry-picking of the template files.

    Примечание
   
    Команда debmake не меняет ни один из существующих файлов
    настройки.