Введение в создание пакетов для дистрибутива GNU Debian Linux

       

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


В debian существует достаточное количество инструментов, помогающих автоматизировать процесс дебианизации. Рассмотрим debhelper(1), как наиболее часто встречающийся и рекомендованный в developers-reference. Пакет debhelper представляет собой набор скриптов dh_*, облегчающие процесс конфигурирования и компиляции программы, инсталяции ее и сборки в результирующий deb. Для работы с debhelper рекомендую воспользоваться программой dh_make из пакета dh-make.

  • приводим название каталога исходников к виду, необходимому для dh_make(8): <название пакета>-<версия>;
  • в корне каталога исходников зовем dh_make(8). Например,

    dh_make -c gpl -e mycool@e-mail.com

  • идем в 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: Формат пакета исходных кодов

    &nbsp Contents

    Zhenja Kaluta 2002-12-12






    Содержание раздела