Создание deb-пакетов

Автор taem, 18 Июня 2012, 22:16

« предыдущая тема - следующая тема »

0 Пользователей и 1 Гость просматривают эту тему.

taem

Привет всем!

Кому-нибудь интересно создание пакетов для Debian? От начала и до его публикации? Мы могли бы здесь разобрать весь процесс создания.
Сначало думал сделать что-то типа howto, но честно говоря лень http://linuxforum.kz/public/style_emoticons/<#EMO_DIR#>/smile.gif\' class=\'bbc_emoticon\' alt=\':)\' /> Лучше на практике показать. Может кто-нибудь пытался создать пакет, но не получилось. Я могу ответить на вопросы.

sotrud_nik

Читать new maintainers guide о просветления

B@F

Цитата: taem от 18 Июня 2012, 22:16Привет всем!

Кому-нибудь интересно создание пакетов для Debian? От начала и до его публикации? Мы могли бы здесь разобрать весь процесс создания.
Сначало думал сделать что-то типа howto, но честно говоря лень http://linuxforum.kz/public/style_emoticons/<#EMO_DIR#>/smile.gif\' class=\'bbc_emoticon\' alt=\':)\' /> Лучше на практике показать. Может кто-нибудь пытался создать пакет, но не получилось. Я могу ответить на вопросы.
А почему бы нет. Вот к примеру, в репах есть remmina, но она там старая, хочу собрать пакет, который потом можно будет поставить на рабочую ось и что бы были все зависимости, но самое главное, что бы если в репах вдруг появится версия новее, то она автоматом апгрейдилась без проблем.


Начало думаю простое конфигурим, затем делаем make. А дальше? Я обычно делал chekinstall, но полученный пакет совсем далек от того что лежит в офф репах и уж темболее без зависимостей и без дальнейшего апгрейда..

Поправьте, если я ошибаюсь, буду тока рад.

TLemur

Цитата: taem от 18 Июня 2012, 22:16Привет всем!

Кому-нибудь интересно создание пакетов для Debian? От начала и до его публикации? Мы могли бы здесь разобрать весь процесс создания.
Сначало думал сделать что-то типа howto, но честно говоря лень http://linuxforum.kz/public/style_emoticons/<#EMO_DIR#>/smile.gif\' class=\'bbc_emoticon\' alt=\':)\' /> Лучше на практике показать. Может кто-нибудь пытался создать пакет, но не получилось. Я могу ответить на вопросы.

[font="Palatino Linotype"]1) Можно ли собирать пакеты для Debian и Ubuntu при помощи одного набор инструментов? Конкретно, можно ли собрать пакет для Debian sid при помощи набора инструментов который установлен по умолчанию в Ubuntu 11.10?

2) Всё равно, какую программу использовать для сборки бинарных файлов? Дело в том, что автор той программы, которую я хочу запаковать, использует не make/cmake, а Scons. Это никак не отразится на сборке пакета?

[/font][font="Palatino Linotype"]3) Заполняются ли секции Depends, Recommends, Suggests и иже с ними вручную (если вручную, то как?) или всё-таки программным способом?

Спасибо всем, кто ответит.
[/font]

taem

Цитата: B@F от 19 Июня 2012, 14:39А почему бы нет. Вот к примеру, в репах есть remmina, но она там старая, хочу собрать пакет, который потом можно будет поставить на рабочую ось и что бы были все зависимости, но самое главное, что бы если в репах вдруг появится версия новее, то она автоматом апгрейдилась без проблем.


Начало думаю простое конфигурим, затем делаем make. А дальше? Я обычно делал chekinstall, но полученный пакет совсем далек от того что лежит в офф репах и уж темболее без зависимостей и без дальнейшего апгрейда..
Для этого надо делать бэкпорт. В stable версия 0.8.3, в сиде 1.0.0-4.

Во-первых ставим пакеты, которые нужны для сборки пакетов: build-essential, fakeroot и devscripts

$ sudo aptitude install build-essential fakeroot devscripts
build-essential это метапакет устанавливающий пакеты необходимые для сборки пакетов (вот такой каламбур). Некоторые операции при сборке пакета требуют права рута, что не очень удобно. Чтобы этого избежать используется программа fakeroot. devscripts содержит полезные утилиты.

