Paquet Debian et Qt

Posté le 8. September 2008 dans Programmation

A titre personnel je fabrique quelques programmes en Qt. Comme j'utilise un système Gnu/Debian, j'ai cherché à fabriquer des paquets pour mon système (plus pour le plaisir qu'autre chose, car la plus grande partie de mes utilisateurs sont sous MS/Windows).

Ce billet explique la création de paquet Gnu/Debian pour des applications Qt 4 utilisant QMake

Installation des paquets

Pour la création des paquets pour des programmes utilisant qmake, il faut cdbs, dh_make, dpkg-buildpackage.

aptitude install cdbs dh-make fakeroot devscripts

Création du paquet

Préparation

Vous pouvez donc choisir un de vos programmes que vous voulez empaqueter. Pour cela vous allez commencer par nettoyer l'arborescence de votre projet pour retirer les fichiers de sauvegarde ainsi que les fichiers de construction (*~ *.o, ...). Ce petit nettoyage va permettre d'avoir un paquet source propre.

Il faut que vous placiez les sources dans un dossier du nom de <programme>-<version>.

Voici un exemple de fichier projet :

TARGET = qgenconfig
TEMPLATE = app

CONFIG += exceptions warn_on qt
QT += xml

HEADERS += src/loadconfigimpl.h \\
    src/setupfile.h \\
    src/configfile.h \\
    src/p_configfile.h
SOURCES += src/loadconfigimpl.cpp \\
    src/setupfile.cpp \\
    src/main.cpp \\
    src/configfile.cpp
FORMS = ui/loadconfig.ui

DESTDIR = bin
MOC_DIR = build
OBJECTS_DIR = build
UI_DIR = build

Pour générer le Makefile, vous pouvez faire comme d'habitude :

qmake-qt4 qgenconfig.pro

Création des scripts

Pour créer les paquets, il faut un ensemble de script dans le dossier debian. Pour se faciliter la vie, il est possible de créer les scripts avec dh_make.

DEBFULLNAME="Ulrich Van Den Hekke"
dh_make -e ulrich.vdh@shadoware.org -n -s -c gpl

Voici la description de la liste des paramètres :

  • DEBFULLNAME indique le nom du mainteneur.
  • -e Permet de préciser l'email (suivis de l'email).
  • -n Produit un paquet natif pour Gnu/Debian (quand l'auteur fait ses paquets lui-même).
  • -s Indique que le paquet ne va contenir qu'un simple exécutable (si vous voulez faire plusieurs paquets, il suffit de ne pas mettre cette option).
  • -c Indique la licence d'utilisation (ici gpl).

Vous pouvez ensuite supprimer les fichiers exemples (mais pas nécessairement si vous voulez les étudier).

rm debian/*.ex  debian/*.EX  debian/docs  debian/dirs
Paquet simple

Nous allons commencer par créer un paquet simple. Cela signifie qu'il n'y aura qu'un seul exécutable dans le paquet (pas de librairie, ...).

Dans le fichier control, il faut que vous renseignez les informations du paquet que vous allez créer.

Source: qgenconfig
Section: devel
Priority: extra
Maintainer: Ulrich Van Den Hekke <ulrich.vdh@shadoware.org>
Build-Depends: debhelper (>= 7)
Standards-Version: 3.7.3
Homepage: http://projects.shadoware.org/qgenconfig

Package: qgenconfig
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: Create a config class in Qt after loading a XML file.
    Load an XML description file of a settings object and create a class
    that can be used to load and save information in a QSettings class. To
    load information structure are used.

Dans le paquet ci-dessus, on créait un paquet binaire et un paquet source. Les variables de dépendance (dans Depends) sont remplacées automatiquement à la génération du paquet. La description est celle écrite dans aptitude. La première ligne est la description courte, les suivantes (précédées d'un espace) sont la description longue.

Ensuite on va remplacer le fichier debian/rules en utilisant cdbs :

#!/usr/bin/make -f
include /usr/share/cdbs/1/rules/debhelper.mk
include /usr/share/cdbs/1/class/qmake.mk
QMAKE=qmake-qt4

install/qgenconfig::
    mkdir $(DEB_DESTDIR)/usr/
    mkdir $(DEB_DESTDIR)/usr/bin/
    cp $(CURDIR)/bin/qgenconfig $(DEB_DESTDIR)/usr/bin/

En premier lieu on définit les variables pour la compilation, puis ensuite on définit les opérations d'installations dans la cible install/qgenconfig1.Dans les opérations, vous allez copier votre exécutable dans le dossier de génération de debian (dossier debian/<cible>).

Paquet multiple

Créer plusieurs paquets à partir d'une même source avec cdbs est assez simple. Il suffit de rajouter des cibles, correspondantes au fichier control, dans le fichier rules .

Dans le fichier de control on va avoir plusieurs paquets binaires pour un seul paquet source.

Source: xinx
Section: devel
Priority: extra
Maintainer: Ulrich Van Den Hekke <xinx@shadoware.org>
Build-Depends: debhelper (>= 7)
Standards-Version: 3.7.3
Homepage: http://xinx.shadoware.org/

Package: xinx
Section: devel
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}, xinx-scripts (>= 0.7.2.0)
Recommends: xinx-plugins-services, xinx-plugins-cvs, xinx-plugins-svn
Suggests: xinx-doc
Description: XSL/JS/HTML editor for Generix
    XINX is an editor of XSL stylesheet, JavaScript, Cascading Style Sheet.
    This editor is used with egx.

Package: xinx-doc
Section: doc
Architecture: all
Depends: xinx (>= 0.7.2.0)
Description: Documentation for xinx
    Technical Documentation of XINX

Nous allons définir dans le fichier rules les différentes cibles que nous avons dans le fichier control2^.

#!/usr/bin/make -f
include /usr/share/cdbs/1/rules/debhelper.mk
include /usr/share/cdbs/1/class/qmake.mk
QMAKE=qmake-qt4 project.pro

install/xinx::
    mkdir $(CURDIR)/debian/xinx/usr/
    mkdir $(CURDIR)/debian/xinx/usr/bin/
    cp $(CURDIR)/xinx/xinx $(CURDIR)/debian/xinx/usr/bin/
    cp $(CURDIR)/xinxprojectwizard/xinxprojectwizard $(CURDIR)/debian/xinx/usr/bin/

    mkdir $(CURDIR)/debian/xinx/usr/lib/
    cp -a $(CURDIR)/libxinx/libsharedxinx* $(CURDIR)/debian/xinx/usr/lib/
    cp -a $(CURDIR)/components/libxinxcmp* $(CURDIR)/debian/xinx/usr/lib/

install/xinx-doc::
    mkdir $(CURDIR)/debian/xinx-doc/usr/
    mkdir $(CURDIR)/debian/xinx-doc/usr/share/
    mkdir $(CURDIR)/debian/xinx-doc/usr/share/doc/
    mkdir $(CURDIR)/debian/xinx-doc/usr/share/doc/xinx-doc/
    cp -a $(CURDIR)/doc/* $(CURDIR)/debian/xinx-doc/usr/share/doc/xinx-doc/
    rm -rf $(CURDIR)/debian/xinx-doc/usr/share/doc/xinx-doc/html/.svn

Ici on génère deux paquets, le paquet binaire et la documentation.

Génération du paquet

Mise à jour des informations du paquets
  • Pour modifier le changelog sur la version courante
dch -a
  • Pour créer une nouvelle version
dch -i
Création du paquet
dpkg-buildpackage -rfakeroot

L'application va signer le paquet s'il trouve la clé assignée à l'utilisateur.

Création d'un dépôt

Après avoir créé des paquets, il peut-être intéressant de créer un dépôt pour installer ces paquets. voici la marche à suivre pour créer le dépôt.

Sur votre serveur internet (nous ne parlerons pas ici de la mise à disposition sur Internet), vous allez devoir créer un dossier contenant votre référentiel (exemple : /www/sites/apt).

Création de l'arborescence

Vous allez devoir créer une arborescence comme suite :

dists
    +- main
        |- binary-i386
        |- binary-amd64
        +- source

Parmi les fichiers générés vous allez devoir mettre le fichier .deb dans le dossier binaire, et les fichiers .changes, .dsc, et .tar.gz dans le dossier source.

Création d'un fichier apt-ftparchive.conf

Nous allons commencer par créer un fichier apt-ftparchive.conf dans lequel nous allons définir les fichiers à créer.

Dir {
    ArchiveDir ".";
    CacheDir ".";
};

Tree "dists/unstable" {
    Sections "main";
    Architectures "amd64 source";
};

BinDirectory "dists/unstable/main/binary-amd64" {
    Packages "dists/unstable/main/binary-amd64/Packages";
    Contents "dists/unstable/Contents-amd64";
    SrcPackages "dists/unstable/main/source/Sources";
};

Création du fichier apt-unstable-release.conf

APT::FTPArchive::Release::Origin    "shadoware.org";
APT::FTPArchive::Release::Label     "shadoware.org";
APT::FTPArchive::Release::Suite     "unstable";
APT::FTPArchive::Release::Codename   "unstable";
APT::FTPArchive::Release::Architectures  "amd64 source";
APT::FTPArchive::Release::Components "main";
APT::FTPArchive::Release::Description    "Paquets du site Shadoware.Org";

Création du fichier update-archive.sh

Ce fichier est celui que l'on doit exécuter pour la génération du contenu de l'arborescence :

apt-ftparchive generate apt-ftparchive.conf
apt-ftparchive -c apt-unstable-release.conf release dists/unstable > dists/unstable/Release

  1. D'autres cibles sont disponibles (cf la doc de cdbs).

  2. A cause d'un bogue, ou d'une mauvaise utilisation, la variable $(DEB_DESTDIR) ne me ramenait pas la bonne valeur, je l'ai donc remplacée par $(CURDIR)/debian.