Как из tar gz сделать deb
Перейти к содержимому

Как из tar gz сделать deb

  • автор:

Форум русскоязычного сообщества Ubuntu

Страница сгенерирована за 0.038 секунд. Запросов: 23.

  • Сайт
  • Об Ubuntu
  • Скачать Ubuntu
  • Семейство Ubuntu
  • Новости
  • Форум
  • Помощь
  • Правила
  • Документация
  • Пользовательская документация
  • Официальная документация
  • Семейство Ubuntu
  • Материалы для загрузки
  • Совместимость с оборудованием
  • RSS лента
  • Сообщество
  • Наши проекты
  • Местные сообщества
  • Перевод Ubuntu
  • Тестирование
  • RSS лента

© 2012 Ubuntu-ru — Русскоязычное сообщество Ubuntu Linux.
© 2012 Canonical Ltd. Ubuntu и Canonical являются зарегистрированными торговыми знаками Canonical Ltd.

K210.ORG

Debian

Краеугольный камень пакетной системы Debian — это deb-пакет (см. deb(5)), представляющий из себя архив формата ar, внутри которого содержится три файла:
1. debian-binary — текстовый файл, содержащий версию формата deb-пакета, в данный момент это 2.0. Программы, работающие с deb-пакетами, должны читать только первую строку этого файла и не падать, если минорная версия вдруг поменяется (например, станет 2.1).
2. control.tar.gz — служебная информация о пакете, скрипты, вспомогательные файлы (см deb-control(5)). Должен содержать только файлы, единственная папка, которая может присутствовать — «.» (текущая директория). В этот архив обязательно должен входить файл control, его минимальное содержимое рассмотрим чуть ниже.
3. data.tar — собственно файлы, устанавливаемые в систему. Чаще всего этот файл сжат каким-нибудь архиватором (поддерживаются расширения .gz, .xz, .bz2, .lzma), чаще всего в архивах встречается data.tar.gz.

Указанный порядок следования файлов в архиве обязателен. Если в этом архиве требуется разместить еще какие-нибудь файлы (не представляю, зачем это может кому-нибудь понадобиться), они должны находиться перед data.tar.gz, т.е. последний файл в архиве всегда data.tar. Но если сообщество когда-нибудь решит добавить в формат deb еще файлы, они будут помещены после data.tar.

Файл control в архиве control.tar.gz описывает назначение, версию и зависимости пакета, его формат более-менее подробно описан в deb-control(5). Пересказывать всю справку сейчас не буду, опишу лишь минимальное содержимое, необходимое для взаимодействия с инфраструктурой dpkg:

Package: имя пакета
Version: строка версии (при выборе политики назначения версий следует придерживаться deb-version(5))
Maintainer: John Doe (человек, поддерживающий пакет, а не автор программы)
Description: короткое описание пакета
Длинное описание, на несколько строк. Каждая строка, входящая в
длинное описание, должна начинаться с пробела

Работа с пакетами средствами ar

Теоретически данной информации должно быть достаточно, чтобы собрать простейший пакет «на коленке» и установить его в систему. Пусть наш пакет (назовем его test) просто добавляет в систему файл /usr/share/example-content/test со строчкой «test». Сделаем архив data.tar.gz со структурой папок и единственным файлом, а также файлик debian-binary:

$ mkdir -p usr/share/example-content/
$ echo test > usr/share/example-content/test
$ tar czf data.tar.gz usr
$ echo 2.0 > debian-binary

Создадим файл control со следующим содержанием:

$ cat control
Package: test
Version: 1.0
Maintainer: Dummy Maint
Description: test package
Test package created on my own knees.
$ tar czf control.tar.gz control

Теперь соберем все воедино:

$ ar -qS test-1.0.deb debian-binary control.tar.gz data.tar.gz

В текущем каталоге должен появиться файл test-1.0.deb . Его «физическое» содержимое можно просмотреть с помощью следующей команды:

$ ar t test-1.0.deb
debian-binary
control.tar.gz
data.tar.gz

Посмотреть файл debian-binary:

$ ar p test-1.0.deb debian-binary
2.0

Посмотреть список файлов в пакете:

$ ar p test-1.0.deb data.tar.gz|tar -tzf -
usr/
usr/share/
usr/share/example-content/
usr/share/example-content/test

Посмотреть содержимое файла control:

$ ar p test-1.0.deb control.tar.gz |tar -O -xzf - control
Package: test
Version: 1.0
Maintainer: Dummy Maint
Description: test package
Test package created on my own knees.

Можно установить этот пакет и убедиться, что файл /usr/share/example-content/test успешно создан, но лучше этого не делать, поскольку из-за недостатка информации в control в пакетной системе может появиться мусор:

$ sudo dpkg -i test-1.0.deb
Selecting previously deselected package test.
(Reading database . 97631 files and directories currently installed.)
Unpacking test (from test-1.0.deb) .
Setting up test (1.0) .

Работа с пакетами средствами dpkg-deb

Все вышеописанное позволяет управляться с deb-пакетами на самом низком уровне, не имея под рукой ничего, кроме стандартных средств Unix (доподлинно известно, что программа ar входила в состав первых Unix 1970х годов). Однако, как несложно догадаться, есть и более высокоуровневые способы создания пакетов и изучения их содержимого. В частности, если уж так необходимо поковыряться с пакетом на низком уровне, все вышеописанные действия настоятельно рекомендуется выполнять с помощью утилиты dpkg-deb(1).

Создание пакета средствами dpkg-deb

Минимальный формат вызова команды dpkg-deb для построения пакета следующий:

dpkg-deb -b исходная_папка

Все, что находится в исходной папке, кроме директории DEBIAN, помещается в data.tar.gz. Содержимое DEBIAN будет использовано для создания control.tar.gz, в частности, будет прочитан и проанализирован файл control и в случае каких-либо ошибок (отсутствует одно из необходимых полей или эти поля имеют неправильные значения) пакет просто не будет создан. Процесс создания нашего тестового пакета с нуля теперь выглядит так (в последней команде предполагается, что в текущей папке остался файл control от сборки пакета средствами ar):

$ mkdir -p test-1.1/usr/share/example-content/ test-1.1/DEBIAN
$ echo test 1.1 > test-1.1/usr/share/example-content/test
$ sed 's/Version: 1.0/Version: 1.1/g' control > test-1.1/DEBIAN/control

Попытаемся собрать пакет:

$ dpkg-deb -b test-1.1
warning, in file 'test-1.1/DEBIAN/control' near line 5 package 'test':
missing architecture
dpkg-deb: building package `test' in `test-1.1.deb'.
dpkg-deb: warning: ignoring 1 warnings about the control file(s)

