Сборка с использованием debhelper

next up previous contents
Next: Сборка с использованием программ Up: Создание пакета исходных кодов Previous: Формат пакета исходных кодов   Contents

Сборка с использованием debhelper

В debian существует достаточное количество инструментов, помогающих автоматизировать процесс дебианизации. Рассмотрим debhelper(1), как наиболее часто встречающийся и рекомендованный в developers-reference. Пакет debhelper представляет собой набор скриптов dh_*, облегчающие процесс конфигурирования и компиляции программы, инсталяции ее и сборки в результирующий deb. Для работы с debhelper рекомендую воспользоваться программой dh_make из пакета dh-make.
  1. приводим название каталога исходников к виду, необходимому для dh_make(8): <название пакета>-<версия>;
  2. в корне каталога исходников зовем dh_make(8). Например,
    dh_make -c gpl -e mycool@e-mail.com
  3. идем в debian/ и правим необходимые файлы, удаляем ненужные
Подробнее о последнем пункте. Рассмотрим ситуацию генерации single binary (есть еще варианты multiple binary, library и kernel module) dh_make сгенерирует rules таким образом, что программа будет устанавливаться в debian/tmp (либо в debian/tmp/package в случае multi-binary пакета). Рассмотрим файлы:
changelog
- Готовый файл с единственной записью ``Initial release''
conffiles.ex
- файл состоит из комментария о его использовании. К слову, в conffiles коментарии # не поддерживаются, поэтому их нужно удалить4.
control
- Этот шаблон необходимо обязательно заполнить в соответствии с указанными выше правилами оформления файла control. Кроме того, debhelper поддерживает набор макросов. Например, в Depends: можно записать
${shlibs:Depends}
вместо списка библиотек;
${misc:Depends}
макрос раскрывается многими программами debhelper. Например, если Вы используете dh_installdebconf, то Вам необходим debconf, для dh_installxfonts понадобятся xutils. Эти зависимости и будут автоматически сгенерированы;
${perl:Depends}
генерируется dh_perl и содержит список используемых модулей perl.
copyright
- в этом файле кроме лиценции указывается информация об upstream, то есть производителе программы (где взяли, кто написал).
cron.d.ex
- файл в формате crontab(5). Будет установлен скриптом dh_installcron в $(prefix)/etc/cron.d/<package>
dirs
- содержит относительные пути каталогов, необходимых пакету. Обрабатывается dh_installdirs (он создает указаные каталоги)
docs
- список файлов, которые dh_installdocs установит в usr/share/doc/<package>. Подерживает маски. Корнем является корень дерева исходников (не debian/).
emacsen-install.ex
- Следующие три необходимы, если вы debian'изируете пакет для [X]emacs. Устанавливаются dh_installemacsen. Скрипт инталяции.
emacsen-remove.ex
- скрипт деинталяции.
emacsen-startup.ex
- пример lisp-файла инициализации. Установится в site-lisp.d
ex.package.doc-base
- TODO: почитать :)
init.d.ex
- пример скрипта для init.d, если программа в нем нуждается. dh_installinit установит его в etc/init.d/<package>.
manpage.1.ex
- шаблон man. Обрабатывается dh_installman
manpage.sgml.ex
- шаблон sgml для генерации man.
menu.ex
- шаблон для системы меню debian. dh_installmenu установит его в usr/lib/menu/<package>. Файл (формат описан в menufile(5L)) состоит из строк вида
?package(package-name):var1=value var2=varlue2
Возможные переменные:
needs
- тип дисплея, на котором запускается программа. Например, needs=x11;
section
- секция меню. Например, section=Apps/Programming. Структура меню описана в menu-policy;
icon
- иконка;
title
- текст пункта меню. Например, title=''Coolprog'';
command
- команда, выполняемая при выборе пункта меню.
Пример строки:

?package(foo):needs=x11 section=Apps/Programming title="Foo" command=''foo -coolkey''

postinst.ex, postrm.ex, preinst.ex, prerm.ex
- шаблоны ментейнеровских скриптов.
README.Debian
- описание особенностей сборки и использования пакета, специфичных для Debian.
watch.ex
- шаблон для автоматического апдейта пакета.
rules
- шаблон файла построения пакета. Рассмотрим его подробнее.

TODO: Рассмотреть rules в комментариях. Рассказать в них о dh_* скриптах.

#!/usr/bin/make -f
# Sample debian/rules that uses debhelper.
# GNU copyright 1997 to 1999 by Joey Hess.

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

# This is the debhelper compatibility version to use.
export DH_COMPAT=3

# 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)
В следующие строки дают возможность указав в переменной окружения DEB_BUILD_OPTIONS debug и/или nostrip собрать пакет с отладочной информацией.
ifneq (,$(findstring debug,$(DEB_BUILD_OPTIONS)))
        CFLAGS += -g
endif
ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
        INSTALL_PROGRAM += -s
