divius 22.04.2010 10:48

How-to`sPPA своими руками с нуля. Часть 1. Введение в пакеты Debian. Сборка бинарного пакета

PPA своими руками с нуля. Часть I. Введение в пакеты Debian. Сборка бинарного пакета

Добрый день. В данной серии статей я расскажу вам, как создать собственный ppa на сервисе launchpad. Для тех, кто не в курсе: ppa (personal package archive) - киллер-фича сервиса launchpad.net, позволяющая каждому пользователю создавать личные репозиториями с пакетами для любой поддерживаемой версии Ubuntu. Всё, что нужно, это подготовить исходные коды и загрузить их на сервер, он сам соберёт из них пакеты для поддерживаемых архитектур (на данный момент это i386 и amd64). Рассказывать постараюсь буквально с нуля, чтобы было понятно даже тем, кто никогда не собирал пакеты для Debian. Я разобью статью на несколько частей, иначе размер статьи превысит всякие пределы.

Часть I.

Данную часть могут смело пропустить те, кто со сборкой пакетов Debian уже знаком.

1. Устройство пакета

Итак, что представляет пакет Debian. Давайте загрузим и разберёмся. Специально для тренировки новичков в Ubuntu есть пакет hello-debhelper. Да, да, это та самая программа helloworld, которую знают все начинающие программисты. Загружаем и копируем в рабочую директорию:

1
2
$ sudo apt-get install -d hello-debhelper
$ cp /var/cache/apt/archives/hello-debhelper_2.4-3_amd64.deb ./



Распаковываем и смотрим, что получилось:

1
2
3
4
5
6
7
$ ar x hello-debhelper_2.4-3_amd64.deb
$ ls -l
итого 80
-rw-r--r-- 1 divius divius 939 2010-04-22 09:27 control.tar.gz
-rw-r--r-- 1 divius divius 33244 2010-04-22 09:27 data.tar.gz
-rw-r--r-- 1 divius divius 4 2010-04-22 09:27 debian-binary
-rw-r--r-- 1 divius divius 34376 2010-04-22 09:24 hello-debhelper_2.4-3_amd64.deb



Файл debian-binary содержит версию формата пакета, на данный момент это "2.0". Файл data.tar.gz содержит сами файлы, которые требуется установить в систему, как-то так:

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
$ mkdir root
$ tar -xzf data.tar.gz -C root
$ ls -lR root/
root/:
итого 4
drwxr-xr-x 4 divius divius 4096 2009-11-05 11:13 usr

root/usr:
итого 8
drwxr-xr-x 2 divius divius 4096 2009-11-05 11:13 bin
drwxr-xr-x 5 divius divius 4096 2009-11-05 11:13 share

root/usr/bin:
итого 20
-rwxr-xr-x 1 divius divius 18816 2009-11-05 11:13 hello

root/usr/share:
итого 12
drwxr-xr-x 3 divius divius 4096 2009-11-05 11:13 doc
drwxr-xr-x 2 divius divius 4096 2009-11-05 11:13 info
drwxr-xr-x 3 divius divius 4096 2009-11-05 11:13 man

root/usr/share/doc:
итого 4
drwxr-xr-x 2 divius divius 4096 2009-11-05 11:13 hello-debhelper

root/usr/share/doc/hello-debhelper:
итого 20
-rw-r--r-- 1 divius divius 3378 2009-11-05 11:13 changelog.Debian.gz
-rw-r--r-- 1 divius divius 6410 2008-12-09 21:49 changelog.gz
-rw-r--r-- 1 divius divius 2246 2009-11-05 11:13 copyright
-rw-r--r-- 1 divius divius 1373 2008-12-09 21:48 NEWS.gz

root/usr/share/info:
итого 12
-rw-r--r-- 1 divius divius 11410 2009-11-05 11:13 hello.info.gz

root/usr/share/man:
итого 4
drwxr-xr-x 2 divius divius 4096 2009-11-05 11:13 man1

root/usr/share/man/man1:
итого 4
-rw-r--r-- 1 divius divius 679 2009-11-05 11:13 hello.1.gz



Обратите внимание на файлы, лежащие в директории /usr/share/doc/hello-debhelper. Эти файлы требуются стандартом пакетов Debian и часто не имеют прямого отношения к авторам самого проекта, а создаются теми, кто этот пакет поддерживает. Ваш пакет соберётся и без этих файлов, но ни в один приличный дистрибутив такой пакет не примут.

Самое интересное - файл control.tar.gz. Он содержит файлы, превращающие обычный архив в пакет Debian. Рассмотрим их поподробнее, с ними нам ещё придётся работать.

1
2
3
4
$ mkdir control
$ tar -xzf control.tar.gz -C control
$ ls control
control md5sums



Второй файл, как следует из его названия, содержит md5-хэши всех файлов в пакете. Он создаётся автоматически, поэтому о нём можно не задумываться. А вот первый файл содержит всю важную информацию о пакете.:

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ cat control/control 
Package: hello-debhelper
Version: 2.4-3
Architecture: amd64
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Santiago Vila <sanvila@debian.org>
Installed-Size: 648
Depends: libc6 (>= 2.3.4), dpkg (>= 1.15.4) | install-info
Conflicts: hello
Replaces: hello
Provides: hello
Section: devel
Priority: extra
Description: The classic greeting, and a good example
The GNU hello program produces a familiar, friendly greeting. It
allows non-programmers to use a classic computer science tool which
would otherwise be unavailable to them.
.
Seriously, though: this is an example of how to do a Debian package.
It is the Debian version of the GNU Project's `hello world' program
(which is itself an example for the GNU Project).
.
This is the same as the hello package, except it uses debhelper to
make the deb. Please see debhelper as to what it is.



