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

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

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

## 6.1. Проверка программы

Первым этапом создания пакета является получение 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

## 6.2. Создание пакета

`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

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

In `debian/changelog` change the version number to an Ubuntu version: `2.7-0ubuntu1` (upstream version 2.7, Debian version 0, Ubuntu version 1). Also change `unstable` to the current development Ubuntu release such as `trusty`.

Much of the package building work is done by a series of scripts called `debhelper`. The exact behaviour of `debhelper` changes with new major versions, the compat file instructs `debhelper` which version to act as. You will generally want to set this to the most recent version which is `9`.

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

    Build-Depends: debhelper (>= 9)

Также нужно заполнить описание программы в поле `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."

## 6.3. Сборка пакета

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

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

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

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

    $ lesspipe hello_2.7-0ubuntu1_amd64.deb

Install the package and check it works (later you will be able to uninstall it using `sudo apt-get remove hello` if you want):

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

You can also install all packages at once using:

    $ sudo debi

## 6.4. Дальнейшие шаги

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 trusty 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>/<ppa-name> 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.

## 6.5. 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.

## 6.6. Sreenshots

Once you have uploaded a package to debian, you should add screenshots to allow propective users to see what the program is like. These should be uploaded to http://screenshots.debian.net/upload .