Здесь доступно много материала на эту тему
https://wiki.ubuntu.com/PackagingGuideИ ещё
http://www.debian.org/doc/maint-guide/Попробую поделиться своим опытом в создании пакетов.
Вступление:
Отличие дистрибутивов основанных на Debian это не только отличная система управления пакетами apt-get (aptitude)
которая сама разрешает зависимости, но есть ещё и удобные инструменты для создания пакетов и своих репозиториев.
Если уж вы решились собрать программу из исходников, то советую ещё изучить как дебианизировать исходники.
Это отнимет чуть больше времени чем стандартное ./configure && make && make install
но за то позволит сохранить систему в чистоте. Удалить программы установленные командой make install можно только командой make uninstall, но не все исходники это поддерживают, а что ещё чаще исходники удаляют после установки, тогда удалить программу можно только вручную. Но чтобы это сделать нужно точно знать что и куда установилось
![Smiley :)](https://forum.ubuntu.ru/Smileys/webby/smiley.gif)
А это уж точно никто не знает кроме самих разработчиков программы (ну или тех кто более менее разбирался в исходниках программы).
Ну и что? Главное работает!
- apt-get не знает ничего об программах установленных вручную соответственно могут быть конфликты или просто непонятные глюки.
- очень часто исходники по умолчанию "рассчитаны" на определённый дистрибутив или наоборот рассчитаны только на установку из исходников, при этом выполняются разного рода "удобные" настройки в конфигурационных файлах. Так например очень любят прописывать mime типы. Но проблема в том что переводы разные бывают и в наутилусе может выскочить ошибка "Имя файла <тут имя> показывает, что файл является типом файла <Документ1>. Содержимое файла показывает, что файл является файлом типа <Документ2>" и документ не будет открываться.
Таких "недочётов" может быть очень много. А теперь если представить что это удалить нельзя поскольку пользователь не запоминал что и куда поставилось, наступает паника и как результат переустановка
![Smiley :)](https://forum.ubuntu.ru/Smileys/webby/smiley.gif)
Но как быть если программу хочется поставить, а версия в deb пакете устарела, или такой вообще нет?
Есть два выхода использовать программу checkinstall. Она собирает всё в один пакет.
К сожалению она позволяет решить только вопрос с удалением программы.
И даже если apt-get будет знать, что программа установлена, он в лучшем случае сообщит, что конфликт файлов, файл /some/path/to/some/file уже есть в пакете "имя пакета собранного с помощью checkinstall"
Чаще всего такие случаи очень корректно разрешаются путём удаления конфликтного пакета. Но времени на разбор ситуации это у вас займёт.
Второй путь собрать нормальный пакет как это делают мантейнеры.
В котором будет корректная версия, зависимости и расположение файлов будет соответствовать политике дистрибутива.
Вижу вам всё ещё интересно
![Smiley :)](https://forum.ubuntu.ru/Smileys/webby/smiley.gif)
Это радует.
И так дано:
некий исходник gcoolprog-0.5.3.tar.bz2
Нужно собрать пакет.
Решение.
Ниже идёт вариант как я обычно поступаю в таком случае.
Первым делом смотрю нет ли deb пакета той же версии но допустим под Debian.
Если есть делаю так см.
"Есть нужная версия пакета в репозитории debian или в будущем релизе убунты"Если нет той же версии но есть предыдущей.
Тут можно сказать как повезёт, если изменения в исходниках не коснулись положения файлов то скорее всего дебианизация от старого пакета подойдёт, нужно лишь сменить версию.
см.
"Теперь вариант в репозитории есть пакет предыдущей версии."ну и самый страшный случай нигде никаких deb пакетов нет только tar.gz и rpm
![Sad :(](https://forum.ubuntu.ru/Smileys/webby/sad.gif)
Не отчаиваться! И
ни в коем случае не использовать rpm!!!
Нам понадобятся как минимум программы sudo apt-get install autoconf automake libtool autotools-dev dpkg-buildpackage fakeroot
можно так же autobook это документация по утилитам "GNU Autoconf, Automake, и Libtool"
Ну и конечно то что требуют сами исходные коды, для корректной сборки.
А так же не помешает завести ключик которым мы будем подписывать пакеты.
Данный шаг не обязателен его можно пропустить.
Для этого зайдите в Приложения-> Стандартные-> Пароли и ключи шифрования
В открывшемся окне в меню ключ->новый ключ
выбираем ключ pgp
Заполняем поля полное имя и электронный адрес.
В мире свободного программного обеспечения, для предотвращения "краж" или "подделок" принято подписывать свои "ценные" вещи электронным ключём, открытая часть которого хранится на обще доступных серверах и позволяет другим пользователям легко выяснить подлинность и целостность той или иной вещи. Поэтому отнеситесь к созданию ключа очень ответственно. Никто вас не заставляет вписывать сюда реальные имя и фамилию, или ещё какие нибудь личные данные, но если вас не разыскивает интерпол думаю указать фамилию и имя будет верным решением, хотя можно и просто свой ник
![Smiley :)](https://forum.ubuntu.ru/Smileys/webby/smiley.gif)
В общем решайте сами. А вот почтовый адрес укажите реальный, и который вы не поменяете. Можно использовать адреса крупных доменов таких как gmail.com или yandex.ru (т.е. у вас там должен быть свой ящик) Это позволит в будущем легко связаться с вами, человеку который вас не знает но по той или иной причине встретил "вещь" подписанную вами.
Далее вас спросят ввести пароль. Как дополнительную защиту. Он может быть полезен если вы будете использовать закрытый ключ на машинах которым вы не можете 100% доверять. Обратная сторона, вам придётся вводить пароль каждый раз как только вы будете что то подписывать. Хотя последняя версия программы seahorse имеет демон который автоматически запускается в сеансе гнома, и умеет "запоминать пароль" на время сеанса, но пока не все программы умеют с ней работать.
И так вы создали ключ теперь его можно будет использовать при создании пакетов.
Для этого в файл ~/.bashrc или в другой стартовый скрипт вашего любимого шелла (для zsh ~/.zshrc) нужно вписать переменные
export DEBEMAIL=ваш@емэил
на основании емаил будет искаться ключ в пгп при подписи. пакета.
Нужно перелогиниться чтобы изменения вступили в силу.
Помните что если вы бэкпортируете пакет дебианизированный не вами обязательно нужно изменить версию.
Командой dch -i для того чтобы в изменениях вписался ваш email .
А для того чтобы ваш открытый ключ попал на сервер, в настройках seahorse ("Пароли и ключи шифрования")
нужно настроить соединение с сервером публичных ключей. Для этого нужно в меню правка->параметры
на закладке "Публикация ключей" поставить галку "Публиковать ключи..."
теперь можно выбрать ключ и в меню по правой кнопке выбрать "Синхронизировать и опубликовать ключи"
И так ...
Начну с самого страшного
![Smiley :)](https://forum.ubuntu.ru/Smileys/webby/smiley.gif)
) поскольку остальные случаи это частные решения самого страшного.
И так у нас есть только gcoolprog-0.5.3.tar.bz2Обычно я выполняю следующие действия
$ mkdir ~/src/gcoolprog
$ mkdir ~/src/gcoolprog/0.5.3
$ cd ~/src/gcoolprog/0.5.3
$ wget "http://<путь до файла>" (можно конечно и просто через браузер скачать но обычно так быстрее)
получаем файл gcoolprog-0.5.3.tar.bz2
Немного забегая в перёд пере архивируем файл программой gzip
$ bunzip2 gcoolprog-0.5.3.tar.bz2
$ gzip gcoolprog-0.5.3.tar
получим gcoolprog-0.5.3.tar.gz
и переименуем
$ mv gcoolprog-0.5.3.tar.gz gcoolprog_0.5.3.orig.tar.gz
(т.е. разделили имя и версию подчёркиванием и после версии добавили слово orig)
теперь распаковываем его (но не в коем случае не удаляем!)
$ tar zxvf ./gcoolprog_0.5.3.orig.tar.gz
$ cd gcoolprog-0.5.3
(замечание для корректной сборки нужно чтобы корневая директория содержала не только название но и версию!)
ниже будем считать директорию
~/src/gcoolprog/0.5.3/gcoolprog-0.5.3 корневой директорией исходников.
далее выполняем "черновую" сборку. Т.е. делаем как обычно ./configure --prefix=/usr && make (но не устанавливаем!)
если конфигурируется со всеми нужными опциями и собирается в бинарный файл, значит осталось только дебианизировать.
Дебианизация:
Ничего страшного в этом нет, как я уже говорил есть скрипты которые сильно упрощают этот процесс.
Вообще смысл всей этой процедуры создать директорию debian в корне исходников, с нужными файлами конфигурации и скриптом(ами)
для этого выполним
$ dh_make
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:
Skipping creating ../gcoolprog_0.5.3.orig.tar.gz because it already exists
Done. Please edit the files in the debian/ subdirectory now. gcoolprog
uses a configure script, so you probably don't have to edit the Makefiles.
Последние строчки можно перевести как:
Пропускаем создание ../gcoolprog_0.5.3.orig.tar.gz т.к. такой файл уже есть
Выполнено. Пожалуйста теперь отредактируйте файлы в директории debian/ . gcoolprog
использует скрипт конфигурирования, поэтому вам возможно не нужно редактировать Make-файлы.
так мы сформировали пекет
для одиночного бинарного файла.Если бы мы не переименовали архив то получили бы следующее сообщение
Could not find gcoolprog_0.5.3.orig.tar.gz
Either specify an alternate file to use with -f,
or add --createorig to create one.
в таком случае советую прервать dh_make (ctrl+c) и переименовать архив как описано выше.
Но мы с вами молодцы и всё у нас прошло без ошибок появился каталог 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> (без угловых кавычек) нужно вписать описание что это за программа. Именно эти сведения увидит пользователь когда посмотрит описание пакета в synaptic'е.
второй момент это поправить файл debian/rules
в секции binary-arch:
нужно раскомментировать
dh_install
(т.е. убрать # в начале строки)
без этого мы получим пустой пакет.
Обычно этих настроек достаточно для сборки пакета с одной программой которая не содержит разделяемых библиотек т.е. только бинарник в /usr/bin и данные в /usr/share
Теперь можно выполнить в корне с исходниками
$ dpkg-buildpackage -rfakeroot
Если при сборке произошла ошибка
dpkg-shlibdeps: failure: no dependency information found for /usr/lib/libxmega.so.9 (used by debian/gcoolprog/usr/bin/gcoolprog).
Это означает, что у вас установлена необходимая библиотека (т.к. программа скомпилировалась), но
система dpkg об этой библиотеки ничего не знает, например, поставили нужную библиотеку командой make install.
Или, если вы пытаетесь собрать сложную программу, состоящую из разных модулей,
вы собрали один из модулей без разбиения на библиотеки/программы.
Дело в том, что dpkg-shlibdeps ищет подходящие библиотеки в файлах
/var/lib/dpkg/info/<package>.symbols или /var/lib/dpkg/info/<package>.shlibs
т.к. мы собирали пакет
для одиночного бинарного файла файлы описывающие какие
библиотеки входят в пакет не создавались!
Как решить эту проблему, это уже задача настоящего мантейнера, тут вам придётся разобраться за что твечает каждый файл
в debian директории, и руками править control и другие файлы, учитывая руководство Debian Policy.
Если ошибок не будет, мы получим файлы
$ cd .. (в директорию выше т.е. в ~/src/gcoolprog/0.5.3)
$ 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
Теперь вариант в репозитории есть пакет предыдущей версии.В этом случае очень удобно взять дебианизацию оттуда и поправить для новой версии.
Как я уже сказал возможно нам повезёт и достаточно будет только сменить версию.
Но не будем гадать.
Ниже я не буду комментировать то что описано в предыдущем решении.
$ 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 файл 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
копируем каталог 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
Ну и последний вариант
Есть нужная версия пакета в репозитории debian или в будующем релизе убунтыдля дебиана нужно использовать сайт packages.debian.org
для убунты packages.ubuntu.com
тогда например в убунте ищем пакет 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
затем распакуем командой
$ 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
Некоторые команды мне подсказал Александр Герасёв
http://gq.net.ru/2007/03/16/building-deb-packages/Официальное полное руководство на Русском
http://www.debian.org/doc/maint-guide/Уголок разработчика Debian
http://www.debian.org/devel/Хороший цикл статей
http://tigro.info/blog/index.php?id=375правда автор предвзято относится к сборке deb пакетов, но если на это не обращать внимания вполне приличный обзор.
P.S. прежде чем собирать пакет попробуйте воспользоваться поиском на ланчпаде https://launchpad.net/ubuntu/+ppas . возможно что нужный пакет уже кто-то собрал или можно воспользоваться правилами сборки.