Несмотря на отсутствие важного, но не необходимого поля Architecture, был создан пакет test-1.1.deb. Добавим поле и пересоздадим пакет:

$ sed -i "1a \
Architecture: all" test-1.1/DEBIAN/control

$ dpkg-deb -b test-1.1
dpkg-deb: building package `test' in `test-1.1.deb'

Еще одна немаловажная деталь. Как правило, в названии файла пакета указывается его архитектура, а команда dpkg-deb -b назвала файл по имени папки, из которой он был создан. Если бы папка называлась ololo, то мы получили бы ololo.deb. Чтобы файл пакета автоматически именовался в формате имя-версия-архитектура, при вызове dpkg -b необходимо указывать папку, куда будет положен итоговый архив, например, текущую. Тогда все компоненты имени файла будут извлечены из control:

$ cp -R test-1.1 ololo
$ dpkg -b ololo
dpkg-deb: building package `test' in `ololo.deb'.
$ dpkg -b ololo .
dpkg-deb: building package `test' in `./test_1.1_all.deb'.

Теперь всё относительно нормально, продолжаем изучение возможностей dpkg-deb на примере нового пакета.

Получение информации о пакете

Узнать версию формата deb, размер пакета и содержимое файла control:

$ dpkg -I test_1.1_all.deb 
new debian package, version 2.0.
size 644 bytes: control archive= 259 bytes.
160 bytes, 6 lines control
Package: test
Architecture: all
Version: 1.1
Maintainer: Dummy Maint
Description: test package
Test package created on my own knees.

Список файлов, устанавливаемых в систему (кроме служебных):

$ dpkg -c test_1.1_all.deb
drwxr-xr-x bvk/bvk 0 2010-10-22 13:21 ./
drwxr-xr-x bvk/bvk 0 2010-10-22 13:21 ./usr/
drwxr-xr-x bvk/bvk 0 2010-10-22 13:21 ./usr/share/
drwxr-xr-x bvk/bvk 0 2010-10-22 13:21 ./usr/share/example-content/
-rw-r--r-- bvk/bvk 9 2010-10-22 13:21 ./usr/share/example-content/test

Обратите внимание на владельца устанавливаемых файлов и каталогов: это не root, а некий пользователь. Чтобы исправить эту проблему, можно собирать пакеты из-под root’а, либо воспользоваться специальной утилитой fakeroot из одноименного пакета. Она перехватывает системные вызовы chmod(2) и stat(2) для файлов, и возвращает значения, как если бы файл принадлежал пользователю root. Небольшой пример:

$ id
uid=1000(bvk) gid=1000(bvk) .
$ touch trololo
$ ls -l trololo
-rw-r--r-- 1 bvk bvk 0 2010-10-22 13:23 trololo
$ fakeroot ls -l trololo
-rw-r--r-- 1 root root 0 2010-10-22 13:23 trololo

Думаю, принцип понятен. Пересоберем пакет еще более правильно:

$ fakeroot dpkg -b test-1.1 .
dpkg-deb: building package `test' in `test_1.1_all.deb'.
$ dpkg -c test_1.1_all.deb
drwxr-xr-x root/root 0 2010-10-22 13:25 ./
drwxr-xr-x root/root 0 2010-10-22 13:25 ./usr/
drwxr-xr-x root/root 0 2010-10-22 13:25 ./usr/share/
drwxr-xr-x root/root 0 2010-10-22 13:25 ./usr/share/example-content/
-rw-r--r-- root/root 9 2010-10-22 13:25 ./usr/share/example-content/test

Теперь наконец ок.

Можно получаить информацию о пакете в заданном формате:

$ dpkg-deb -W --showformat='$-$-$ ($)\n' test_1.1_all.deb
test-1.1-all (Dummy Maint )

Список полей, которые можно указать в –showformat, можно узнать из вывода команды dpkg-deb -I

Подать на STDOUT архив data.tar.gz из пакета (уже «разжатый»), может быть полезно для извлечения только некоторых файлов:

$ dpkg-deb --fsys-tarfile test-1.0.deb |tar -Ox usr/share/example-content/test
test

Перепаковка пакета

Пожалуй, теперь наступил момент применить свежеполученные знания на практике 🙂 Часто возникает следующая проблема: из некоего источника поступил пакет с некорректными зависимостями, например, требуется устаревший пакет, отсутствующий в системе и всех репозиториях, но доподлинно известно, что другой, уже установленный пакет предоставляет нужную функциональность. В скачанном пакете требуется изменить файл control, убрав или исправив зависимость. Правильно было бы скачать и распаковать исходник пакета (apt-get source), произвести необходимые изменения в скриптах сборки, установить все необходимые для пересборки библиотеки и окружение и т.д. и т.п., но для частного использования (т.е. без распространения по репозиториям) достаточно просто распаковать пакет, изменить необходимые файлы и запаковать обратно. Проиллюстрирую последовательность действий на примере невинного пакета hello:

$ aptitude download hello
Get:1 http://yum.fireground.ru/ubuntu/mirror/ maverick/main hello i386 2.5-1 [34.4kB]
Fetched 34.4kB in 0s (824kB/s)
# да-да, я сижу под убунтой и описываю debian
# распаковать содержимое пакета в папку hello (если не существует, будет создана):
$ dpkg-deb -x hello_2.5-1_i386.deb hello
# распаковать содержимое control.tar.gz в hello/DEBIAN
$ dpkg-deb -e hello_2.5-1_i386.deb hello/DEBIAN
# что-нибудь поменять в control, например, версию пакета:
$ sed -i 's/Version: .*$/Version: 2.5-1test/' hello/DEBIAN/control
# собрать новый пакет:
$ fakeroot dpkg -b hello/ .
dpkg-deb: warning: 'hello//DEBIAN/control' contains user-defined field 'Original-Maintainer'
dpkg-deb: building package `hello' in `./hello_2.5-1test_i386.deb'.
dpkg-deb: warning: ignoring 1 warnings about the control file(s)

Пакет собран. Убедиться, в том, что в нем нет ошибок из-за немного нетрадиционного способа сборки, можно с помощью программы lintian:

$ sudo aptitude install lintian
.
$ lintian hello_2.5-1test_i386.deb
$ echo $?
0

Об установке пакетов в систему, механизме зависимостей, структуре репозиториев и еще более правильных способах сборки пакетов читайте в следующих статьях 🙂

Описание процесса сборки пакета deb

Обновлено

Обновлено: 26.05.2023 Опубликовано: 11.08.2021

Данная инструкция является шпаргалкой по сборке пакетов для deb-систем (Debian, Ubuntu, Mint и так далее). Мы рассмотрим пример работы с исходниками nginx, а также разберем подробнее опции, которые можно задействовать при сборке. На практике, данное действие не имеет смысла, так как уже собранный nginx можно получить на сайте разработчика или в репозитории системы, но для нас важно понять процесс сборки, после чего можно будет применить данные знания для своих проектов.

