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

Knoppix

Модераторы: Warderer, Модераторы разделов

Ответить
Аватара пользователя
sunny1983
Сообщения: 357
ОС: GNU/Linux 4.x (Fedora, Debian)
Контактная информация:

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

Сообщение sunny1983 »

Уважаемые опытные пользователи дистрибутива Debian. Задаю вам вопрос как правильно собирать deb-пакеты. Уже задавал этот вопрос в ветке "Администрирование для начинающих", сейчас задаю снова, но уже здесь так как желаю получить развёрнутый ответ. Debian - дистрибутив на котором полгода назад я решил остановиться, он более стабилен чем многие другие дистрибутивы, и хорошо документирован. Использую репозитории "stable ("lenny"), а также некоторые проприетарные: opera, google, qutim. Другие использовать не хочу, так как не хочу нарушать стабильнось своей системы. К сожалению в репозиториях есть не всё, приходится собирать программы из исходников. Меня интересует как создать пакет программы, поставляемой в виде исходников и как создать пакет проприетарной программы, чтобы этот пакет не нанёс урона стабильности системы как при его установке, так и при удалении.

Убедительно прошу не отсылать меня к руководствам. У меня и так некоторые руководства по сбрке deb-пакетов имеются и даже распечатаны. Вот эти:
http://www.debian.org/doc/maint-guide/
http://wiki.debian.org/DebianRussian/DebinstPackages
http://wiki.debian.org/DebianRussian/deb-inside
http://www.opennet.ru/base/sys/debian_backport.txt.html

Многое я из этих руководств не понимаю. Например во всех них сказано, что нужно использовать инструмент dh_make. А вот make для компиляции я так понимаю использовать не нужно, dh_make сама вызовет make и создаст скелет будущего пакета (каталог debian с файлами control и rules). Затем нужно подредактировать файлы в каталоге debian: control, changelog, сценарии preinst, postinst и другие. После окончательная сборке пакета и его упаковка осуществляется dpkg-buildpackade. Вот тут начинается и первое разногласие. Разные статьи говорят о разных инструментах: dpkg-buildpackade, dpkg --build, dpkg-deb. На форуме linux.org.ru мне сказали, что лучше использовать dpkg --build.

Второй вопрос. Может я чётко не понимаю как действует dh_make, но вот что непонятно из её синтаксиса:

Код: Выделить всё

dh_make -e ваш@электронный.адрес -f а../архив.orig.tar.gz

Такой командой согласно первой статье следует запускать dh_make. Я вот не понимаю зачем нужна опция "-f а../архив.orig.tar.gz", без этой опции я получал ошибку, когда пытался собрать пакет libtorrent (подробно все попытки описаны в той теме):

Код: Выделить всё

Could not find libtorrent_0.12.orig.tar.gz
Either specify an alternate file to use with -f,
or add --createorig to create one.

Зачем мне нужен архив исходников, если этот архив уже распакован и в каталоге, куда распаковано его содержимое я сейчас нахожусь? А если исходники я получал вообще не из архива, а с помощью svn как в случае с libtorrent.

Дальше. А конфигурировать программу перед компиляцией надо или это тоже сделает dh_make. Просто некоторые программы конфигурируются с помощью configure, некоторые с помощью autoconf.sh+configure, некоторые с помощью cmake. В первой статье сказано что нужно редактировать Makefile.am или Makefile.in. Означает ли это, что ./configure запускать не нужно, а все параметры передаваемые этому скрипту вручную прописать в Makefile.am или Makefile.in? А как быть в случае с cmake? А как быть если программа компилируется не при помощи make, а при помощи scons?

И наконец, как делать пакеты проприетарных программ. Например такая программа как vmware устанавливается при помощи запуска бинарного файла VMware-Workstation-Full-7.1.0-261024.x86_64.bundle, а удаляется вооще неизвестно как. Возможно ли сдалать из неё пакет чтобы она могла корректно удаляться при помощи aptitude?С
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Сборка deb-пакетов

Сообщение SLEDopit »

sunny1983 писал(а):
22.10.2010 00:16
К сожалению в репозиториях есть не всё, приходится собирать программы из исходников.
У упомянутой оперы есть свой репозиторий. У qutim'a тоже. Да и то, чего нет в ленни, почти наверняка есть в тестинге. Его можно подключить и ставить оттуда только необходимый софт, без полного обновления системы.
sunny1983 писал(а):
22.10.2010 00:16
Например такая программа как vmware устанавливается при помощи запуска бинарного файла VMware-Workstation-Full-7.1.0-261024.x86_64.bundle, а удаляется вооще неизвестно как.
Ну я работал с вмваре-сервер: там есть инсталл скрипт (правда на ленни он ни фига не ставится, нужно патчить. хотя в инете полно инструкций как это делается), а потом в директории, куда все установилось лежит скрипт vmware-uninstall.pl. Наверняка с workstation аналогичная ситуация.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Bater
Сообщения: 65
ОС: Debian "Sid"