Теперь надо получить исходный код пакета. Можно использовать утилиту dget из пакета devscripts. Общий вид такой: dget <URL>, где URL это путь к файлу с расширением .dsc, который содержит характеристики пакета. Выполняем:

$ dget http://mirror-kt.neolabs.kz/debian/pool/main/r/remmina/remmina_1.0.0-4.dsc
В результате должны скачаться три файла:

remmina_1.0.0-4.debian.tar.gz
remmina_1.0.0-4.dsc
remmina_1.0.0.orig.tar.gz

Первый файл содержит исходный код пакета, третий - оригинальный архив программы. По-умолчанию, dget после скачивания должна распаковать оригинальный архив и наложить на исходный код программы изменения содержащиеся в первом файле. В результате появится каталог remmina-1.0.0 с подкаталогом debian. Если dget не распаковала исходники по каким-либо причинам, можно сделать это самостоятельно с помощью команды dpkg-source (из пакета dpkg-dev):

$ dpkg-source -x remmina_1.0.0-4.dsc
Следующая часть завтра http://linuxforum.kz/public/style_emoticons/<#EMO_DIR#>/smile.gif\' class=\'bbc_emoticon\' alt=\':)\' />

taem

Цитата: TLemur от 19 Июня 2012, 20:071) Можно ли собирать пакеты для Debian и Ubuntu при помощи одного набор инструментов? Конкретно, можно ли собрать пакет для Debian sid при помощи набора инструментов который установлен по умолчанию в Ubuntu 11.10?
Теоретически возможно. Это зависит от многих моментов, например: зависимости пакета, версии пакетов выполняющие сборку пакетов,  multiarch

Цитата: TLemur от 19 Июня 2012, 20:072) Всё равно, какую программу использовать для сборки бинарных файлов? Дело в том, что автор той программы, которую я хочу запаковать, использует не make/cmake, а Scons. Это никак не отразится на сборке пакета?

По-идее make, cmake и scons совершенно разные программы сборки. Нужно использовать ту программу, которая испольуется в апстриме или портировать на свою систему сборки, что наверное неразумно.

Цитата: TLemur от 19 Июня 2012, 20:073) Заполняются ли секции Depends, Recommends, Suggests и иже с ними вручную (если вручную, то как?) или всё-таки программным способом?

Вручную. Их заполняет мантейнер пакета. Сейчас уже поздно, завтра распишу как это делается.

TLemur

Цитата: taem от 19 Июня 2012, 22:29Теоретически возможно. Это зависит от многих моментов, например: зависимости пакета, версии пакетов выполняющие сборку пакетов, multiarch

По-идее make, cmake и scons совершенно разные программы сборки. Нужно использовать ту программу, которая испольуется в апстриме или портировать на свою систему сборки, что наверное неразумно.

Вручную. Их заполняет мантейнер пакета. Сейчас уже поздно, завтра распишу как это делается.

Хорошо, не буду экспериментировать. И так проблем будет много.
Scons странная система конечно http://linuxforum.kz/public/style_emoticons/<#EMO_DIR#>/smile.gif\' class=\'bbc_emoticon\' alt=\':)\' /> Но если автор апстрима ее выбрал, буду ее использовать.
Жду следующей серии.

B@F

Цитата: taem от 19 Июня 2012, 22:17третий - оригинальный архив программы.

Это то же самое, что и с офф сайта? А что делать если в репах нет такого пакета?


Жду с нетерпением продолжения, спасибо.

Поправьте, если я ошибаюсь, буду тока рад.

TLemur

Цитата: B@F от 20 Июня 2012, 12:06Это то же самое, что и с офф сайта? А что делать если в репах нет такого пакета?

Если в репах нету такого пакета, то

первый файл - оригинальный исходник + изменения, внесенные в исходный код для Debian
второй файл - подпись
третий файл - архив с оригинальным исходным кодом, создаваемый, например, из git/hg

B@F

Цитата: TLemur от 20 Июня 2012, 13:32Если в репах нету такого пакета, то

первый файл - оригинальный исходник + изменения, внесенные в исходный код для Debian
второй файл - подпись
третий файл - архив с оригинальным исходным кодом, создаваемый, например, из git/hg

Я имею ввиду, что нет никаких фалов, тока исходник с офф сайта скаченый через браузер в архиве tar.
Поправьте, если я ошибаюсь, буду тока рад.

taem

Продолжаем.