Подготовка системы

Процесс сборки требует установки дополнительных компонентов, что приводит к скоплению мусора из ненужных пакетов. Рекомендуется делать сборку на отдельном компьютере или в контейнере Docker. Подробнее об установке последнего в инструкции Установка Docker на Linux. Независимо от среды, в которой мы будем собирать пакеты, необходимо выполнить предварительные настройки. 1. Установка пакетов:

apt update
apt install dpkg-dev devscripts equivs wget

  • dpkg-dev — содержит набор инструментов для работы с исходными файлами для пакетов deb.
  • devscripts — набор скриптов для сборки пакетов.
  • equivs — необходим для запуска утилиты mk-build-deps для установки зависимых пакетов.
  • wget — утилита для загрузки файлов по http. Нужна для загрузки архивов с исходниками.

2. Создание пользователя.

Делать готовые установочные сборки пакетов очень опасно от пользователя root. Если мы допустим ошибку с путями, файлы могут перетереть или удалить важные для работы директории. Стоит создать отдельного пользователя и работать под ним. Однако, если мы работаем в специальной виртуальной среде или контейнере Docker, нам это не страшно. Тогда данный пункт можно пропустить и работать из-под root.

useradd builder -m

* в данном примере мы создадим пользователя builder. Опция -m сразу создаст домашний каталог для пользователя.

Теперь заходим под данным пользователем — последующие команды мы будем выполнять от него:

3. Создадим каталог, в котором будет происходит сборка:

mkdir -p debbuild

Перейдем в debbuild:

Мы готовы к сборке.

Сборка из исходников

В нашем примере мы возьмем исходники для сборки nginx (для выполнения configure, make, make install . ) и соберем из них свой пакет для установки NGINX. Процесс будет разбит на несколько этапов:

  1. Предварительная настройка.
  2. Создание файлов с инструкциями для сборки пакета.
  3. Выполнение сборки и проверки.

Рассмотрим каждый из этапов подробнее.

Подготовка

Создадим каталог с названием собираемого приложения (с учетом версии):

mkdir -p nginx-1.20.1/debian

* в нем обязательно каталог debian.

Перейдем в созданный каталог:

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

Создание файлов сборки (основные)

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

1. Control-файл.

Это основной файл с описанием процесса сборки. Вводим:

Пример для нашего случая:

Source: nginx
Section: misc
Priority: optional
Maintainer: Dmitriy Moks
Build-Depends: libpcre3-dev,
zlib1g-dev
Standards-Version: 1.20.1
Homepage: https://nginx.org

Package: nginx
Architecture: amd64
Provides: nginx
Description: NGINX packages.
The description can be written in several lines.
Each line have to be 73 chars maximum.

* значения для опции Build-Depends задаются экспериментально — лучше всего попробовать сначала собрать требуемый пакет вручную, чтобы понять, какие потребуется доустановить пакеты. Рекомендуется это делать на чистой системе, чтобы не получить искаженный результат (на используемой системе уже могут быть пакеты, которых не будет на другом компьютере, где будет происходить сборка).
* более подробное описание файла control представлено ниже.

2. Файл changelog.

В данном файле описывается история изменений пакета. Также сборщик берет из этого файла номер версии и релиза.

Создаем файл командой:

nginx (1.20.1) stable; urgency=medium
* Initial release
— Dmitriy Mosk Tue, 03 Aug 2021 17:34:42 +0300

* в файле указано, что первые изменения внес Dmitriy Mosk 03 августа. Для начала сборки этого будет достаточно. Описание ниже.

3. Файл rules.

Описываем правила компиляции пакета во время его сборки. Создаем файл:

#!/usr/bin/make -f export DH_VERBOSE = 1 url='http://nginx.org/download/nginx-1.20.1.tar.gz' build_dir='nginx' override_dh_auto_clean: if [ ! -f $(build_dir) ]; then rm -rf $(build_dir); fi mkdir $(build_dir) dh_auto_clean override_dh_auto_configure: wget $(url) -O $(build_dir).tar.gz tar -xzf $(build_dir).tar.gz -C $(build_dir)/ --strip-components=1 rm -f $(build_dir).tar.gz cd $(build_dir) && ./configure override_dh_usrlocal: %: dh $@ --sourcedirectory=$(build_dir)/

* важно обратить внимание на факт, что содержимое файла может сильно отличаться в зависимости от того, что мы собираем и какой версии собираемое программное обеспечение. В данном примере мы создали файл для независимой работы — сборщик сам скачает исходник и распакует его в рабочий каталог (в данном примере, nginx). Также мне пришлось переопределить этап dh_usrlocal, так как на нем возникала ошибка, связанная с невозможностью удалить каталог командой rmdir.
* в нашей системе должен быть установлен wget, как и все остальные утилиты, которыми мы захотим воспользоваться.
* более подробное описание файла rules ниже.

4. Файл compat.

Указываем на уровень совместимости с debhelper (вспомогательный инструмент для сборки пакетов). Создаем файл:

* нам необходимо использовать версию в соответствии с версией Debian, на основе которой организован дистрибутив Linux, в котором идет сборка — в нашем примере 9. Сама по себе сборка без данного файла (или при указании версии ниже текущей, на дистрибутиве которого собирается пакет) запустится, но быстро остановится с ошибкой dh_auto_clean: Compatibility levels before 9 are deprecated (level X in use), где Х — текущий уровень совместимости.

Дополнительные файлы сборки

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

1. Файл postinst.

Является скриптом, который будет запущен после установки пакета на целевой системе. Любые постинсталляционные настройки можно выполнить с его помощью, например:

#!/bin/sh
# postinst script for dmosk
#
# see: dh_installdeb(1)

* в данном примере мы просто создадим учетную запись dmosk. Опция set -e говорит о том, что при возникновении ошибки, необходимо сразу прервать работу скрипта.

Может быть использован более сложный сценарий с обработкой аргументов, например:

case «$1» in
configure)
systemctl is-enabled —quiet nginx && systemctl disable nginx
;;

upgrade)
systemctl is-active —quiet nginx
;;