Re: Сборка deb-пакетов

Сообщение Bater »

Если пакет нужен для себя, то можно с dpkg-buildpackade не заморачиваться.
Из исходников можно собрать например так:

Код: Выделить всё

./configure --prefix=/home/"user"/project
make
make install

Потом создаёшь файл /home/"user"/project/DEBIAN/control с содержанием, например:

Код: Выделить всё

Package: project
Version: 1-1
Architecture: all
Maintainer: Debian
Description: project

и заталкиваешь это в пакет, так:

Код: Выделить всё

dpkg -b /home/"user"/project  /home/"user"/project_1-1_all.deb

При установке такого пакета все что лежало в /home/"user"/project (кроме папки DEBIAN) будет распаковано в систему. В папку /home/"user"/project можно положить что угодно.

Со всякими dh_make, dpkg-buildpackade, я сам не разобрался, да и мне это не надо.
Спасибо сказали:
Аватара пользователя
sunny1983
Сообщения: 357
ОС: GNU/Linux 4.x (Fedora, Debian)
Контактная информация:

Re: Сборка deb-пакетов

Сообщение sunny1983 »

SLEDopit писал(а):
22.10.2010 00:26
У упомянутой оперы есть свой репозиторий. У qutim'a тоже.

Так я же как раз написал, что юзаю репозитории локальных пакетов: opera, qutim, google.

Bater писал(а):
22.10.2010 01:17

Код: Выделить всё

./configure --prefix=/home/"user"/project
make
make install

"make install" ведь, если я не ошибаюсь запускает сценарии preinst и postinst. И запущеный не от рута боюсь может не сработать, если таким способом устанавливается демон или чего-нибудь системное.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Сборка deb-пакетов

Сообщение watashiwa_daredeska »

sunny1983 писал(а):
22.10.2010 00:16
Зачем мне нужен архив исходников, если этот архив уже распакован и в каталоге, куда распаковано его содержимое я сейчас нахожусь?
В этом же каталоге находятся изменения, которые Вы сделали для «дебианизации» пакета. В этом случае хорошим тоном считается иметь оригинальный .orig.tar.gz и .diff.gz дебианизации. Вместо указания .orig.tar.gz можно сказать --createorig, тогда dh_make сам его сделает, запаковав текущий каталог. Если же дебианизация является частью исходников пакета, то такой пакет называется 'native', и в нем вместо .orig.tar.gz и .diff.gz только один архив с исходниками.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Сборка deb-пакетов

Сообщение watashiwa_daredeska »

Bater писал(а):
22.10.2010 01:17
Если пакет нужен для себя, то можно с dpkg-buildpackade не заморачиваться.
Из исходников можно собрать например так:

Код: Выделить всё

./configure --prefix=/home/"user"/project
make
make install
Если --prefix в домашний каталог, да ещё в отдельный каталог для проекта, зачем вообще пакет? Его потом и так можно легко удалить.
Если же хочется не персональную, а системную установку, то --prefix=/usr, либо не трогать вообще. А потом make install DESTDIR=/tmp/project, и паковать уже из /tmp/project.
Спасибо сказали:
Аватара пользователя
sunny1983
Сообщения: 357
ОС: GNU/Linux 4.x (Fedora, Debian)
Контактная информация:

Re: Сборка deb-пакетов

Сообщение sunny1983 »

watashiwa_daredeska писал(а):
22.10.2010 10:24
Вместо указания .orig.tar.gz можно сказать --createorig, тогда dh_make сам его сделает, запаковав текущий каталог.

Ага, понятно. C dh_make вроде разобрался, она только создаёт скелет будущего пакета, но никакой компилятор не вызывает, то какие инструменты будут использоваться при конфигурировании и компиляции мейнтейнер выбирает сам редактируя debian/rules.

А вот тут ступор. Долго в теме не отвечал, потому что не мог сообразить.

Код: Выделить всё

#!/usr/bin/make -f
# -*- makefile -*-
# Sample debian/rules that uses debhelper.
# This file was originally written by Joey Hess and Craig Small.
# As a special exception, when this file is copied by dh-make into a
# dh-make output file, you may use that output file without restriction.
# This special exception was added by Craig Small in version 0.37 of dh-make.

# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1





configure: configure-stamp
configure-stamp:
    dh_testdir
    # Add here commands to configure the package.

    touch configure-stamp


build: build-stamp

build-stamp: configure-stamp
    dh_testdir

    # Add here commands to compile the package.
    $(MAKE)
    #docbook-to-man debian/firefox.sgml > firefox.1

    touch $@

clean:
    dh_testdir
    dh_testroot
    rm -f build-stamp configure-stamp

    # Add here commands to clean up after the build process.
    $(MAKE) clean

    dh_clean

install: build
    dh_testdir
    dh_testroot
    dh_clean -k
    dh_installdirs

    # Add here commands to install the package into debian/firefox.
    $(MAKE) DESTDIR=$(CURDIR)/debian/firefox install


# Build architecture-independent files here.
binary-indep: build install
# We have nothing to do by default.

# Build architecture-dependent files here.
binary-arch: build install
    dh_testdir
    dh_testroot
    dh_installchangelogs
    dh_installdocs
    dh_installexamples
#    dh_install
#    dh_installmenu
#    dh_installdebconf
#    dh_installlogrotate
#    dh_installemacsen
#    dh_installpam
#    dh_installmime
#    dh_python
#    dh_installinit
#    dh_installcron
#    dh_installinfo
    dh_installman
    dh_link
    dh_strip
    dh_compress
    dh_fixperms
#    dh_perl
#    dh_makeshlibs
    dh_installdeb
    dh_shlibdeps
    dh_gencontrol
    dh_md5sums
    dh_builddeb

binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install configure

И до сих пор не могу понять в какую сторону тут копать, чтобы разобрать что тут редактировать. Интуиция подсказывает, что процесс сборки состоит из этапов: configure, build, clean, install, binary-indep, binary-arch. И для каждого этапа нужно прописать команды? Как это всё?
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Сборка deb-пакетов

Сообщение watashiwa_daredeska »

sunny1983 писал(а):
01.11.2010 23:59
до сих пор не могу понять в какую сторону тут копать, чтобы разобрать что тут редактировать.
http://www.debian.org/doc/maint-guide/ch-d...en.html#s-rules
man make
man debhelper

sunny1983 писал(а):
01.11.2010 23:59
И для каждого этапа нужно прописать команды?
Да.

sunny1983 писал(а):
01.11.2010 23:59
Как это всё?
Что всё?
Спасибо сказали:
Аватара пользователя
sunny1983
Сообщения: 357
ОС: GNU/Linux 4.x (Fedora, Debian)
Контактная информация:

Re: Сборка deb-пакетов

Сообщение sunny1983 »

Вы мне посоветовали почитать руководства по make и debhelper.
По make из русскоязычного нашёл это: http://www.linux.org.ru/books/make.html, но этого крайне мало.

Решил потренироваться на чём-нибудь совсем простом, не библиотека, а программа. LogJam, клиент для отправки записей в Живой Журнал.

Получаю и распаковываю исходники:

Код: Выделить всё

$ wget --directory-prefix=/tmp http://logjam.danga.com/download/logjam-4.5.3.tar.bz2
$ tar --extract --file=/tmp/logjam-4.5.3.tar.bz2 --directory=/usr/src --bzip
$ cd /usr/src/logjam-4.5.3

Конфигурирую и компилирую:

Код: Выделить всё

/usr/src/logjam-4.5.3$ ./configure --prefix=/usr
/usr/src/logjam-4.5.3$ make

В процессе устанавливаю все требуемые для компиляции компоненты. Наконец конфигурирование и компиляция проходят нормально - всё необходимое имеется. Очищаю рабочий каталог и заново распаковываю исходники:

Код: Выделить всё

/usr/src/logjam-4.5.3$ cd ..
/usr/src$ rm -Rf logjam-4.5.3
/usr/src$ tar --extract --file=/tmp/logjam-4.5.3.tar.bz2 --directory=/usr/src --bzip
/usr/src$ cd logjam-4.5.3

Теперь запускаю dh_make:

Код: Выделить всё

/usr/src/logjam-4.5.3$ dh_make -e sunny0sergey@gmail.com --createorig

Type of package: single binary, multiple binary, library, kernel module or cdbs?
 [s/m/l/k/b] s