В настоящее время для создания пакетов в основном используется набор утилит под общим названием debhelper. Этот инструмент помогает автоматизировать некоторые шаги сборки, избавляя человека выполнять рутинные операции вручную или прибегать к самописным скриптам. Все команды набора начинаются с dh, сокращенно от DebHelper. remmina тоже использует его. Так же используется программа CDBS, сокращенно от Common Debian Build System, но все меньше с каждым годом.

Рассмотрим назначение файлов и директорий находящихся в каталоге debian

$ ls debian/
changelog  control    manpages  remmina-common.install        remmina-plugin-rdp.install        remmina-plugin-xdmcp.install  source
clean      copyright  menu      remmina-plugin-gnome.install  remmina-plugin-telepathy.install  remmina.1                     watch
compat     install    patches   remmina-plugin-nx.install     remmina-plugin-vnc.install        rules

changelog название говорит за себя - журнал версий пакета. Он должен соответствовать определенному формату.

clean этот файл использует команда dh_clean из пакета debhelper. В нем содержится список файлов и директорий, которые необходимо удалить после сборки пакета.

compat в этом файле указывается debhelper compatibility level. Он необходим для того, чтобы пакеты созданные с помощью старых версий дебхелпера собирались с новыми версиями последнего. Время от времени в работе дебхелпера происходят несовместимые со старыми версиями изменения. Полный список compatibility levels можно посмотреть в справке debhelper(7).

copyright этот файл содержит список авторов и лицензий на каждый файл в пакете. Debian очень серьезно относится к соблюдению копирайтов. При заполнении файла рекомендуют руководствоваться документом Machine-readable debian/copyright file.

install и *.install здесь указываются файлы и директории, которые будут включены в соответствующие бинарные пакеты. В данном случае, восемь бинарных пакетов и восемь соответствующих файлов. Файл install относится к пакету remmina. Эти файлы использует команда dh_install(1).

manpages содержит список man-файлов. В данном случае, файлы из этого списка будут только в бинарном пакете remmina. Команда dh_installman(1).

menu содержит конфиг для пакета menu. dh_installmenu(1).

remmina.1 видимо в апстриме нет man-страницы для программы, поэтому автор пакета создал ее. Debian Policy требует, что бы с каждым исполняемым файлом шла соответствующая справка в формате man(7).


Продолжение следует...

taem

Цитата: B@F от 20 Июня 2012, 12:06Это то же самое, что и с офф сайта?
Да.

Цитата: B@F от 20 Июня 2012, 12:06А что делать если в репах нет такого пакета?
Если в тестинге или сиде пакет с той же версией, нужно будет самостоятельно произвести изменения в исходнике пакета в соответствии с изменениями в новой версии программы. За основу можно взять исходник от текущего пакета.

TLemur

Цитата: taem от 20 Июня 2012, 22:13Так же используется программа CDBS, сокращенно от Common Debian Build System, но все меньше с каждым годом.

Означает ли это, что CDBS более не поддерживается (deprecated)?

sotrud_nik

Помнится компилял по молодости.
Берешь spec файл и как начнешь его править...

TLemur

Вопрос остается в силе: как заполнять секции Build-Depends и Depends?

taem

Цитата: TLemur от 21 Июня 2012, 16:59Означает ли это, что CDBS более не поддерживается (deprecated)?
Не совсем. Тут дело вот в чем. Debian разрабатывают добровольцы. Т.е. нет какого-либо органа, который бы указывал что делать и как это делать. Есть конечно нормативные документы, типа Debian Policy, которых должны придерживаться все причастные к разработке проекта. Иначе был бы хаос, сами понимаете. Касательно вопроса - debhelper vs cdbs, Debian Policy это не регламентирует. Каким способом автор создаст пакет отвечающий требованиям нормативных документов, мало кого должно волновать. Но. Debian это сообщество. Поэтому всем будет легче, когда есть какой-то единый инструмент помогающий создать пакет. Этим инструментом стал debhelper. Как с ним работать знает большинство разработчиков. Если какой-либо мантейнер забросил свой пакет, то другому будет легче его сопровождать если в нем используется debhelper.

Надеюсь нормально объяснил http://linuxforum.kz/public/style_emoticons/<#EMO_DIR#>/smile.gif\' class=\'bbc_emoticon\' alt=\':)\' />

taem

