Paquet Debian et Qt
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 (icigpl
).
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/qgenconfig
[1].
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 control
[2].
#!/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