Пересборка двоичного пакета требуется при ряде обстоятельств. В некоторых случаях администратору нужна функциональность программы, для активации которой необходима компиляция из исходного кода с определенной опцией; в других программное обеспечение, упакованное в установленной версии Debian, недостаточно актуально. В последнем случае администратору обычно нужно собрать более свежий пакет, взятый из более новой версии Debian — например
Testing или даже
Unstable — чтобы новый пакет заработал в дистрибутиве
Stable; эта операция называется «бэкпортирование». Как обычно, прежде чем приступать к такой задаче, следует проверить, не был ли такой пакет уже создан, — для этого достаточно беглого взгляда на страницу данного пакета в Системе отслеживания пакетов Debian.
15.1.1. Получение исходного кода
Rebuilding a Debian package starts with getting its source code. The easiest way is to use the
apt-get source source-package-name
command. This command requires a
deb-src
line in the
/etc/apt/sources.list
file, and up-to-date index files (i.e.
apt-get update
). These conditions should already be met if you followed the instructions from the chapter dealing with APT configuration (see
Раздел 6.1, «Содержимое файла sources.list
»). Note, however, that you will be downloading the source packages from the Debian version mentioned in the
deb-src
line. If you need another version, you may need to download it manually from a Debian mirror or from the web site. This involves fetching two or three files (with extensions
*.dsc
— for
Debian Source Control —
*.tar.comp
, and sometimes
*.diff.gz
or
*.debian.tar.comp
—
comp taking one value among
gz
,
bz2
or
xz
depending on the compression tool in use), then run the
dpkg-source -x file.dsc
command. If the
*.dsc
file is directly accessible at a given URL, there is an even simpler way to fetch it all, with the
dget URL
command. This command (which can be found in the
devscripts package) fetches the
*.dsc
file at the given address, then analyzes its contents, and automatically fetches the file or files referenced within. Once everything has been downloaded, it verifies the integrity of the downloaded source packages using
dscverify
, and it extracts the source package (unless the
-d
or
--download-only
option is used). The Debian keyring is needed, unless the option
-u
is supplied.
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, который берёт на себя часть работы по обеспечению постоянства и настройке, чтобы сделать задачу сопровождающего более легкой.