Maintainer name : SUNNY-iskatel
Email-Address   : sunny0sergey@gmail.com
Date            : Mon, 08 Nov 2010 23:08:47 +0300
Package Name    : logjam
Version         : 4.5.3
License         : blank
Using dpatch    : no
Type of Package : Single
Hit <enter> to confirm:
Done. Please edit the files in the debian/ subdirectory now. logjam
uses a configure script, so you probably don't have to edit the Makefiles.

debian/rules у меня получился таким:

Код: Выделить всё

#!/usr/bin/make -f
# -*- makefile -*-
# Sample debian/rules that uses debhelper.
# This file was originally written by Joey Hess and Craig Small.
# As a special exception, when this file is copied by dh-make into a
# dh-make output file, you may use that output file without restriction.
# This special exception was added by Craig Small in version 0.37 of dh-make.

# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1


# These are used for cross-compiling and for saving the configure script
# from having to guess our platform (since we know it already)
DEB_HOST_GNU_TYPE   ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
DEB_BUILD_GNU_TYPE  ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
ifneq ($(DEB_HOST_GNU_TYPE),$(DEB_BUILD_GNU_TYPE))
CROSS= --build $(DEB_BUILD_GNU_TYPE) --host $(DEB_HOST_GNU_TYPE)
else
CROSS= --build $(DEB_BUILD_GNU_TYPE)
endif



config.status: configure
   dh_testdir
   # Add here commands to configure the package.
ifneq "$(wildcard /usr/share/misc/config.sub)" ""
   cp -f /usr/share/misc/config.sub config.sub
endif
ifneq "$(wildcard /usr/share/misc/config.guess)" ""
   cp -f /usr/share/misc/config.guess config.guess
endif
   ./configure $(CROSS) --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info CFLAGS="$(CFLAGS)" LDFLAGS="-Wl,-z,defs"


build: build-stamp

build-stamp:  config.status
   dh_testdir

   # Add here commands to compile the package.
   $(MAKE)
   #docbook-to-man debian/logjam.sgml > logjam.1

   touch $@

clean:
   dh_testdir
   dh_testroot
   rm -f build-stamp

   # Add here commands to clean up after the build process.
   [ ! -f Makefile ] || $(MAKE) distclean
   rm -f config.sub config.guess

   dh_clean

install: build
   dh_testdir
   dh_testroot
   dh_clean -k
   dh_installdirs

   # Add here commands to install the package into debian/logjam.
   $(MAKE) DESTDIR=$(CURDIR)/debian/logjam install


# Build architecture-independent files here.
binary-indep: build install
# We have nothing to do by default.

# Build architecture-dependent files here.
binary-arch: build install
   dh_testdir
   dh_testroot
   dh_installchangelogs ChangeLog
   dh_installdocs
   dh_installexamples
#   dh_install
#   dh_installmenu
#   dh_installdebconf
#   dh_installlogrotate
#   dh_installemacsen
#   dh_installpam
#   dh_installmime
#   dh_python
#   dh_installinit
#   dh_installcron
#   dh_installinfo
   dh_installman
   dh_link
   dh_strip
   dh_compress
   dh_fixperms
#   dh_perl
#   dh_makeshlibs
   dh_installdeb
   dh_shlibdeps
   dh_gencontrol
   dh_md5sums
   dh_builddeb

binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install

Насколько мне позволяют понять скудные знания о синтаксисе make-файлов процесс сборки будет состоять из 4-х этапов:
1) конфигурирование

Код: Выделить всё

   dh_testdir
   # Add here commands to configure the package.
ifneq "$(wildcard /usr/share/misc/config.sub)" ""
   cp -f /usr/share/misc/config.sub config.sub
endif
ifneq "$(wildcard /usr/share/misc/config.guess)" ""
   cp -f /usr/share/misc/config.guess config.guess
endif
   ./configure $(CROSS) --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info CFLAGS="$(CFLAGS)" LDFLAGS="-Wl,-z,defs"

Тут всё понятно, так же как и при конфигурировании без сборки пакетов. Только вот для чего нужны файлы config.sub и config.guess?

2) компиляция

Код: Выделить всё

   dh_testdir

   # Add here commands to compile the package.
   $(MAKE)
   #docbook-to-man debian/logjam.sgml > logjam.1

   touch $@

Я так понимаю в глобальной переменной $(MAKE) прописывается команда запуска make со всеми её параметрами. А для чего нужно "touch $@"?

3) очистка дерева сборки

Код: Выделить всё

  dh_testdir
   dh_testroot
   rm -f build-stamp

   # Add here commands to clean up after the build process.
   [ ! -f Makefile ] || $(MAKE) distclean
   rm -f config.sub config.guess

   dh_clean

