Эта статья не завершена. Вы можете помочь в ее написании
  • исправив стилистику статьи
  • добавив больше информации о подготовке исходных кодов для дебианизации

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

./configure && make && make install

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

make uninstall

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

  • Ну и что? Главное - работает!
    • APT не знает ничего о программах, установленных вручную. Соответственно, могут быть конфликты, или просто непонятные ошибки.
    • Очень часто исходники по умолчанию «рассчитаны» на определённый дистрибутив, или, наоборот, рассчитаны только на установку из исходников, при этом выполняются разного рода «удобные» настройки в конфигурационных файлах. Так, например, очень любят прописывать mime-типы. Но проблема в том, что переводы разные бывают и в Nautilus может выскочить ошибка
      "Имя файла <тут имя> показывает, что файл является типом файла <Документ1>.
      Содержимое файла показывает, что файл является файлом типа <Документ2>" 

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

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

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

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

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

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

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

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

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

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

дебианизация:

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

причина сборки:

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

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

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

Полное Руководство начинающего разработчика 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 <enter> to confirm:

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

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

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

Description: <insert up to 60 chars description>                                                                                                               
 <insert long description, indented with spaces>

Вместо <insert up to 60 chars description> и <insert long description, indented with spaces> (без угловых кавычек) нужно вписать описание, что это за программа.
Именно эти сведения увидит пользователь, когда посмотрит описание пакета.
Второй момент - это поправить файл debian/rules
в секции binary-arch: нужно раскомментировать (т.е. убрать # в начале строки)

dh_install

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

%:
	dh $@

Что приемлемо с использованием 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 (<< 1:7.11.2-2)
Installed-Size: 324
Maintainer: Domenico Andreoli <cavok@debian.org>
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'у.

Ссылки