endif
Правило для конфигурации. Не является обязательным, требуется из обязателного build. Исли пакет использует GNU autoconf (как тот, что я взял для примера), то вставит и вызов configure. В данном случае указано, что для построения файла config.status необходим файл configure и осуществить указанные действия.

Скрипт dh_testdir пытается проверить в нужном ли каталоге мы находимся (проверяет существование файлов debian/control и других)

config.status: configure
        dh_testdir

        # Add here commands to configure the package.
        ./configure --host=$(DEB_HOST_GNU_TYPE)
        --build=$(DEB_BUILD_GNU_TYPE)
        --prefix=/usr 
        --mandir=\$${prefix}/share/man 
        --infodir=\$${prefix}/share/info
От себя добавлю, что в большинстве случаев эта строчка не является целиком корректной. Необходимо в большинстве случаев добавлять -sysconfdir=/etc (аналогичная ситуация с /var)

Проверяем правило build-stamp, которое в свою очередь проверяет config-status. Этим добиваемся того, чтобы не производить перекомпиляцию пакета, если не было его переконфигурации.

build: build-stamp

build-stamp:  config.status
        dh_testdir

        # Add here commands to compile the package.
Собственно, сама сборка. Если необходимы дополнительные команды либо параметры make, их можно добавить сюда.
        $(MAKE)
        #/usr/bin/docbook-to-man debian/package.sgml > mc.1

        touch build-stamp
Правило очистки от предыдущей сборки dh_testroot проверяет, от рута ли мы собираем (используем fakeroot), dh_clean чистит дерево сборки от всевозможных core, backup'ов ...
clean:
        dh_testdir
        dh_testroot
        rm -f build-stamp 

        # Add here commands to clean up after the build process.
        -$(MAKE) distclean
        -test -r /usr/share/misc/config.sub && \
          cp -f /usr/share/misc/config.sub config.sub
        -test -r /usr/share/misc/config.guess && \
          cp -f /usr/share/misc/config.guess config.guess


        dh_clean
Правило инсталяции скомпилированной програмы во временный каталог.
install: build
        dh_testdir
        dh_testroot
        dh_clean -k
        dh_installdirs

Инсталяция. На практике проще использовать

$(MAKE) DESTDIR=$(CURDIR)/debian/package

так как большинство autoconf программ это поддерживает.

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

Построение пакета(ов). binary-indep - независимого от архитектуры, binary-arch - зависимого.

# 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
Раскоментируйте, если используете debconf. Проставит config и templates (в DEBIAN), и добавит код в скрипты.

# dh_installdebconf

Проставим доки, указанные в debian/docs в usr/share/doc/package

dh_installdocs

Проставим файлы, указанные параметрами в usr/share/doc/examples

dh_installexamples

Проставим файлы меню в usr/lib/menu/package (если мы реализуем меню, скажем, мы - wm, то проставим debian/menu-method в etc/menu-methods/package. Добавим код, вызывающий update-menus(1) (скрипт debian'овской системы меню) в инсталяционные скрипты.

dh_installmenu

Проставим debian/logrotate в etc/logrotate.d

# dh_installlogrotate

Емаксовые пакеты

# dh_installemacsen

debian/pam в etc/pam.d/package

# dh_installpam

Если мы устанавливаем обработчик mime, проставит debian/mime в usr/lib/mime/packages/package и добавит вызовы update-mime. См. mime-policy и mailcap(5)

# dh_installmime

debian/init -> etc/init.d/package + update-rc.d в скрипты.

# dh_installinit

debian/cron -> etc/cron.d

dh_installcron

man и info

dh_installman dh_installinfo

сделаем симлинки на undocumented для тех man-страниц, которых нет. Полезен ключ -A.

# dh_undocumented dh_installchangelogs ChangeLog dh_link dh_strip

Сожмем файлы (man, info ...) и поправим симлинки на них.

dh_compress

Установим пермишены в соответствии с полиси

dh_fixperms

Сгенерируем список устанавливаемых библиотек shlib

# dh_makeshlibs

Установим скрипты, shlibs и conffiles, сгенерированные предыдущими скриптами в DEBIAN.

dh_installdeb

Посчитаем зависимости от перловых библиотек.

# dh_perl

Посчитаем зависимости от библиотек для замены ${shlibs:Depend}

dh_shlibdeps

Сгенерируем файл control подставив макросы.

dh_gencontrol

Сгенерируем суммы.

dh_md5sums

Запакуем это дело в deb.

dh_builddeb

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

Для сборки можно воспользоваться скриптом debuild из devscripts, либо dpkg-buildpackage из dpkg-dev (debuild пользуется ею). Запустив debuild в корне исходников получим на уровне выше готовый deb.


next up previous contents
Next: Сборка с использованием программ Up: Создание пакета исходных кодов Previous: Формат пакета исходных кодов   Contents
Zhenja Kaluta 2002-12-12