Не совсем понимаю, но на ЛОРе мне сказали, что это необходимо, чтобы сборочный мусор не попадал в diff

4) определение зависимостей и упаковка в пакет

Код: Выделить всё

   dh_testdir
   dh_testroot
   dh_installchangelogs ChangeLog
   dh_installdocs
   dh_installexamples
#   dh_install
#   dh_installmenu
#   dh_installdebconf
#   dh_installlogrotate
#   dh_installemacsen
#   dh_installpam
#   dh_installmime
#   dh_python
#   dh_installinit
#   dh_installcron
#   dh_installinfo
   dh_installman
   dh_link
   dh_strip
   dh_compress
   dh_fixperms
#   dh_perl
#   dh_makeshlibs
   dh_installdeb
   dh_shlibdeps
   dh_gencontrol
   dh_md5sums
   dh_builddeb

Этот алгоритм я вообще не понимаю, что тут к чему и как это работает. Редактирование этой секции скрипта заключается в раскоментировании одних строк и закоментировании других или можно что-нибудь стороннее прописывать?

Вот сколько непоняток по сборке самой простой программы. Кстати как именно скрипт сборки следует запускать. В первом руководстве сказано, что команда для сборки выглядит как "dpkg-buildpackage -rfakeroot", но читал, что можно вызывать "fakeroot debian/rules binary", а на ЛОРе писали, что можно и через dpkg.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Сборка deb-пакетов

Сообщение watashiwa_daredeska »

sunny1983, если Вам интересно именно понять, то объясню с конца. Не всё, но стартовую точку для дальшейшего копания вширь и вглубь.

1. Сборка бинарного deb-пакета — это совершенно элементарная вещь. No rocket science. Даже никаких специальных инструментов не нужно, достаточно произвольной GNU system (не обязательно даже Linux, а возможно, даже необязательно GNU, главное, чтобы достаточно POSIX). Вот пример.

2. Следующий шаг в сборке пакетов — dpkg-deb. Он делает практически то же самое, что в приведенном выше примере, но требует, чтобы определенные файлы лежали в определенном месте, тогда он их соответствующим образом запакует в deb-пакет.

3. Следующий шаг — распространение исходных текстов к программам, вместе с инструкциями по сборке из них бинарных пакетов. Ведь Debian изначально был GNU/Linux, т.е. рассчитывался на распространение свободного ПО. Для сборки пакета исходных текстов имеется аналогичный dpkg-deb инструмент: dpkg-source.

4. Следующий шаг — автоматизация. Для автоматизации существует набор инструментов, который требует соблюдения соглашений. Про все необходимые для Debian соглашения написано в Debian Policy Manual, необходимыми также являются соглашения, которые требуются для работы используемых инструментов.

Набор скриптов debhelper (dh_* в приведенном Вами debian/rules) — один из таких инструментов. dpkg-buildpackage — ещё один (который, собственно, и требует наличия debian/rules и определенных targets).

Если цель — просто «собрать какой-нибудь пакет, который как-нибудь установится dpkg», то можно не соблюдать большинство соглашений, не пользоваться большинством инструментов, а по простому закатить солнцесобрать пакет(ы) вручную. При использовании же каких-либо инструментов, вроде debhelper и/или dpkg-buildpackage, нужно читать их man'ы — там написано, как что они делают и чего в каком виде требуют. Если предполагается включение пакета в официальный репозиторий дистрибутива (Debian, Ubuntu или ещё какой), нужно дополнительно соблюдать соглашения этого дистрибутива — где что должно лежать, как называться и т.п. Так что, «уровень соответствия» Вы выбираете сами, по вкусу.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Сборка deb-пакетов

Сообщение watashiwa_daredeska »

sunny1983 писал(а):
10.11.2010 15:59
Только вот для чего нужны файлы config.sub и config.guess?
Кэш результатов тестов, проводимых скриптами configure, сгенерированными autoconf'ом. Не обязательно, но слегка ускоряет выполнение ./configure.

sunny1983 писал(а):
10.11.2010 15:59
А для чего нужно "touch $@"?
Вы точно читали про make? :) Обновляет время модификации target'а (build-stamp), чтобы make считал его up-to-date.

sunny1983 писал(а):
10.11.2010 15:59
Этот алгоритм я вообще не понимаю, что тут к чему и как это работает.
Алгоритм-то абсолютно линейный, достаточно прочитать man по всем выполняемым командам в частности, и по debhelper в общем.
Спасибо сказали:
Ответить