Цитата: TLemur от 22 Июня 2012, 11:45Вопрос остается в силе: как заполнять секции Build-Depends и Depends?
Да, скоро мы до них доберемся.

taem

Продолжаем.

watch в этом файле хранится URL, по которому можно определить вышла ли новая версия апстрима. Этот файл использует утилита uscan(1) из пакета devscripts. Есть веб-интерфейс.

control один из важных файлов. Он содержит необходимую информацию для архива Debian. Рассмотрим содержимое файла на примере из пакета remmina:

Source: remmina
Section: gnome
Priority: optional
Maintainer: Luca Falavigna <dktrkranz@debian.org>
Uploaders: Jean-Louis Dupond <jean-louis@dupond.be>
Build-Depends: debhelper (>= 9~),
 cmake (>= 2.6),
 libgtk-3-dev,
 libgcrypt11-dev,
 libssh-dev (>= 0.4),
 libvte-2.90-dev,
 libxkbfile-dev,
 libfreerdp-dev (>= 1.0),
 libtelepathy-glib-dev,
 libjpeg-dev,
 libgnutls-dev,
 libgnome-keyring-dev,
 libavahi-ui-gtk3-dev (>= 0.6.0),
 libvncserver-dev
Standards-Version: 3.9.3
Homepage: http://remmina.sourceforge.net/
Vcs-Git: git://git.debian.org/git/collab-maint/remmina.git
Vcs-Browser: http://git.debian.org/git/collab-maint/remmina.git

Package: remmina
Architecture: any
Depends: ${shlibs:Depends},
 ${misc:Depends},
 remmina-common (= ${source:Version}),
 dbus-x11
Recommends: remmina-plugin-rdp,
 remmina-plugin-vnc
Breaks: remmina-plugin-data (<= 0.9)
Replaces: remmina-gnome, remmina-xfce
Description: remote desktop client for GNOME desktop environment
 Remmina is a remote desktop connection client able to display and control a
 remote desktop session.
 .
 It supports multiple network protocols in an integrated and consistant user
 interface. Currently RDP, VNC, NX, XDMCP and SSH protocols are supported.

Package: remmina-common
Architecture: all
Depends: ${misc:Depends}
Recommends: remmina
Breaks: remmina (<< 1.0.0),
 remmina-plugin-data
Replaces: remmina (<< 1.0.0),
 remmina-plugin-data
Description: common files for remmina remote desktop client
 Remmina is a remote desktop connection client able to display and control a
 remote desktop session.
 .
 This package contains the common files.

Package: remmina-plugin-rdp
Architecture: any
Depends: ${shlibs:Depends},
 ${misc:Depends},
 remmina (= ${binary:Version}),
 libfreerdp-plugins-standard
Description: RDP plugin for remmina remote desktop client
 Remmina is a remote desktop connection client able to display and control a
 remote desktop session.
 .
 This package contains the RDP plugin for Remmina.

Package: remmina-plugin-vnc
Architecture: any
Depends: ${shlibs:Depends},
 ${misc:Depends},
 remmina (= ${binary:Version})
Description: VNC plugin for remmina remote desktop client
 Remmina is a remote desktop connection client able to display and control a
 remote desktop session.
 .
 This package contains the VNC plugin for Remmina.

Package: remmina-plugin-xdmcp
Architecture: any
Depends: ${shlibs:Depends},
 ${misc:Depends},
 remmina (= ${binary:Version}),
 xserver-xephyr
Description: XDMCP plugin for remmina remote desktop client
 Remmina is a remote desktop connection client able to display and control a
 remote desktop session.
 .
 This package contains the XDMCP plugin for Remmina.

Package: remmina-plugin-nx
Architecture: any
Depends: ${shlibs:Depends},
 ${misc:Depends},
 remmina (= ${binary:Version}),
 nxproxy
Description: NX plugin for remmina remote desktop client
 Remmina is a remote desktop connection client able to display and control a
 remote desktop session.
 .
 This package contains the NX plugin for Remmina.

Package: remmina-plugin-telepathy
Architecture: any
Depends: ${shlibs:Depends},
 ${misc:Depends},
 remmina (= ${binary:Version})
Description: Telepathy plugin for remmina remote desktop client
 Remmina is a remote desktop connection client able to display and control a
 remote desktop session.
 .
 This package contains the Telepathy plugin for Remmina.