С этим файлом мы будем иметь дело, поэтому я разберу его построчно, но только те поля, которые нам действительно пригодятся:
Package - имя пакета
Version - (вы не поверите!) версия пакета
Maintainer - тот, кто отвечает за пакет. В Debian здесь будет некое имя, а в Ubuntu, как видите, название группы.
Original-Maintainer - это поле присутствует только в пакетах для Ubuntu, в нём значится тот, кто отвечает за данный пакет в Debian.
Depends: зависимости пакета. Наш пакет требует libc6 версии не меньше, чем 2.3.4, dpkg версии не меньше, чем 1.15.4 или пакет install-info любой версии. На заметку: если вы хотите написать зависимость строго меньше какой-либо версии, надо писать так: hello (<< 2.5).
Description: описание.
Поля Conflicts, Replaces, Provides, Recommends и Suggests тоже полезны, но на первых порах без них можно обойтись.
Section: секция, которой будет отнесён ваш пакет. Секции можно посмотреть, например, здесь: http://packages.debian.org/squeeze/.hello-debhelper_2.4.orig.tar.gz - оригинальный tarball с исходным кодом программы
hello-debhelper_2.4-3.diff.gz - патч, представляющий собой изменения, сделанные авторами пакета
hello-debhelper_2.4-3.dsc - описание пакета и контрольные суммы его составляющих, подписанные автором пакета:

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$ cat hello-debhelper_2.4-3.dsc
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

Format: 1.0
Source: hello-debhelper
Binary: hello-debhelper
Architecture: any
Version: 2.4-3
Maintainer: Santiago Vila <sanvila@debian.org>
Standards-Version: 3.8.3
Build-Depends: debhelper (>= 7)
Checksums-Sha1:
fcbf0264928900adf03a7797474375e1a6fa3836 499638 hello-debhelper_2.4.orig.tar.gz
0ea70eb46b4c90a8dbefbe60bebe4b9f9abb2733 5308 hello-debhelper_2.4-3.diff.gz
Checksums-Sha256:
534745c4b7e063f5eb5f984609caf0f7c06d46df03e4d404f20996d28b6df1f7 499638 hello-debhelper_2.4.orig.tar.gz
7523406f7245ebdba5cb94e0890abfbdb7c7d72a319cc3d6af747b9373ecb54f 5308 hello-debhelper_2.4-3.diff.gz
Files:
1691faa758ca41c70b6da5501bdf230a 499638 hello-debhelper_2.4.orig.tar.gz
e2b37a62f6243f30258c5a9979911a06 5308 hello-debhelper_2.4-3.diff.gz

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)

iQEcBAEBCAAGBQJKml74AAoJEEHOfwufG4sysC4H/26EikyIgIqRuSXMiykc1hmd
97id9nWl+QzgCpUEg/+uDqEW+Bl6291FstGvzTFCwmB5JjH9ErH1LsyG1OLXbFUb
H89Em7qkl4o2ACTh255oM7FhVweof3UEaLCZMH+HZVVpHXNpEnhrfDvpTBbPGjUi
niiu/7QcGPdWeQITRl6DvfSE7Y6HLGm477uataLPq7RXsRhL2L2/LTk0jKyZtbB4
vdnnYBOzw6U9gAqBNQF5dHr1TmyqFmPqMUtarpNgY2M9LWcna1lZb6vIggbSj2fG
54dFJ9Vgg9Tt6s13w/vD9Vxsa2XYjI7WN7hChf2+wOcWIcj+9z8GnlBEjKbJz4Y=
=B3rj
-----END PGP SIGNATURE-----



Обратите внимание на поле Build-Depends. В нём представлены пакеты, требуемые для сборки нашего пакета (не путать в Depends, в котором указаны зависимости времени выполнения).

После загрузки этих трёх файлов apt-get распаковывает оригинальные исходники и накладывает патч Debian, то есть в директории hello-debhelper-2.4 у нас лежит уже готовое к работе дерево исходных кодов.

2. Сборка при помощи Debhelper

