Создание deb пакетов для Qt проектов

Deb-пакет — архив файлов, используемый для распространения и установки программного обеспечения в операционных системах проекта Debian. Deb-пакет собирается из специально подготовленной структуры каталогов, которая определена требованиями Debian Policy (http://www.debian.org/doc/debian-policy/ch-controlfields.html).

Архив с расширением deb включает в себя другие архивы:

  • архив control.tar.gz — содержит инструкции(скрипты), выполняемые при установке/удалении пакета, и другие служебные файлы — файлы для данного архива создаются разработчиком (maintainer); DEBIAN/ — каталог, в котором содержится служебная информация о пакете, далее при сборке будет архивирован в файл control.tar.gz. Все файлы внутри каталога DEBIAN имеют такую же структуру и расположение, какие будут после установки deb-пакета в файловой системе пользователя (например, DEBIAN/usr/share/doc/package/copyright).
  • архив data.tar.gz — содержит двоичные файлы приложения, которое должно быть установлено при помощи deb-пакета;
  • файл debian-binary.



Для создания deb-пакета необходимо в некотором каталоге создать нужную иерархию/структуру файлов и запустить на выполнение dpkg -build.



Можно воспользоваться утилитами, которые упрощают создание необходимой структуры файлов. Часто совместно используют debhelper и dh_make. debhelper — коллекция различных Perl скриптов, которые являются готовыми решениями задач, возникающих при создании deb-пакета:

  • генерация файла md5sums ( данный файл необходим для верификации пакета при установке и содержит md5 хеш-суммы всех файлов, кроме файлов каталога DEBIAN);
  • автоматическое выполнение при установке скриптов init;
  • архивация справочных страниц man и др.



Все программы коллекции debhelper имеют префикс dh_. dh_make разрабатывался отдельно, поэтому не содержится в наборе утилит debhelper — его нужно будет установить дополнительно. dh_make формирует из пакета с исходным кодом программы другой, который требуется для создания deb-пакета: при этом происходит копирование шаблонов всех файлов, необходимых для постройки deb-пакета из исходного кода программы. После запуска dh_make потребуется отредактировать некоторые файлы. dh_make должен быть запущен из каталога с исходным кодом вашего приложения, данный каталог должен иметь имя в формате <package-name>-(например, svgplayer-o.5), при этом все символы в имени должны быть в нижнем регистре, могут содержать цифры и тире. Если имя не удовлетворяет этим требованиям, то при запуске dh_make можно использовать опцию –packagename. Внутри созданного каталога необходимо создать еще один — src, и поместить туда исходный код вашего Qt проекта и переименовать src/appname.pro в src/src.pro.



В конце файла src.pro добавить:

unix { 
#VARIABLES
isEmpty(PREFIX) {
  PREFIX = /usr
}
BINDIR = $$PREFIX/bin
DATADIR =$$PREFIX/share
DEFINES += DATADIR=\\\"$$DATADIR\\\" PKGDATADIR=\\\"$$PKGDATADIR\\\"
#MAKE INSTALL
TARGET = <application>
target.path = /usr/bin
data.path = /usr/share/<application>/data
data.files = data/*
INSTALLS += target data

}



На уровень выше — в каталоге <package-name>-создать файл myapp.pro(например, svgplayer-0.5/svgplayer.pro), в который поместить следующий код:


QMAKEVERSION = $$[QMAKE_VERSION]
ISQT4 = $$find(QMAKEVERSION, ^[2-9])
isEmpty( ISQT4 ) {
    error("Use the qmake include with Qt4.4 or greater, on Debian that is qmake-qt4");
}

TEMPLATE = subdirs
SUBDIRS  = src





Запустить dh_make, находясь в каталоге <package-name>-(svgplayer-0.5/):

dh_make --createorig --single -e maintainer@email.org -c gpl



–createorig — исходный код программы будет скопирован в <package-name>-.orig и затем заархивирован. –single — указывает класс собираемого пакета, в данном случае будет собран один бинарный .deb пакет. Возможные значения:

  • Single binary (s);
  • Arch-Independent (i);

  • Multiple binary (m);
  • Library (l);
  • Kernel module (k);
  • cdbs (b) — при сборке будет использована Common Debian Build System;
  • Kernel patch.



-e — используется для указания e-mail адреса разработчика (maintainer), данная информация будет содержаться в соответствующем поле файла debian/control.

-c — тип лиценции, по которой будет распространяться пакет. Возможные значения: gpl, gpl2, gpl3, lgpl, lgpl2 lgpl3, artistic, apache или bsd. Данное значение является регистронезависимым, т.е. -c GPL будет означать то же самое, что и -c gpl. gpl и lgpl будут автоматически отнесены к версии 3, apache — Apache v2.0. Если потребуется изменить версию лецензии, то это можно изменить непосредственно в файле.



В результате будут созданы каталоги <package-name>-/debian(svgplayer-0.5/debian) cо всеми файлами, необходимыми для создания deb-пакета, и отдельный каталог с исходным кодом приложения <package-name>-.orig (svgplayer-0.5.orig) на уровень выше(в том же каталоге, где был создан <package-name>-). <package-name>-.orig необходимо заархивировать в файл <package-name>_.orig.tar.gz (обратите внимание: тире следует заменить на знак подчеркивания).



Основные файлы каталога debian:

  • debian/changelog — история изменений, используется dpkg для получения номера версии, ревизии, дистрибутива. Обычно устанавливается в /usr/share/doc/package/changelog.Debian.gz, что можно изменить, используя команду dch;
  • debian/compat — используется программами debhelper, содержит только номер используемой версии;

  • debian/control — содержит необходимую описательную информацию о пакете;


  • Основные поля файла control:

    Description — Короткое описание пакета (одна строка) и полное описание пакета (один или несколько абзацев);

    Maintainer — имя и координаты майнтенера, создавшего пакет;

    Priority — уровень важности пакета;

    Architecture — архитектура для которой данный пакет собран;

    Depends — содержит имена пакетов, без которых не будет работать программа. Если пакеты, указанные в этом типе зависимостей, не установлены, то и данный пакет не будет установлен.

    Suggests — пакеты, которые не обязательны для работы пакета, но могут расширить функциональность вашего пакета.

    Pre-Depends — тип зависимостей, более строгий, чем Depends.

    Conflicts — пакеты, с которыми не будет работать программа.

    Replaces — тип зависимостей, при котором пакет заменяет какие-либо файлы из другого пакета.


  • debian/copyright — описание лицензии, под которой распространяется пакет;

  • debian/rules — makefile, используемый для определения действий при сборке пакета.



Файлы debian/rules и debian/control необходимо отредактировать. В файл control добавить зависимость:

build-Depends: debhelper (>= 7.0.50~), libqt4-dev





В файл rules следует поместить следующий код (обратите внимание, что в самом файле каждая команда цели должна начинаться с символа табуляции, при копировании кода и его вставке в файл табуляция может быть заменена на пробелы, в этом случае будет ошибка при сборке пакета).


#!/usr/bin/make -f
  APPNAME := my_app_name
  builddir:
      mkdir -p builddir
      
  builddir/Makefile: builddir
      cd builddir && qmake-qt4 PREFIX=/usr ../$(APPNAME).pro
  build: build-stamp
  build-stamp: builddir/Makefile
      dh_testdir
      # Add here commands to compile the package.
      cd builddir && $(MAKE)
      touch $@
  clean:
      dh_testdir
      dh_testroot
      rm -f build-stamp
      # Add here commands to clean up after the build process.
      rm -rf builddir
      dh_clean
  install: build
      dh_testdir
      dh_testroot
      dh_clean -k
      dh_installdirs
      # Add here commands to install the package into debian/your_appname
      cd builddir && $(MAKE) INSTALL_ROOT=$(CURDIR)/debian/$(APPNAME) 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_installdocs
      dh_installexamples
      dh_installman
      dh_link
      dh_compress
      dh_fixperms
      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





Следующий этап — сборка пакета. Чтобы убедиться, что внесенные изменения не повлияли на работоспособность самой программы, из каталога src нужно выполнить:

qmake
make



Если при компиляции проекта не возникает ошибок или все ошибки устранены, то для удаления скомпилированных двоичных файлов и приведения каталога с исходным кодом начальное состояние необходимо вызвать:

make distclean



Теперь можно запускать сборку командой debuild. В процессе debuild возможно потребуется настроить gpg (GNU Privacy Guard), например, при ошибке “secret key not available” необходимо выполнить $gpg –gen-key, указав имя пользователя и e-mail те же, для которых требуется ключ при сборке пакета. Для генерации ключа может потребоваться несколько минут.



После того, как пакет уже создан, можно вывести о нем некоторую информацию:



dpkg -I package.deb — выведет общую информацию о пакете, включая содержимое control-файла;



dpkg -c package.deb — выведет полный перечень файлов пакета.



lintian -is package.deb — покажет подробную информацию о проблемах в пакете (будут проверены правильность расположения двоичных файлов, наличие man-страниц, наличие ошибок описания пакета в файле control др.).



Если все проверки прошли успешно, то можно установить собранный пакет командой:

dpkg -i package.deb





Использованные источники:

  1. http://wiki.maemo.org/Packaging_a_Qt_application
  2. http://manpages.ubuntu.com/manpages/karmic/man8/dh_make.8.html



Марченко Светлана