Содержание
- исправив стилистику статьи
- добавив больше информации о подготовке исходных кодов для дебианизации
Дистрибутивы, основанные на Debian – это не только отличная система управления пакетами APT, которая сама разрешает зависимости, но и удобные инструменты для создания пакетов и своих репозиториев. Если уж вы решились собрать программу из исходников, то советую ещё изучить, как дебианизировать исходники. Это отнимет чуть больше времени, чем стандартное
./configure && make && make install
но зато позволит сохранить систему в чистоте. Удалить программы, установленные командой make install, можно только командой
make uninstall
но не все исходники это поддерживают, а что ещё чаще - исходники удаляют после установки, тогда удалить программу можно только вручную. Но чтобы это сделать, нужно точно знать что и куда установилось. А это уж точно никто не знает, кроме самих разработчиков программы (ну или тех, кто более-менее разбирался в исходниках программы).
- Ну и что? Главное - работает!
- APT не знает ничего о программах, установленных вручную. Соответственно, могут быть конфликты, или просто непонятные ошибки.
- Очень часто исходники по умолчанию «рассчитаны» на определённый дистрибутив, или, наоборот, рассчитаны только на установку из исходников, при этом выполняются разного рода «удобные» настройки в конфигурационных файлах. Так, например, очень любят прописывать mime-типы. Но проблема в том, что переводы разные бывают и в Nautilus может выскочить ошибка
"Имя файла <тут имя> показывает, что файл является типом файла <Документ1>. Содержимое файла показывает, что файл является файлом типа <Документ2>"
и документ не будет открываться. Таких «недочётов» может быть очень много. А теперь, если представить что это удалить нельзя, поскольку пользователь не запоминал что и куда поставилось, наступает паника и как результат - переустановка.
- Но как быть, если программу хочется поставить, а версия в 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 <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'у.
Ссылки
- Некоторые команды мне подсказал Александр Герасёв 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-пакетов, но если на это не обращать внимания, вполне приличный обзор.
- Здесь доступно много материала на эту тему https://wiki.ubuntu.com/PackagingGuide
- Обсуждение данной статьи на форуме в этом разделе forum.ubuntu.ru
- Слайды лекции «Пакетирование для Debian» http://lists.debian.org/debian-russian/2012/06/msg00302.html
- Как собрать бинарный deb пакет: подробное HowTo http://habrahabr.ru/post/78094/