Product SiteDocumentation Site

Глава 15. Создание пакета Debian

15.1. Пересборка пакета из его исходного кода
15.1.1. Получение исходного кода
15.1.2. Внесение изменений
15.1.3. Запуск пересборки
15.2. Сборка вашего первого пакета
15.2.1. Метапакеты или пакеты-пустышки
15.2.2. Простое файловое хранилище
15.3. Создание репозитория пакетов для APT
15.4. Как стать сопровождающим пакета
15.4.1. Учимся создавать пакеты
15.4.2. Процесс принятия
Нередко администратор, постоянно имеющий дело с пакетами Debian, со временем чувствует необходимость в создании своих собственных пакетов или изменении существующего пакета. Цель этой главы состоит в том, чтобы ответить на наиболее распространенные вопросы в этой области, а также предоставить необходимые базовые знания для использования инфраструктуры Debian наилучшим образом. Если повезет, после попытки приложить руку к созданию локальных пакетов вы даже можете почувствовать потребность в том, чтобы пойти дальше и присоединиться к самому Проекту Debian!

15.1. Пересборка пакета из его исходного кода

Пересборка двоичного пакета требуется при ряде обстоятельств. В некоторых случаях администратору нужна функциональность программы, для активации которой необходима компиляция из исходного кода с определенной опцией; в других программное обеспечение, упакованное в установленной версии Debian, недостаточно актуально. В последнем случае администратору обычно нужно собрать более свежий пакет, взятый из более новой версии Debian — например Testing или даже Unstable — чтобы новый пакет заработал в дистрибутиве Stable; эта операция называется «бэкпортирование». Как обычно, прежде чем приступать к такой задаче, следует проверить, не был ли такой пакет уже создан, — для этого достаточно беглого взгляда на страницу данного пакета в Системе отслеживания пакетов Debian.

15.1.1. Получение исходного кода

Пересборка пакета Debian начинается с получения его исходного кода. Простейший способ состоит в использовании команды apt-get source название-пакета-исходного-кода. Данная команда требует наличия строки deb-src в файле /etc/apt/sources.list и обновлённых файлов индекса (после выполнения apt-get update). Эти условия должны быть уже выполнены, если вы следовали инструкциям из главы, посвященной конфигурации APT (см. Раздел 6.1, «Содержимое файла sources.list»). Однако заметьте, что вы будете загружать пакеты исходного кода из версии Debian, упомянутой в строке deb-src. Если необходима другая версия, вам может понадобиться загрузить её вручную с зеркала Debian или с веб-сайта. Для этого требуется получить два или три файла (с расширениями *.dsc — от Debian Source Control*.tar.comp, и иногда *.diff.gz или *.debian.tar.compcomp может принимать одно из значений: gz, bz2 или xz в зависимости от используемого инструмента сжатия), затем запустить команду dpkg-source -x file.dsc. Если файл *.dsc доступен напрямую по известному URL, то есть еще более простой способ получить это всё — с помощью команды dget URL. Эта команда (которую можно найти в пакете devscripts) загружает файл *.dsc по переданному ей адресу, затем анализирует его содержимое и автоматически загружает файл или файлы, перечисленные в нём. После того, как всё загружено, она распаковывает пакет исходных кодов (если только не используется опция -d или --download-only).

15.1.2. Внесение изменений

Исходный код пакета теперь доступен в каталоге, имя которого составлено из имени пакета исходного кода и его версии (например samba-4.1.17+dfsg); здесь мы будем работать над нашими локальными изменениями.
Первое, что необходимо сделать, это изменить версию пакета, чтобы пересобранные пакеты можно было отличить от оригинальных, предоставляемых Debian. Если предположить, что текущая версия — 2:4.1.17+dfsg-2, мы можем создать версию 2:4.1.17+dfsg-2falcot1, что явно указывает на происхождение пакета. Номер версии версии становится выше, чем у пакета, предоставленного Debian, таким образом, пакет можно будет легко установить как обновление оригинального пакета. Такое изменение лучше всего осуществляется с помощью команды dch (Debian CHangelog) из пакета devscripts, запустив её с параметрами dch --local falcot. Это действие вызовет текстовый редактор (sensible-editor — это должен быть ваш любимый редактор, если он указан в переменной окружения VISUAL или EDITOR, а в противном случае редактор по умолчанию) для того, чтобы документировать изменения, внесенные данной пересборкой. Этот редактор показывает нам, что dch действительно изменила файл debian/changelog.
В случае, если требуются изменения в опциях сборки, они вносятся в файл debian/rules, который управляет шагами процесса сборки пакета. В простейших случаях строки, относящиеся к начальной конфигурации (./configure …) или к собственно сборке ($(MAKE) … или make …) легко обнаружить. Если эти команды не не вызываются явно, они, вероятно, являются побочным эффектом другой явной команды; в этом случае обратитесь к их документации, чтобы выяснить, как изменить поведение по умолчанию. В случае пакетов, использующих dh, может понадобиться переопределить команду dh_auto_configure или dh_auto_build (подробности см. на соответствующих страницах руководства).
В зависимости от локальных изменений в пакетах может потребоваться также обновление файла debian/control, который содержит описание создаваемых пакетов. В частности, этот файл содержит строки Build-Depends, контролирующие список зависимостей, которые должны быть удовлетворены на этапе сборки пакета. Они часто ссылаются на версии пакетов, содержащиеся в дистрибутиве, откуда взят исходный код, но которые могут быть недоступны в дистрибутиве, используемом для пересборки. Не существует автоматизированного способа определить, является ли зависимость реальной, или же она указана только с целью гарантировать выполнение сборки исключительно с последней версией библиотеки, — это единственный доступный способ заставить autobuilder использовать данную версию пакета во время сборки, из-за чего сопровождающие Debian часто используют строго версионированые сборочные зависимости.
Если вы точно знаете, что эти сборочные зависимости слишком строги, не стесняйтесь ослабить их локально. Чтение файлов, документирующих стандартный способ сборки программного обеспечения — эти файлы часто называют INSTALL — поможет выяснить соответствующие зависимости. В идеале все зависимости должны быть удовлетворены из дистрибутива, используемого для пересборки; в противном случае начинается рекурсивный процесс, в результате которого пакеты, упомянутые в поле Build-Depends, должны быть бэкпортированы раньше целевого пакета. Некоторые пакеты могут не требовать бэкпортирования, и их можно установить как есть в процессе сборки (ярким примером является debhelper). Обратите внимание, что процесс бэкпортирования может стать лавинообразным, если вы не будете осторожны. Поэтому бэкпорты должны быть сведены к абсолютному минимуму, насколько это возможно.

15.1.3. Запуск пересборки

Когда все необходимые изменения внесены в исходный код, мы можем запустить создание собственно двоичного пакета (файл .deb). Весь процесс управляется командой dpkg-buildpackage.

Пример 15.1. Пересборка пакета

$ dpkg-buildpackage -us -uc
[...]
Предыдущая команда может завершиться ошибкой, если поле Build-Depends не было обновлено или соответствующие пакеты не установлены. В таком случае можно исключить эту проверку, передав параметр -d команде dpkg-buildpackage. Тем не менее, явное игнорирование зависимостей влечёт риск ошибки сборки на более позднем этапе. Хуже того, пакет может казаться собранным корректно, но не запуститься надлежащим образом: некоторые программы автоматически отключают часть своего функционала, если требующаяся библиотека была недоступна во время сборки.
В большинстве случаев разработчики Debian используют программу более высокого уровня, такую как debuild; она запускает dpkg-buildpackage как обычно, но также добавляет вызов программы, выполняющей множество проверок пакета на соответствие политике Debian. Этот сценарий также очищает окружение, так что локальные переменные окружения не «загрязняют» сборку пакета. Команда debuild — один из инструментов набора devscripts, который берёт на себя часть работы по обеспечению постоянства и настройке, чтобы сделать задачу сопровождающего более легкой.