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

Чтобы придать законченность проекту, как правило, необходимо подготовить дистрибутив или инсталляционный пакет. В статье рассматривается путь создания deb-пакетов для проектов, написанных на qt, которые используются для установки программного обеспечения во многих популярных linux дистрибутивах, например ubuntu или 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 должен быть запущен из каталога с исходным кодом вашего приложения, данный каталог должен иметь имя в формате -(например, 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 =  target.path = /usr/bin data.path = /usr/share//data data.files = data/* INSTALLS += target data }
На уровень выше - в каталоге - создать файл 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, находясь в каталоге - (svgplayer-0.5/):
dh_make --createorig --single -e maintainer@email.org -c gpl
–createorig - исходный код программы будет скопирован в -.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. Если потребуется изменить версию лецензии, то это можно изменить непосредственно в файле. В результате будут созданы каталоги -/debian(svgplayer-0.5/debian) cо всеми файлами, необходимыми для создания deb-пакета, и отдельный каталог с исходным кодом приложения -.orig (svgplayer-0.5.orig) на уровень выше(в том же каталоге, где был создан -). -.orig необходимо заархивировать в файл _.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
Марченко Светлана

  • +2
  • 22 декабря 2010, 23:25
  • osll

Комментарии (1)

RSS свернуть / развернуть
+
0
rpm было бы актуальней, но и на том спасибо))
avatar

arhi37

  • 22 декабря 2010, 23:55

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.