Debhelper - это набор утилит для облегчения жизни создателей пакета. Для начала соберём бинарный пакет из готового пакета с исходным кодом. Тут есть 2 варианта: собирать в своей рабочей среде и собирать в виртуальной среде.

2.1. Сборка бинарного пакета при помощи debuild



Для сборки при помощи утилиты со смешным для русского человека названием "debuild" нам потребуется установить пакеты, указанные в секции Build-Depends. Далее:

1
2
$ cd hello-debhelper-2.4
$ debuild



Сборка пакета происходит, но... в конец прерывается с ошибкой:

1
2
3
4
5
6
7
Now signing changes and any dsc files...
signfile hello-debhelper_2.4-3.dsc Santiago Vila <sanvila@debian.org>
gpg: пропущено "Santiago Vila <sanvila@debian.org>": секретный ключ не найден
gpg: /tmp/debsign.cUa2Cwwc/hello-debhelper_2.4-3.dsc: clearsign failed: секретный ключ не найден
debsign: gpg error occurred! Aborting....
debuild: fatal error at line 1261:
running debsign failed



Нам не удалось подписать пакет подписью того, кто в последний раз его изменял (что и не удивительно). В будущем мы будем подписывать пакеты своей подписью, а пока проинструктируем debuild не подписывать пакет.

1
$ debuild -us -uc



Обратите внимание на эти строки в конец вывода:

1
2
3
Now running lintian...
W: hello-debhelper source: missing-debian-source-format
Finished running lintian.



Здесь была вызвана утилита lintian, которая проверяет пакет на наличие ошибок. Помните, что пакет с серьёзными ошибками у вас нигде не примут. Как, кстати, и пакет без вашей цифровой подписи.

2.2. Сборка бинарного пакета при помощи pbuilder



Преимущество pbuilder в том, что он не требует изменения вашей основной системы: pbuilder собирает пакет в специально созданном виртуальном окружении. Такой способ сборки занимает немало времени, поэтому, возможно, имеет смысл сначала делать пробную сборку при помощи debuild. Итак, создайте заново директорию ubuntu с пакетом исходного кода.

Сначала надо создать базовую систему для сборки:

1
$ sudo pbuilder --create



Эта команда создаёт среду для сборки пакетов из секции main. Для нас это подходит, а вот если вы захотите собирать пакет, чьи зависимости находятся, например, в universe, вы можете обновить среду так:

1
$ sudo pbuilder --update --components "main universe" --override-config



Обновить список пакетов в базовой системе можно командой:

1
$ sudo pbuilder --update



Вот теперь можно заняться сборкой пакета:

1
2
$ cd ubuntu
$ sudo pbuilder --build hello-debhelper_2.4-3.dsc



Увы, но сборка накроется по той же причине: нет подписи. Не унывайте, подпись мы скоро создадим, а пока ограничимся сборкой при помощи "debuild".

2.3 Сборка пакета с исходным кодом из готового дерева



Если у вас есть дерево с исходным кодом, сделать из него пакет исходного кода проще простого:

1
2
$ cd ubuntu/hello-debhelper-2.4
$ debuild -S



3. Упражнения

Пока всё, ждите вторую часть ближе к вечеру. А чтобы вм не скучать, дам небольшое упражнение: в дереве исходных кодов есть директория debian, в ней - тот самый (почти) файл control. В нём хранятся описания одновременно для бинарного пакета и пакета с исходным кодом. Поменяйте описание и соберите новый пакет=)

А ещё изучите пакет gthumb: бинарный и пакет с исходным кодом, с ним мы будем работать, когда будем говорить о создании ppa.

P.S.
Пост получился несколько сумбурным, уж извините. Замечания и исправления очень приветствуются, на вопросы готов ответить.

P.P.S.
Продолжение


Тэги: deb debian ppa ubuntu
+ 20 -
Похожие Поделиться

divius 22.04.2010 10:51 #
Упс, а как здесь что-нибудь под кат убрать?
Shtsh 22.04.2010 11:04 #
тег
divius 22.04.2010 11:05 #
Он у меня открытым текстом появляется в посте.
Shtsh 22.04.2010 11:08 #
это только в превью так
divius 22.04.2010 11:09 #
Спасибо, разобрался
Username 22.04.2010 11:08 #
тег есть, смотри внимательнее. Не найдешь - модеры уберут под кат сами, не беда.
Username 22.04.2010 11:08 #
Посылаю множество лучей любви посту.
mirivlad 22.04.2010 11:45 #
В конце уберите лишний
divius 22.04.2010 11:46 #
done, спасибо
Данил Гребень 07.02.2011 19:12 #
Если у вас есть дерево с исходным кодом, сделать из него пакет исходного кода проще простого:

Черт, я уже литр йаду выпил и все стены головой продырявил, никак не вкурю, что имеется ввиду под "дерево исходных кодов", и где мне его достать! Бинарный пакет с подошью checkinstall собирается, а пакет с сорцами debuild-ом не хочет, ругается на отсутствующий файл debian/changelog.