*)
echo «postinst called with unknown argument \`$1′» >&2
exit 1
;;
esac

* таким образом, при установке приложения посредством, например, команды apt upgrade, после инсталляции будет выполнена только команда sytemctls is-active —quiet nginx.

2. Файл postrm.

Это скрипт, который выполнится после удаления пакета:

#!/bin/sh -e
# postrm script for dmosk
#
# see: dh_installdeb(1)

case «$1» in
purge|remove|abort-install|disappear)
rm -rf /var/log/app
rm -rf /opt/app/test
;;

*)
echo «postrm called with unknown argument \`$1′» >&2
exit 1
;;
esac

* в данном примере мы предположили, что после удаления нужно удалить 2 каталога /var/log/app и /opt/app/test.

3. Файл preinst.

Скрипт выполнения перед установкой пакета.

4. Файл prerm.

Скрипт выполнения перед удалением пакета.

#!/bin/sh -e
# prerm script for dmosk
#
# see: dh_installdeb(1)

case «$1» in
purge|remove|abort-install|disappear)
systemctl is-active —quiet nginx && systemctl stop nginx &>/dev/null || :
;;

*)
echo «prerm called with unknown argument \`$1′» >&2
exit 1
;;
esac

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

У нас созданы все необходимые файлы, выполнены предварительные действия, и мы готовы к сборке.

Проверяем, что у нас установлены необходимые пакеты и, при необходимости, установим их:

* команда является частью пакета equivs, который мы установили в начале инструкции. Она читает опцию Build-Depends файла control и устанавливает необходимые пакеты.

Для запуска утилиты в тихом режиме (без запросов на подтверждения) команду можно ввести так:

echo yes | mk-build-deps -ri

Выполним сборку командой:

debuild -us -uc -b

Если мы все сделали правильно, в конце мы увидим что-то на подобие:

W: nginx: missing-depends-line
E: nginx: dir-in-usr-local usr/local/nginx/logs/
E: nginx: dir-in-usr-local usr/local/nginx/sbin/
E: nginx: file-in-usr-local usr/local/nginx/sbin/nginx
W: nginx: file-in-unusual-dir usr/local/nginx/sbin/nginx
Finished running lintian.

Пакет сформирован и должен находится в директории на уровень ниже:

Среди списка файлов мы должны увидеть пакет с нашим названием:

nginx-1.20.1 nginx_1.20.1_amd64.build nginx_1.20.1_amd64.changes
nginx-dbgsym_1.20.1_amd64.deb nginx_1.20.1_amd64.buildinfo nginx_1.20.1_amd64.deb

Пример сборки из исходных файлов

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

Предположим, у нас есть свое приложение, состоящее из нескольких рабочих файлов, документации и скриптов и нам нужно его упаковать в пакет для установки в каталог /opt.

И приведем его к виду:

#!/usr/bin/make -f #export DH_VERBOSE = 1 build_dir=debian/PKG_NAME PKG_PREFIX=/opt/PKG_NAME override_dh_install: mkdir -p $(build_dir)/$(PKG_PREFIX) || : mkdir -p $(build_dir)/usr/share/doc/PKG_NAME || : cp /PKG_SOURCE/install/* $(build_dir)/$(PKG_PREFIX)/ cp /PKG_SOURCE/DOC/* $(build_dir)/usr/share/doc/PKG_NAME/ cp /PKG_SOURCE/scripts/*.sh $(build_dir)/$(PKG_PREFIX)/ override_dh_fixperms: dh_fixperms find $(build_dir)/ -type f -exec chmod 644 <> \; find $(build_dir)/ -type d -exec chmod 755 <> \; chmod +x $(build_dir)/$(PKG_PREFIX)/*.sh chown root:root -R $(build_dir) %: dh $@

Остальные файлы и запуск сборки были нами рассмотрены выше. Мы же разберем подробнее, что происходит в текущем примере.

Предполагается, что исходные файлы нашего приложения находятся в каталоге /PKG_SOURCE. Нам нужно, чтобы рабочий пакет выполнял установку файлов в каталог /opt/PKG_NAME, а именно:

  • Все файлы из папки /PKG_SOURCE/install.
  • Все скрипты из папки /PKG_SOURCE/scripts.

Документацию из каталога /PKG_SOURCE/DOC мы должны поместить в /usr/share/doc/PKG_NAME (где PKG_NAME — название для нашего пакета).

Теперь по сценарию сборки. Мы переопределили поведение dh_install — создали каталоги для размещения файлов и документации. Обратите внимание, что сборка идет относительно базового каталога debian/.

Также мы немного поменяли выполнение dh_fixperms, а именно, всем файлам назвачили права 644, а всем каталогам 755. Скриптам мы добавили возможность запуска (+x).

Само собой, каждый конкретный пакет должен собираться по своему сценарию. В данном примере мы рассмотрели очень простой сценарий.

Описание служебных файлов

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

Control

Данный файл содержит основную информацию о собираемом пакете. Рассмотрим по отдельности обязательные опции и дополнительные.

Основные (без которых сборщик вернет ошибку):

Опция Описание Пример
Source Определяет имя пакета источника. nginx
Maintainer Имя и адрес электронной почты сборщика пакета. Dmitriy Moks
Package Имя собираемого пакета. nginx
Architecture Архитектура собираемого пакета. amd64

Дополнительные опции файла control:

Опция Описание
Section Классификация задачи, для которой может быть использовано приложение.
Чаще всего применяются: misc, utils, net, mail, text, x11.
Возможные значения: admin, base, comm, contrib, devel, doc, editors, electronics, embedded, games, gnome, graphics, hamradio, interpreters, kde, libs, libdevel, mail, math, misc, net, news, non-free, oldlibs, otherosfs, perl, python, science, shells, sound, tex, text, utils, web, x11.
Priority Определяет важность пакета для системы.
Возможные варианты: required, standard, optional, extra, important.
Влияет на поведение при удалении — например, пакет, отмеченный как required, не может быть удален.
Build-Depends Перечисляет список пакетов, которые требуются для сборки.
Если в системе не будет перечисленных пакетов, сборщик вернет ошибку.
Есть разные форматы записи, например:
1. Перечисляем зависимости: libpcre3-dev, zlib1g-dev
2. Используем логическое или: apache2 | httpd, php — в данном примере мы трубем, чтобы были установлены php и одни из веб-серверов (apache2 или httpd).
3. Указание версии: libpcre3-dev (= 13), zlib1g-dev (> 14),
apache2 (>= 15),
httpd ( < 16),
nginx ( (обратите внимание, данный перечень можно записать через запятую в одну строчку или по одной/несколько пакетов на каждой строчке также через запятую).
Standards-Version Указывает на версию пакета.
Homepage Домашняя страница для собираемого пакета.
Provides Имя пакета, под которым будет зарегистрировано приложение после установки. Как правило, указывается таким же, как и имя собираемого пакета. Но в редких случаях, может понадобиться поменять на свое.
Depends Список пакетов, которые требуются для установки собираемого пакета на конечной системе. Также как и в Build-Depends, возможен разный формат написания.
Description Произвольное описание для пакета. Необходимо проследить, чтобы размер одной строки не превышал 73 символа. Каждая последующая строка описания должна начинаться, как минимум, с одного пробела.

Полный перечень опций можно найти в официальном руководстве.

Rules

В данном файле мы задаем поведение при компиляции пакета. Как правило, его содержимое сводится к:

* отступы должны быть табуляциями, иначе система вернет ошибку.

. что означает, что все действия по установке пакета из исходника должны быть шаблонные.

При компиляции будет запущено три группы команд:

  1. debian/rules clean. Выполняет чистку каталога сборки и его подготовку.
  2. debian/rules build. Подготовка к сборке и сборка.
  3. debian/rules binary. Установка и создание бинарного пакета.

У каждой выше озвученной группы есть свои этапы, через которые проходит процесс сборки. Подробнее про данные этапы можно почитать на сайте debian.org.

Однако, для каждого из этапов мы можем переопределять поведение и задавать настройки (с помощью приставки override_ в файле). Рассмотрим примеры некоторых этапов и настроек.

Каталог источника

Задается с помощью параметра —sourcedirectory, например:

dh $@ --sourcedirectory=src/

* в данном примере мы укажем сборщику, что брать исходные файлы нужно в каталоге src (относительно рабочего каталога). При таком определении источника, не забываем заранее создать каталог (в данном примере, mkdir src).

override_dh_auto_configure

Выполняет конфигурирование. Нам может потребоваться изменить опции на свои, например:

override_dh_auto_configure: cd src/ && ./configure --prefix=/usr

* обратите внимание, что если у нас исходник находится в отдельном каталоге, мы должны перейти в него и сразу (&&) запустить команду для конфигурирования. Если эти команды ввести в разных строках, то мы получим ошибку — перед выполнением каждой команды сборщик возвращается в исходную директорию.

dh_auto_build

На данном этапе выполняется сборка (make). Можно перед этим процессом закачивать исходник и распаковывать его в каталог src:

override_dh_auto_build: dh_auto_build -- PG_CONFIG=/opt/pgpro/std-11/bin/pg_config

* в конечном итоге, мы запускаем тот же dh_auto_build, но с передачей дополнительной опции.

dh_auto_test

Выполняем цель test файла Makefile. Иногда, в процессе сборки пакета на данном этапе возвращается ошибка, хотя сама по себе компиляция и сборка прошли корректно. В таком случае, этап можно пропустить:

override_dh_auto_test:

* для пропуска любого из этапов просто вставляем соответствующую строку с пустым перечнем действий.

dh_auto_install

На данном этапе выполняется установка пакета (make install). Рассмотрим такой пример:

override_dh_auto_install: dh_auto_install -- PG_CONFIG=/opt/pgpro/std-11/bin/pg_config

* такая настройка выполнит установку, передав команде make install дополнительный параметр PG_CONFIG=/opt/pgpro/std-11/bin/pg_config. На практике, эта опция задает путь расположения конфига postgresql pro.

dh_fixperms

Задает стандартные права на файлы. Мы же можем захотеть назначить свои или отдельного владельца, например:

override_dh_fixperms: dh_fixperms chown nginx:nginx -R nginx

* в данном примере всем файлам внутри каталога будет задан владелец пользователь nginx. Обратите внимание, что мы сначала позволяем системе выставить права по своему алгоритму (dh_fixperms), после чего выполняем свою команду.

override_dh_gencontrol

Позволяет переопределить некоторые опции в файле control, например:

override_dh_gencontrol: dh_gencontrol -- -DSource="$(PKG_NAME)" -DDepends:"$(DEPENDS)"

* в данном примере мы меняем значения некоторым полям:

Сами переменные мы можем передать при запуске сборки. Подробнее процедура описана ниже.

Changelog

Файл используется системой сборки для получения номера версии пакета, его ревизии, срочности и раздела. Также в него можно заносить список изменений.

Типичный пример для файла:

gentoo (0.9.12-1) unstable; urgency=medium

* Initial release. (Closes: #nnnn)

— Josip Rodin Mon, 22 Mar 2010 00:37:31 +0100

  • первая строчка указывает на:
    • имя пакета (gentoo).
    • версию (0.9.12-1).
    • релиз (unstable).
    • важность пакета (urgency=medium).

    Описание дополнительных файлов

    Ранее мы уже говорили о таких файлах, как:

    • postinst — скрипт для запуска после установки пакета на целевой системе.
    • postrm — выполнится после удаления пакета.
    • preinst — скрипт выполнения перед установкой пакета.
    • prerm — скрипт выполнения перед удалением пакета

    Это дополнительные файлы, которые помогут нам сделать пакет более функциональным и удобным.

    Рассмотрим некоторые дополнительные файлы.

    Conffiles

    Позволяет отметить файлы как конфигурационные. Такие файлы не будут удалены при деинсталляции пакета или заменены при обновлении. Важно знать, что программа dh_installdeb, которая помечает файлы как конфигурационные автоматически делает отметку для содержимого каталога /etc. Поэтому, нам не нужно создавать conffiles, если наши конфиги находятся в каталоге /etc.

    Пример содержимого файла:

    $mypackage.links

    Название файла состоит из названия пакета + .links. Позволяет создать символьные ссылки при установке пакета. Например:

    * в нашем примере будет создаваться симлинк /usr/bin/mybin из файла /opt/package_name/mybin.

    Дополнительно

    В данном разделе опишем некоторые полезные возможности.

    1. Передача переменной.

    При запуске сборки может понадобиться передать переменную, значение которой будет использоваться в нашем скрипте rules. Это делается с помощью опции -e:

    debuild -eRELEASE=Ubuntu -eVERSION=22.04 -us -uc -b

    * в нашем примере мы передали 2 переменные release и version.

    В файле rules можно использовать данные переменные, например:

    echo $(RELEASE)
    echo $(VERSION)

    * применение не самое практичное, но для нашего примера достаточно.

    2. Команда для редактирования Changelog.

    Как было сказано выше, файл Changelog нужен для описания верий и изменений пакета. Для упрощения автоматизации работы со сборками, есть команда dch, которая сама вносит изменения в данный файл.

    dch -m -v «1.5.5» -D «stable» «Fix errors»

    . добавит строку с версией 1.5.5 и описанием Fix errors.

    А если у нас нет файла debian/changelog, то его также можно создать с помощью команды dch:

    dch —create —package pkg_name -m -v «1.5.5» -D «stable» «Fix errors»

    Возможные ошибки

    Рассмотрим некоторые проблемы, с которыми мы можем столкнуться в процессе сборки пакетов deb.

    1. dpkg-shlibdeps: error: cannot find library

    Причина: после сборки и установки пакетов сборщик проверяет наличие библиотек, которые нужны устанавливаемым файлам. На основе этого строятся зависимости при установке нашего собираемого пакета. Однако, хелпер shlibdeps ищет только в известных ему местах, а необходимые библиотеки могут располагаться в альтернативных каталогах, например /opt.

    Решение: мы можем переопределить запуск хелпера shlibdeps, указав ему пути, где нужно искать библиотеки:

    override_dh_shlibdeps:
    dh_shlibdeps -l /usr/local/lib -l /usr/local/lib64 -l $(shell pwd)/debian/lib

    * в нашем примере мы указали три каталога, где нужно выполнить поиск — /usr/local/lib, /usr/local/lib64 и lib, которая находится в рабочем каталоге debian.

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

    Дистрибутивы, основанные на Debian – это не только отличная система управления пакетами APT, которая сама разрешает зависимости, но и удобные инструменты для создания пакетов и своих репозиториев. Если уж вы решились собрать программу из исходников, то советую ещё изучить, как дебианизировать исходники. Это отнимет чуть больше времени, чем стандартное

    ./configure && make && make install

    но зато позволит сохранить систему в чистоте. Удалить программы, установленные командой make install, можно только командой

    make uninstall

    но не все исходники это поддерживают, а что ещё чаще — исходники удаляют после установки, тогда удалить программу можно только вручную. Но чтобы это сделать, нужно точно знать что и куда установилось. А это уж точно никто не знает, кроме самих разработчиков программы (ну или тех, кто более-менее разбирался в исходниках программы).

    Ну и что? Главное — работает!

    APT не знает ничего о программах, установленных вручную. Соответственно, могут быть конфликты, или просто непонятные ошибки.

    Очень часто исходники по умолчанию «рассчитаны» на определённый дистрибутив, или, наоборот, рассчитаны только на установку из исходников, при этом выполняются разного рода «удобные» настройки в конфигурационных файлах. Так, например, очень любят прописывать mime-типы. Но проблема в том, что переводы разные бывают и в Nautilus может выскочить ошибка

    "Имя файла показывает, что файл является типом файла . Содержимое файла показывает, что файл является файлом типа "

    и документ не будет открываться. Таких «недочётов» может быть очень много. А теперь, если представить что это удалить нельзя, поскольку пользователь не запоминал что и куда поставилось, наступает паника и как результат — переустановка.

    Но как быть, если программу хочется поставить, а версия в deb-пакете устарела, или такой вообще нет?
    Есть два выхода:

    Использовать программу checkinstall . Она собирает всё в один пакет. К сожалению, она позволяет решить только вопрос с удалением программы. И даже если APT будет знать, что программа установлена, он в лучшем случае сообщит, что есть конфликт файлов,

    файл /some/path/to/some/file уже есть в пакете "имя пакета собранного с помощью checkinstall"

    Чаще всего такие случаи очень корректно разрешаются путём удаления конфликтного пакета. Но на разбор ситуации уйдёт некоторое время.

    :-)

    Cобрать нормальный пакет, как это делают мантейнеры. В котором будет корректная версия, зависимости и расположение файлов будет соответствовать политике дистрибутива. Вижу вам всё ещё интересно . Это радует.

    Классификация случаев сборки

    Возможны следующие случаи сборки пакетов:

    сборка из исходников;
    сборка из бинарных файлов;

    исходники или бинарные файлы берутся:

    не из репозитория;
    из репозитория другого дистрибутива;
    из репозитория другого выпуска Ubuntu, из PPA или из Debian;
    из репозитория текущего выпуска Ubuntu;
    недоступна;
    берётся из репозитория Ubuntu, из PPA или из Debian:
    из другой версии программы;
    из текущей версии программы:
    не из репозитория текущего выпуска Ubuntu;
    из репозитория текущего выпуска Ubuntu;
    ни в репозитории Ubuntu текущего выпуска, ни в PPA нет нужной версии программы;

    доступная версия программы по каким-либо причинам не устраивает (не устраивает код или данные программы, параметры конфигурации или управляющая информация пакета);

    и то, и другое.

    Сборка из исходников

    Дано: некий исходник gcoolprog-0.5.3.tar.bz2. Нужно из него собрать пакет.
    Решение: ниже идёт вариант, как я обычно поступаю в таком случае.

    Первым делом смотрю, нет ли deb-пакета той же версии, но допустим под Debian. Если есть делаю так: есть нужная версия пакета в репозитории debian или в будущем релизе Ununtu

    Если нет той же версии, но есть предыдущей. Тут можно сказать как повезёт, если изменения в исходниках не коснулись положения файлов, то скорее всего дебианизация от старого пакета подойдёт, нужно лишь сменить версию. Теперь вариант в репозитории есть пакет предыдущей версии.

    Ну и самый страшный случай — нигде никаких deb-пакетов нет, только tar.gz и rpm. Ни в коем случае не использовать rpm! Делаем по первому варианту.

    Что необходимо

    Полное Руководство начинающего разработчика Debian доступно тут.

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

    Нам понадобятся как минимум программы, устанавливаемые командой

    sudo apt-get install autoconf automake libtool autotools-dev dpkg-dev fakeroot

    Можно так же autobook — это документация по утилитам GNU Autoconf , Automake , и Libtool . Ну и конечно то, что требуют сами исходные коды для корректной сборки.

    Создание ключа шифрования

    Этот шаг не обязателен, его можно пропустить.

    Чтобы создать ключ, зайдите в Приложения → Стандартные → Пароли и ключи шифрования. В открывшемся окне, в меню Ключ → Новый ключ, выбираем ключ pgp. Заполняем поля Полное имя и Электронный адрес.

    :-)

    В мире свободного программного обеспечения, для предотвращения «краж» или «подделок», принято подписывать свои «ценные» вещи электронным ключом, открытая часть которого хранится на общедоступных серверах и позволяет другим пользователям легко выяснить подлинность и целостность той или иной вещи.
    Поэтому отнеситесь к созданию ключа очень ответственно.
    Никто вас не заставляет вписывать сюда реальные имя и фамилию, или ещё какие-нибудь личные данные, но если вас не разыскивает интерпол — думаю указать фамилию и имя будет верным решением, хотя можно и просто свой ник В общем, решайте сами. А вот почтовый адрес укажите реальный, и который вы не поменяете.

    Можно завести ящик, если ещё нет, на каком-нибудь популярном почтовом сервере: например, gmail.com или yandex.ru .
    Это позволит в будущем легко связаться с вами человеку, который вас не знает, но по той или иной причине встретил «вещь», подписанную вами.
    Далее вас спросят ввести пароль, как дополнительную защиту. Он может быть полезен, если вы будете использовать закрытый ключ на машинах, которым вы не можете на 100% доверять. Обратная сторона — вам придётся вводить пароль каждый раз, как только вы будете что-то подписывать.

    Хотя последняя версия программы seahorse имеет демон, который автоматически запускается в сеансе GNOME, и умеет «запоминать пароль» на время сеанса, но пока не все программы умеют с ней работать.

    Итак, вы создали ключ — теперь его можно будет использовать при создании пакетов.
    Для этого, в файл ~/.bashrc, или в другой стартовый скрипт, вашего любимого шелла (для zsh ~/.zshrc), нужно вписать переменные

    export DEBEMAIL=ваш@имейл

    На основании e-mail будет искаться ключ в pgp, при подписи пакета.
    Нужно завершить сеанс и зайти заново, чтобы изменения вступили в силу.
    Помните, что если вы бэкпортируете пакет, дебианизированный не вами, обязательно нужно изменить версию командой

    dch -i

    для того, чтобы в изменения вписался ваш e-mail. А для того, чтобы ваш открытый ключ попал на сервер, необходимо в настройках «seahorse → Пароли и ключи шифрования», настроить соединение с сервером публичных ключей.
    Для этого, в меню Правка→Параметры на закладке Публикация ключей необходимо поставить галку Публиковать ключи….
    Теперь можно выбрать ключ и в меню по правой кнопке выбрать Синхронизировать и опубликовать ключи.

    Дебианизация недоступна

    Итак, у нас есть только gcoolprog-0.5.3.tar.gz.

    Обычно я выполняю следующие действия:

    Предварительно подготавливаю рабочую директорию

    mkdir ~/src/gcoolprog mkdir ~/src/gcoolprog/0.5.3 cd ~/src/gcoolprog/0.5.3 wget "http://" #можно конечно и просто через браузер скачать но обычно так быстрее

    Получаем файл gcoolprog-0.5.3.tar.gz. Распакуем его перейдем в полученный каталог:

    tar zxvf gcoolprog-0.5.3.tar.gz cd gcoolprog-0.5.3

    Для корректной сборки нужно, чтобы корневая директория содержала не только название, но и версию!

    Ниже будем считать директорию ~/src/gcoolprog/0.5.3/gcoolprog-0.5.3 корневой директорией исходников.
    Далее выполняем «черновую» сборку. Т.е. сконфигурируем и соберем приложение, без его установки:

    ./configure --prefix=/usr && make 

    Если команда выполнилась успешно, то осталось только дебианизировать.

    Дебианизация

    Ничего страшного в этом нет, как я уже говорил есть скрипты, которые сильно упрощают этот процесс.
    Вообще смысл всей этой процедуры — создать директорию debian в корне исходников, с нужными файлами конфигурации и скриптом(ами).
    Для этого, в корне исходных текстов, выполним

    dh_make --createorig

    На что мы должны получить следующий диалог

    Type of package: single binary, multiple binary, library, kernel module or cdbs? [s/m/l/k/b] s Maintainer name : denis Email-Address : Ubuntu_user@mail.ru Date : Mon, 13 Aug 2007 12:40:33 +0400 Package Name : gcoolprog Version : 0.5.3 License : blank Type of Package : Single Hit to confirm:

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

    Но мы с вами молодцы и всё у нас прошло без ошибок — появился каталог debian в корне исходников, посмотрев его содержимое, Вы увидите кучу файлов (расширение .ex) с примерами на все случаи жизни.

    Будем считать, что программа у нас простая – обычно ни один из этих файлов не нужен.
    Первым делом, нужно добавить описание программы в файле debian/control

    Description:

    Вместо и (без угловых кавычек) нужно вписать описание, что это за программа.
    Именно эти сведения увидит пользователь, когда посмотрит описание пакета.
    Второй момент — это поправить файл debian/rules
    в секции binary-arch: нужно раскомментировать (т.е. убрать # в начале строки)

    dh_install

    без этого мы получим пустой пакет.
    Иногда debian/rules содержит лишь:

    Что приемлемо с использованием debhelper.
    Этих настроек будет достаточно для сборки пакета с одной программой, которая не содержит разделяемых библиотек, т.е. только бинарник в /usr/bin и данные в /usr/share.

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

    Теперь, соберём пакет:

    dpkg-buildpackage -rfakeroot

    В директории выше, т.е. в ~/src/gcoolprog/0.5.3, мы получим файлы

    gcoolprog_0.5.3-1.diff.gz gcoolprog_0.5.3-1_i386.changes gcoolprog_0.5.3-1_i386.deb gcoolprog_0.5.3.orig.tar.gz

    Вот теперь мы можем установить пакет

    dpkg -i *.deb

    Дебианизация берётся из репозитория Ubuntu, из PPA или из Debian

    Дебианизация берётся из другой версии программы

    В этом случае, очень удобно взять дебианизацию оттуда и поправить для новой версии.

    Как я уже сказал, возможно нам повезёт и достаточно будет только сменить версию. Но не будем гадать.

    Ниже я не буду комментировать то, что описано в предыдущем решении.

    Предварительно подготовим рабочую директорию

    mkdir ~/src/gcoolprog mkdir ~/src/gcoolprog/0.5.3 cd ~/src/gcoolprog/0.5.3 wget "http://"

    получаем файл gcoolprog-0.5.3.tar.bz2

    bunzip2 gcoolprog-0.5.3.tar.bz2 gzip gcoolprog-0.5.3.tar mv gcoolprog-0.5.3.tar.gz gcoolprog_0.5.3.orig.tar.gz

    теперь распаковываем его

    tar zxvf ./gcoolprog_0.5.3.orig.tar.gz

    скачиваем предыдущую версию с http://packages.ubuntu.com или http://packages.debian.org, файл gcoolprog_0.5.1.diff.gz (в самом низу в секции More Information on gcoolprog)

    wget "http://archive.ubuntu.com/ubuntu/pool/universe/g/gcoolprog/gcoolprog_0.5.1.diff.gz" gunzip gcoolprog_0.5.1.diff.gz patch -p0 ./gcoolprog_0.5.1.diff
    ~/src/gcoolprog/0.5.3/gcoolprog-0.5.1/debian

    копируем каталог gcoolprog-0.5.1/debian в директорию ~/src/gcoolprog/0.5.3/gcoolprog-0.5.3

    cp -a ~/src/gcoolprog/0.5.3/gcoolprog-0.5.1/debian ~/src/gcoolprog/0.5.3/gcoolprog-0.5.3

    дальше нам нужно изменить версию командой

    dch -i

    этой командой изменяется файл debian/changelog например увидим

    gcoolprog (0.5.1-1ubuntu2) feisty; urgency=low * -- denis ubuntu_user@mail.ru> Mon, 13 Aug 2007 14:13:27 +0400

    но поскольку у нас версия 0.5.3, то нужно изменить значения на

    gcoolprog (0.5.3-1ubuntu1) feisty; urgency=low * New upstream release. -- denis ubuntu_user@mail.ru> Mon, 13 Aug 2007 14:13:27 +0400

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

    dpkg-buildpackage -rfakeroot
    cd .. ls -1 gcoolprog_0.5.3-1.diff.gz gcoolprog_0.5.3-1_i386.changes gcoolprog_0.5.3-1_i386.deb gcoolprog_0.5.3.orig.tar.gz dpkg -i *.deb

    Дебианизация берётся из текущей версии программы

    Дебианизация берётся не из репозитория текущего выпуска Ubuntu

    Для Debian нужно использовать сайт http://packages.debian.org, для Ubuntu — http://packages.ubuntu.com. Тогда, например, в Ubuntu ищем пакет gcoolprog в репозитории будущего релиза.

    Предварительно подготовим рабочую директорию

    mkdir ~/src/gcoolprog mkdir ~/src/gcoolprog/0.5.3 cd ~/src/gcoolprog/0.5.3

    теперь скачиваем три файла

    wget http://archive.ubuntu.com/ubuntu/pool/universe/g/gcoolprog/gcoolprog_0.5.3-1.dsc wget http://archive.ubuntu.com/ubuntu/pool/universe/g/gcoolprog/gcoolprog_0.5.3.orig.tar.gz wget http://archive.ubuntu.com/ubuntu/pool/universe/g/gcoolprog/gcoolprog_0.5.3-1.diff.gz

    или тоже самое, но одной командой

    dget http://archive.ubuntu.com/ubuntu/pool/universe/g/gcoolprog/gcoolprog_0.5.3-1.dsc

    из пакета devscripts
    затем распакуем командой

    dpkg-source -x ./gcoolprog_0.5.3-1.dsc

    получим каталог gcoolprog-0.5.3.Перейдём в него и сменим версию:

    cd gcoolprog-0.5.3 dch -i
    gcoolprog (0.5.3-1ubuntu1) feisty; urgency=low * backport from gutsy -- denis ubuntu_user@mail.ru> Mon, 13 Aug 2007 14:13:27 +0400

    теперь можно собирать пакет

    dpkg-buildpackage -rfakeroot
    cd .. ls -1. gcoolprog_0.5.3-1.diff.gz gcoolprog_0.5.3-1_i386.changes gcoolprog_0.5.3-1_i386.deb gcoolprog_0.5.3.orig.tar.gz dpkg -i *.deb
    Дебианизация берётся из репозитория текущего выпуска Ubuntu

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

    Для сборки понадобятся следующие пакеты: build-essential devscripts fakeroot. Потребуются также пакеты для разработки, мы их установим в дальнейшем.

    cd ~/src apt-get source gcoolprog

    apt-get source скачивает исходники из репозитория Ubuntu в текущую директорию. Многие пакеты в репозитории имеют общие друг с другом исходники, поэтому кроме исходников выбранного пакета могут скачаться и исходники других пакетов (общие для нескольких пакетов исходники).

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

    Устанавливаем необходимые для сборки пакеты для разработки:

    sudo apt-get build-dep gcoolprog
    cd gcoolprog-0.5.3 debuild -b -us -uc

    debuild следует запускать в директории исходников. Параметры -b -us -uc передаются программе dpkg-buildpackage. Первый требует собирать только бинарные пакеты, второй и третий — не подписывать цифровой подписью, соответственно, пакет исходников и файл .changes. Получившиеся в результате сборки пакеты будут в директории на один уровень выше.

    Сборка из бинарных файлов

    Ниже идёт пример как можно поступить в случае, если доступен только deb-пакет и нет его дебианизированных исходников.

    Для начала советую прочитать это. И это. Тут полная документация на русском.

    Предположим, что работаем в каталоге ~/tmp. Создадим подкаталог ~/tmp/someprog, чтобы распаковать файлы какого-нибудь пакета, нужно выполнить

    dpkg -x ~./tmp/some-prog-123.deb ./someprog

    Для того, чтобы извлечь контрольную информацию, выполним

    mkdir ~/tmp/someprog/DEBIAN dpkg -e ~/tmp/some-prog-123.deb ./someprog/DEBIAN

    ну а теперь, чтобы всё это собрать обратно в пакет, нужно выполнить

    dpkg -b ./someprog ~/tmp/some-prog-123-new.deb

    В каталоге ~/tmp/someprog/DEBIAN содержатся файлы, описывающие, что это за пакет, от чего он зависит, и контрольные суммы файлов, находящихся в нём. Для того, чтобы собрать свой пакет, нужно поместить файлы в каталоге ~/tmp/someprog так, как будто это корневой каталог.То есть, если нужно, чтобы файл установился в /usr/bin,нужно его поместить в каталог ~/tmp/someprog/usr/bin, ну и, соответственно, если что-то должно лежать в /etc, то в ~/tmp/someprog/etc и т.д.

    Затем в ~/tmp/someprog создать каталог DEBIAN, обязательно большими буквами, и в нём файл ~/tmp/someprog/DEBIAN/control, в этом файле описывается название пакета, его зависимости и описание, формат очень простой. Например:

    Package: libcurl3 Version: 7.15.2-2 Section: libs Priority: optional Architecture: i386 Depends: libc6 (>= 2.3.5-1), libcomerr2 (>= 1.33-3), libidn11 (>= 0.5.18), libkrb53 (>= 1.4.2), libssl0.9.8 (>= 0.9.8a-1),zlib1g (>= 1:1.2.1), ca-certificates Suggests: libldap2 Replaces: libcurl2 ( Source: curl Description: Multi-protocol file transfer library libcurl is designed to be a solid, usable, reliable and portable multi-protocol file transfer library. . SSL support is provided by OpenSSL. To enable LDAP support package libldap2-dev is required. . This is the shared version of libcurl. . Homepage: http://curl.haxx.se

    Ну а теперь собрать:

    dpkg -b ./someprog some-prog-123-new.deb

    Этой информации достаточно, чтобы собрать/пересобрать простенький пакет. На самом деле можно ещё запускать скрипты при установке пакета, при его удалении и много чего ещё, что нужно нормальному maintainer’у.

    Ссылки

    Некоторые команды мне подсказал Александр Герасёв http://gq.net.ru/2007/03/16/building-deb-packages/
    Официальное полное руководство на Русском http://www.debian.org/doc/maint-guide/
    Уголок разработчика Debian http://www.debian.org/devel/

    Хороший цикл статей Цикл статей по сборке RPM и DEB пакетов , правда автор предвзято относится к сборке deb-пакетов, но если на это не обращать внимания, вполне приличный обзор.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *