Пересборка двоичного пакета требуется при ряде обстоятельств. В некоторых случаях администратору нужна функциональность программы, для активации которой необходима компиляция из исходного кода с определенной опцией; в других программное обеспечение, упакованное в установленной версии 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.comp
—
comp может принимать одно из значений:
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, который берёт на себя часть работы по обеспечению постоянства и настройке, чтобы сделать задачу сопровождающего более легкой.