Paquet Debian et Qt
Par Ulrich Van Den Hekke le lundi, septembre 8 2008, 20:45 - Distribution - Lien permanent
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 :
DEBFULLNAMEindique le nom du mainteneur.-ePermet de préciser l'email (suivis de l'email).-nProduit un paquet natif pour Gnu/Debian (quand l'auteur fait ses paquets lui-même).-sIndique 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).-cIndique 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
Commentaires
Pourrais-tu donner le fichier rules et control entier? J'ai une erreur et je comprends pas. Faut-il lancer une commande particulière pour "rafraichir" le process quand on modifie le fichier rules ? Ton article est destiné à des personnes qui savent déjà faire des paquets normaux. Il me faut plus d'information quoi.
Tu peux trouver mon fichier rules complet à cette adresse : http://xinx.shadoware.org/browser/trunk/debian/rules
Une fois le fichier rules modifier, il suffit de relancer la commande :
Il n'est pas necessaire de faire autre chose. Dans le dossier à l'adresse suivante tu peux trouver tout ce que j'utilise pour creer mon paquet.
Bonjour
Cool ce tuto MERCI beaucoup
Je programme en Qt pour Linux alors cela va me servir énormément.
J'ai testé cela fonctionne nikel.
Encore merci.
pour le fichier rules. Pourqûoi ne pas utiliser dh_install:
install/qgenconfig::
dh_install bin/qgenconfig /usr/bin/
Cela simplifie grandement le fichier et évite de faire des mkdir.
En effet, je ne savais pas qu'il était possible d'utiliser les dh_install dans le fichier rules utilisant cdbs.
Merci de l'information.