Ubuntu logo

Developer

Создание пакетов для новых программ

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

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

Проверка программы

Первым этапом создания пакета является получение tar-файла из апстрима («апстримом» мы называем авторов приложений) и проверка того, что он нормально компилируется и запускается.

Это руководство проведёт вас через процесс создания пакета для небольшого приложения GNU Hello, доступного на GNU.org.

Если у вас ещё нет инструментов сборки, установите их. Также установите все необходимые зависимости.

Установим инструменты сборки:

$ sudo apt-get install build-essential

Скачаем основной пакет:

$ wget -O hello-2.7.tar.gz "http://ftp.gnu.org/gnu/hello/hello-2.7.tar.gz"

Теперь распакуем основной пакет:

$ tar xf hello-2.7.tar.gz
$ cd hello-2.7

Это приложение использует систему сборки autoconf, так что нам нужно запустить ./configure для подготовки к компиляции.

При этом будет проверено наличие необходимых для сборки зависимостей. Поскольку hello — простой пример, build-essential обеспечит нас всем, что нужно. Для более сложных программ, команда завершится ошибкой, если у нас нет необходимых библиотек и файлов для разработки. Установите требуемые пакеты и повторите процесс, пока команда не завершится успешно.:

$ ./configure

Теперь нужно скомпилировать исходный код:

$ make

Если компиляция завершилась успешно, можно установить и запустить программу:

$ sudo make install
$ hello

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

bzr-builddeb содержит модуль для создания нового пакета из шаблона. Этот модуль является обёрткой вокруг команды dh_make . Он уже должен быть у вас, если вы установили packaging-dev. Запустите команду, указав имя пакета, номер версии и путь к tar-архиву из апстрима:

$ sudo apt-get install dh-make
$ cd ..
$ bzr dh-make hello 2.7 hello-2.7.tar.gz

When it asks what type of package type s for single binary. This will import the code into a branch and add the debian/ packaging directory. Have a look at the contents. Most of the files it adds are only needed for specialist packages (such as Emacs modules) so you can start by removing the optional example files:

$ cd hello/debian
$ rm *ex *EX

Теперь нужно внести изменения в каждый из файлов.

В debian/changelog измените номер версии на версию для Ubuntu: 2.7-0ubuntu1 (версия в апстриме 2.7, версия в Debian 0, версия в Ubuntu 1). Также замените unstable на текущий разрабатываемый выпуск Ubuntu, например, precise.

Большая часть работы по сборке пакета выполняется серией сценариев, именуемой debhelper. Точное поведение debhelper изменяется с каждым новым старшим номером версии; файл compat инструктирует debhelper, какой версии должно соответствовать его поведение. Скорее всего, вы захотите указать самую новую версию, имеющую номер 8.

Файл control содержит все метаданные пакета. Первый абзац описывает пакет исходных кодов. Второй и следующие абзацы описывают двоичные пакеты, которые должны быть собраны. Нам понадобится добавить пакеты, необходимые для компиляции приложения в Build-Depends:. Для hello он должен включать, как минимум:

Build-Depends: debhelper (>= 8.0.0)

Также нужно заполнить описание программы в поле Description:.

copyright нужно заполнить в соответствии с лицензией на источник из апстрима. Согласно файлу hello/COPYING, это лицензия GNU GPL 3 или более поздняя её версия.

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

README.source и README.Debian необходимы, лишь если ваш пакет имеет какие-то нестандартные функции. У нас таких нет, так что можно удалить эти файлы.

source/format можно оставить как есть, он описывает формат версии пакета исходного кода, который должен быть 3.0 (quilt).

rules — самый сложный файл. Это Makefile, который компилирует код и превращает его в двоичный пакет. К счастью, основную часть работы в наши дни автоматически выполняет debhelper 7, так что универсальная цель % просто запускает сценарий dh, который делает всё, что необходимо.

Все эти файлы подробнее описаны в статье обзор каталога debian.

Finally commit the code to your packaging branch:

$ bzr commit -m "Initial commit of Debian packaging."

Сборка пакета

Теперь нам нужно проверить, что наши исходные файлы для пакета успешно компилируются и собираются в двоичный .deb-пакет:

$ bzr builddeb -- -us -uc
$ cd ../../

bzr builddeb — это команда для сборки пакета в его текущем местоположении. -us -uc сообщает что подписывать пакет с помощью GPG не требуется. Результат будет помещён в каталог «..».

Просмотреть содержимое пакета можно с помощью:

$ lesspipe hello_2.7-0ubuntu1_amd64.deb

Установите пакет и проверьте, работает ли он:

$ sudo dpkg --install hello_2.7-0ubuntu1_amd64.deb

Дальнейшие шаги

Even if it builds the .deb binary package, your packaging may have bugs. Many errors can be automatically detected by our tool lintian which can be run on both the source .dsc metadata file and the .deb binary package:

$ lintian hello_2.7-0ubuntu1.dsc
$ lintian hello_2.7-0ubuntu1_amd64.deb

Описание каждой проблемы, о которой он сообщает, можно найти на веб-сайте lintian.

After making a fix to the packaging you can rebuild using -nc “no clean” without having to build from scratch:

$ bzr builddeb -- -nc -us -uc

Убедившись, что пакет успешно собирается локально, вы должны проверить, правильно ли его сборка будет проходить в чистой системе, с помощью pbuilder. Поскольку вскоре мы собираемся загрузить его в PPA (персональный архив пакетов), эту загрузку нужно снабдить цифровой подписью, чтобы Launchpad мог удостовериться, что загрузку сделали вы (узнать о том, что загрузка будет подписана, можно по отсутствию передаваемых bzr builddeb флагов -us и -uc, которые мы использовали ранее). Для подписывания своей работы вам понадобится настроить GPG. Если вы ещё не настроили pbuilder-dist или GPG, сделайте это сейчас:

$ bzr builddeb -S
$ cd ../build-area
$ pbuilder-dist precise build hello_2.7-0ubuntu1.dsc

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

$ bzr push lp:~<lp-username>/+junk/hello-package

Uploading it to a PPA will ensure it builds and give an easy way for you and others to test the binary packages. You will need to set up a PPA in Launchpad and then upload with dput:

$ dput ppa:<lp-username> hello_2.7-0ubuntu1.changes

Смотрите раздел «Загрузка» для дополнительной информации.

You can ask for reviews in #ubuntu-motu IRC channel, or on the MOTU mailing list. There might also be a more specific team you could ask such as the GNU team for more specific questions.

Submitting for inclusion

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

  • Debian Mentors FAQ — debian-mentors является основным местом для создания, просмотра и загрузки в Debian новых пакетов. Здесь вы можете найти разработчика Debian для загрузки вашего пакета в архив.
  • Work-Needing and Prospective Packages — Информация о том, как подать “Intent to Package” и “Request for Package” заявки, а также список открытых ITP и RFP.
  • Debian Developer’s Reference, 5.1. New packages — весь документ бесценен для создателей пакетов как для Ubuntu, так и для Debian. Этот раздел документирует процессы по отправке новых пакетов.

В некоторых случаях может иметь смысл сначала отправить пакет непосредственно в Ubuntu. Например, если версия Debian находится в состоянии заморозки, что делает маловероятным своевременное попадание вашего пакета в новый выпуск Ubuntu. Этот процесс документирован в разделе “New Packages” вики-страниц Ubuntu.