Package: remmina-plugin-gnome
Architecture: any
Depends: ${shlibs:Depends},
 ${misc:Depends},
 remmina (= ${binary:Version})
Description: GNOME plugin for remmina remote desktop client
 Remmina is a remote desktop connection client able to display and control a
 remote desktop session.
 .
 This package contains the GNOME Keyring plugin for Remmina, which allows one
 to store and retrieve passwords from GNOME Keyring.

Файл состоит из блоков полей. Блоки разделяются пустыми строками. Первый блок содержит информацию о исходном пакете (source package). Остальные блоки описывают бинарные пакеты (binary package) получаемые сборкой исходного.

Поле состоит из имени поля и его значения, разделеных двоеточием. Обычно после двоеточия ставят пробел. Имя поля должно содержать символы только из кодировки US-ASCII, исключая символы управления, символы пробела, табуляции, перевода строки и т.п. (space characters) и двоеточие.

Комментарии обозначаются символом "#" в первой колонке строки.

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

Разберем поля первого блока (исходный пакет).

Source название исходного пакета.

Section раздел к которому относится пакет. На данный момент их три: main, contrib и non-free. В свою очередь эти разделы делятся на подразделы. Если пакет предназначен для раздела main, то его можно опустить, иначе записывается так: раздел/подраздел, например non-free/gnome. Пакеты предназначенные для раздела main должны отвечать требованиям The Debian Free Software Guidelines. В contrib идут пакеты зависящие от каких-либо файлов с несвободной лицензией, non-free - проприетарные пакеты. В официльные образы CD включены пакеты только из раздела main. Полный список подразделов

Priority приоритет по которому пользователь может определить, ставить пакет или нет: required, important, standard, optional, extra. required - пакеты без которых система не будет пригодна для использования. Обычно под этим подразумевают пакеты, от которых зависит функциональность пакетного менеджера dpkg, т.е. если в системе стоят только пакеты с этим приоритетом, то можно будет без проблем установить остальные пакеты для разворачивания функционала необходимого пользователю. important - пакеты, которые можно обычно найти на любой юникс-подобной системе, работа без которых была бы не очень удобной; обычно они ставятся на этапе установки базовой системы (в Debian Installer). standard - стандартные консольные утилиты. optional - такие пакеты как X-сервер, десктопные окружения и т.д. extra - пакеты, которые не могут быть отнесены к предыдущим категориям.

Пакеты не должны зависеть от пакетов у которых приоритет ниже его собственного.

Maintainer человек или группа людей, которые сопровождают пакет. Группа людей - это обычно команды со своим списком рассылки.

Uploaders здесь можно указать ко-мантейнера.

Standards-Version версия Debian Policy, требованиям которой отвечает пакет. Разработчику рекомендуется обновлять пакет debian-policy из unstable.

Homepage домашняя страница апстрима.

Vcs-* содержит URL на Version Control System, где мантейнер держит исходный пакет (подкаталог debian). * обозначает одно из следующих значений: arch, bzr, cvs, darcs, git, hg, mtn, svn.

Vcs-Browser содержит ссылку на веб-интерфейс Version Control System.

taem

Build-Depends в этом поле указывается список пакетов, которые необходимы для сборки пакета. Заполняет его мантейнер вручную. Указывать базовые пакеты необходимые для сборки программы типа "Hello World!" не нужно. Для этого существует пакет build-essential, который мы рассмотрели выше. Пакет build-essential указывать тоже не нужно. В данном случае для сборки пакета используется debhelper, версии не ниже (>=) 9. Далее идет список девелопмент-версий пакетов, т.е. список библиотек используемых в программе remmina. Список build-зависимостей как правило берется из апстрима. Наверное пересказывать документацию не буду (пересказывать честно говоря много). Если что-то непонятно, задавайте вопросы, обязательно отвечу.

Далее идет описание бинарных пакетов. Бинарный пакет обозначается ключевым словом Package.

Architecture здесь указывается архитектура для которой собирается пакет. Список всех архитектур можно посмотреть командой dpkg-architecture -L. Есть ключевые слова: any и all. any обозначает любую архитектуру, all - пакеты не зависящие от архитектуры, такие как: документация, картинки и т.д.

Description первой строкой указывается короткое (желательно информативное) описание пакета. На второй строке, со второй колонки - подробное описание.

taem

Debian Project Leader Stefano Zacchiroli представил отличную презентацию Debian.