Сборка с использованием debhelper
В debian существует достаточное количество инструментов, помогающих автоматизировать процесс дебианизации. Рассмотрим debhelper(1), как наиболее часто встречающийся и рекомендованный в developers-reference. Пакет debhelper представляет собой набор скриптов dh_*, облегчающие процесс конфигурирования и компиляции программы, инсталяции ее и сборки в результирующий deb. Для работы с debhelper рекомендую воспользоваться программой dh_make из пакета dh-make.
dh_make -c gpl -e mycool@e-mail.com
Подробнее о последнем пункте. Рассмотрим ситуацию генерации 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
Zhenja Kaluta 2002-12-12