Ceci est une ancienne révision du document !
Créer simplement un package Debian/Ubuntu
Présentation
Certains tuto de création d'un package explique comment faire, alors quel est l'interêt de ce tuto ? Tous simplement j'ai eu un problème de taille: soit je n'avais pas l'arborescence de présente dans le package, soit elle y était mais c'était vide.
Après de l'aide d'un forum, recherche sur le net, lecture multiples de tuto et de la persévérance, j'ai découvert le moyen le plus simple de créer son package.
L'exemple du tuto est un jeu de MarioSokoban que j'ai réalisé d'après le TP de M@teo21 sur le SiteDuZero.
Pré-requis
Il faut avoir installé les packages suivants:
- debhelper
- cdbs
- lintian
- linda
- build-essential
- fakeroot
- devscripts
- pbuilder
- dh_make
- libsdl1.2-dev
- libsdl-image1.2-dev
sudo apt-get install debhelper cdbs lintian linda build-essential fakeroot devscripts pbuilder dh-make libsdl1.2-dev libsdl-image1.2-dev
Création de notre package source et binaire
Téléchargement des sources
Créer le répertoire packages dans votre ~/(votre répertoire personnel donc):
mkdir ~/packages cd ~/packages
Puis, nous avons besoin de télécharger les sources, pour cela allez sur mon site:
wget http://christophedlr1.free.fr/autres/packages/exemples/mariosokoban.tar.gz
Faite ensuite:
tar xvzf mariosokoban.tar.gz
afin de le décompresser.
créer ensuite un dossier ayant le nom du jeu suivit de la version, dans le cas de se tutorial c'est:
mkdir mariosokoban-0.0.1
puis déplacer les fichiers/dossiers décompressé en faisant:
mv -f c* m* images mariosokoban-0.0.1/
Il va vous indiquer qu'il ne peut déplacer mariosokoban-0.0.1 dans un sous répertoire de lui-même, cela est normal vous ne vous en préocuppez pas.
Création du dossier debian
Nous avons besoin d'un dossier spécial appelé debian, celui-ci contiendrat un tas de fichiers don nous avons besoin pour créer le package.
Plaçons nous dans le répertoire du jeu:
cd mariosokoban-0.0.1
Puis nous allons créer le fameu répertoire:
dh_make -e votre@mail --createorig
dh_make vous indique:
Type of package: single binary, multiple binary, library, kernel module or cdbs? [s/m/l/k/b]
Vous allez mettre s car c'est un simple paquet normal. Il vous affiche ensuite ceci:
Maintainer name : DE LOS RIOS Christophe Email-Address : christophedlr@yahoo.fr Date : Wed, 11 Apr 2007 11:43:40 +0200 Package Name : mariosokoban Version : 0.0.1 License : blank Type of Package : Single Hit <enter> to confirm
Il vous indique donc le nom du mainteneur du package, son mail, la date, le nom du package, sa version, son type et la license. Il demande une confirmation que c'est bien éxacte.
Le nom du mainteneur est pris comme étant le nom que vous avez entré dans la case nom/prénom a l'installation de linux et a la création de votre compte utilisateur. Le mail c'est celui que vous venez de lui indiquer. La date est enregistré depuis un timestamp.
Pour le nom du paquet et sa version, cela se complique: En effet, ont est dans un répertoire s'appelant mariosokoban-0.0.1. Ce qui se trouve avant le tiret correspond au nom du paquet donc ici mariosokoban, et ce qui se trouve après c'est le numéro de version, ici c'est 0.0.1 Pour la license, au départ il y en a pas. Puis viens le type du paquet, c'est ce que l'ont a choisi en répondant à la question de dh_make.
Ont confirme et il nous répond:
Done. Please edit the files in the debian/ subdirectory now. You should also check that the mariosokoban Makefiles install into $DESTDIR and not in / .
Il nous informe donc que le répertoire debian avec les fichiers correspondants sont créer, il nous informe aussi que dans notre makefile il faut un point appelé install avec la variable DESTDIR pour définir le répertoire d'installation. Ne vous inquiétez pas, pas besoin de toucher au makefile de ce tuto, tous est prêt pour.
Les modifications dans le dossier debian
allons dans ce fameu dossier debian et liston un peu le contenu:
cd debian/ ls
Nous avons pas loin de 24 fichiers présent ici, nous allons en modifier certains et nous en créérons un autre.
control
Modifions le fichier control:
emacs control
De base le fichier est le suivant:
Source: mariosokoban Section: unknown Priority: optional Maintainer: DE LOS RIOS Christophe <christophedlr@yahoo.fr> Build-Depends: debhelper (>= 5) Standards-Version: 3.7.2
Package: mariosokoban Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: <insert up to 60 chars description> <insert long description, indented with spaces>
Source est le nom du package source. Section correspond a la section, ici nous allons mettre games pour indiquer un jeu. Priority c'est al priorité, optionnel ça va très bien. Ensuite c'est le nom du mainteneur avec son mail entre crochet. Build-Depends correspond aux dépendances pour compiler, comme le jeu utilise la librairie SDL et SDL_image, ont va rajouter
libsdl1.2-dev(>=1.2), libsdl-image1.2(>=1.2)
Cette ligne sera donc:
Build-Depends: debhelper (>= 5), libsdl1.2-dev(>=1.2), libsdl-image1.2-dev(>=1.2)
D'abord nous mettons le nom du package de la librairie, suivit entre parenthèse du numéro de la version.
Dans cet exemple une version de la SDL supérieur à la 1.2 ou tous simplement la version 1.2 fonctionneront pour le jeu mais pas une version antérieur, nous indiquons cela en mettant >= qui signifie supérieur à (>) ou égale à( la version 1.2
Plus bas nous avons Package qui est le nom du package binaire cette fois. Architecture correspond au type d'ordinateur qui peut utiliser ce package, cela peut etre uniquement les I386, les PPC et autres types. Any ou All définisssent que c'est sur tous type d'architecture.
Nous avons ensuite Depends, vous supprimez ce qui se trouve entre accolade et vous mettez à la place ceci la librairie SDL et SDL_image:
Depends: libsdl1.2(>=1.2), libsdl-image1.2(>=1.2)
Pour Description, il s'agit de la description du package. Elle se compose de la suite de la ligne, et pour le reste de la description c'est sur chaque nouvelle ligne contenant un espace juste avant.
changelog
Modifions le fichier changelog:
emacs changelog
De base le fichier est:
mariosokoban (0.0.1-1) unstable; urgency=low * Initial release (Closes: #nnnn) <nnnn is the bug number of your ITP> -- DE LOS RIOS Christophe <christophedlr@yahoo.fr> Wed, 11 Apr 2007 11:43:40 +0200
Sur la première ligne nous avons le nom du package suivit de sa version entre parenthèse. en général le numéro est composé comme ceci: La version que vous donnez au programme suivit d'un tiret puis du numéro de version debian, si c'est ubuntu vous rajouté ubuntu et la version ubuntu. Le package n'éxiste pas sous debian, nous avons donc pas 0.0.1-1 comme version mais 0.0.1-0 puisque ca provient pas d'un package debian. Ensuite c'est prévu pour ubuntu, ont rajoute donc ubuntu et comme c'est le premier sous ubuntu ont met 0. La version sera donc: 0.0.1-0ubuntu1
Ensuite nous voyons unstable, cela correspond a la version de la distribution debian, comme ont est sous ubuntu, ont va mettre le nom de code de notre version. Dans cet exemple ont va mettre edgy à la place. Notre ligne est donc finalement:
mariosokoban (0.0.1-0ubuntu1) edgy; urgency=low
Ensuite le (Closes: #nnnn) <nnnn is the bug number of your ITP> vous pouvez le supprimer, cela permet juste de clore un bug debian, c'est pas utilisé sous linux. Cette ligne, ayant toujours deux espaces et une étoile au début, permet d'indiquer les changements dans le programme.
En dernier nous avons le nom/prénom du mainteneur, son e-mail et la date enregistré au format UTC + le GMT, par exemple en ce moment en france nous somme en GMT+1 mais otn a rajouté 1H, c'est comme si ont était en GMT+2, ont va donc mettre la date/heure au format UTC et ont rajoutera: + 0200
dirs
Nous allons ouvrir le fichier dirs:
emacs dirs
Ce fichier contient la liste des dossiers utilisé dans votre programme, son arborescence. Nous utilisons dans le jeu le répertoire /usr/share/games/mariosokoban comme dossier de destination du jeu compilé et /usr/share/games/mariosokoban/images pour les images du jeu. Nous allons au dessus des 2 autres répertoires, rajouter:
usr/share/games/mariosokoban/images
Nous indiquons le répertoire sans dire qu'il est à la racine car il faudrat qu'il soit créer dans le répertoire debian où nous nous trouvons. Comme je n'ai que deux répertoires don je me sert, inutile donner le répertoire parent du programme qui sera /usr/share/games/mariosokoban, ont indique juste celui des images puisque le répertoire parent sera directement créer pour créer celui des images.
rules
Ouvrons maintenant le fichier rules:
emacs rules
A la ligne 59 nous avons:
$(MAKE) install DESTDIR=$(CURDIR)/debian/mariosokoban
Changeons cette ligne pour la ligne qui correspondra au dossier de destination donné ci-dessus mais dans le répertoire debian:
$(MAKE) install DESTDIR=$(CURDIR)/debian/usr/share/games/mariosokoban
à la ligne 73 nous avons:
# dh_install
Enlevons le dièse qui commente donc la ligne dh_install. dh_install va nous servir afin de créer notre arborescence dans le apckage debian afin de le retrouver une fois le jeu installé.
mariosokoban.install
Nous allons maintenant créer un fichier qui sera le nom du package donc ici mariosokoban avec l'extension install:
emacs mariosokoban.install
Nous allons mette dedans l'emplacement de chacun des fichiers, ont peut utiliser les caractères générique comme l'étoile. En premier nous donnons le fichier, ensuite le répertoire de destination. Nous avons donc:
mariosokoban usr/share/games/mariosokoban images/*.* usr/share/games/mariosokoban/images
La première ligne indique que le fichier mariosokoban résultant de la compilation se trouvera au final dans le répertoire usr/share/games/mariosokoban. La seconde indique que tous les fichiers se trouvant dans le répertoires images seront dans usr/share/games/mariosokoban/images.
Ce fichier va permettre à dh_install à son éxécution de rechercher tous les fichiers du jeu et de les placer dans se répertoire.
Création de notre package final
Quittons le répertoire debian:
cd ..
Nous allons maintenant créer notre package en faisant:
fakeroot dpkg-buildpackage -us -uc
fakeroot sert à manipuler des fichiers comme si ont était root. dpkg-buildpackage va servir à créer notre paquet. les paramètres -us -uc vont indiquer la création d'un paquet source .tar.gz(-us) et un paquet binaire .deb(-uc).
Il nous affiche:
dpkg-buildpackage: source package is mariosokoban dpkg-buildpackage: source version is 0.0.1-0ubuntu1 dpkg-buildpackage: source changed by DE LOS RIOS Christophe <christophedlr@yahoo.fr> dpkg-buildpackage: host architecture i386 dpkg-buildpackage: source version without epoch 0.0.1-0ubuntu1 debian/rules clean dh_testdir dh_testroot rm -f build-stamp configure-stamp # Add here commands to clean up after the build process. /usr/bin/make clean make[1]: entrant dans le répertoire « /home/christophedlr/test/mariosokoban-0.0.1 » rm -rf *.o make[1]: quittant le répertoire « /home/christophedlr/test/mariosokoban-0.0.1 » dh_clean dpkg-source -b mariosokoban-0.0.1 dpkg-source : construction de mariosokoban dans mariosokoban_0.0.1-0ubuntu1.tar.gz dpkg-source : construction de mariosokoban dans mariosokoban_0.0.1-0ubuntu1.dsc debian/rules build dh_testdir # Add here commands to configure the package. touch configure-stamp dh_testdir # Add here commands to compile the package. /usr/bin/make make[1]: entrant dans le répertoire « /home/christophedlr/test/mariosokoban-0.0.1 » gcc -c main.c -o main.o gcc -c cmdline.c -o cmdline.o gcc main.o cmdline.o -o mariosokoban -lSDLmain -lSDL -lSDL_image make[1]: quittant le répertoire « /home/christophedlr/test/mariosokoban-0.0.1 » #docbook-to-man debian/mariosokoban.sgml > mariosokoban.1 touch build-stamp debian/rules binary dh_testdir dh_testroot dh_clean -k dh_installdirs # Add here commands to install the package into debian/mariosokoban. /usr/bin/make install DESTDIR=/home/christophedlr/test/mariosokoban-0.0.1/debian/usr/share/games/mariosokoban/ make[1]: entrant dans le répertoire « /home/christophedlr/test/mariosokoban-0.0.1 » mkdir -p /home/christophedlr/test/mariosokoban-0.0.1/debian/usr/share/games/mariosokoban//images cp mariosokoban /home/christophedlr/test/mariosokoban-0.0.1/debian/usr/share/games/mariosokoban/ cp ./images/*.* /home/christophedlr/test/mariosokoban-0.0.1/debian/usr/share/games/mariosokoban//images make[1]: quittant le répertoire « /home/christophedlr/test/mariosokoban-0.0.1 » dh_testdir dh_testroot dh_installchangelogs dh_installdocs dh_installexamples dh_install dh_installman dh_link dh_strip dh_compress dh_fixperms dh_installdeb dh_shlibdeps dh_gencontrol dpkg-gencontrol : avertissement : variable de substitution inconnue ${misc:Depends} dh_md5sums dh_builddeb dpkg-deb : construction du paquet « mariosokoban » dans « ../mariosokoban_0.0.1-0ubuntu1_i386.deb ». tar: -: file name read contains nul character dpkg-genchanges dpkg-genchanges: inclusion du code source original dans l'envoi (« upload ») dpkg-buildpackage: full upload; Debian-native package (full source is included)
Ce qui nous intéresse ici c'est:
dpkg-genchanges: inclusion du code source original dans l'envoi (« upload ») dpkg-buildpackage: full upload; Debian-native package (full source is included)
Ces deux lignes nous informent que le package a bien été créé.
Vérification de la bonne création du package
Nous allons vérifier que le package est correct. Retournons dans le répertoire contenant le répertoire du jeu, vous savez celui qui s'appelle: mariosokoban-0.0.1 Ontva donc faire un simple:
cd ..
On va ensuite faire un ls pour afficher le résultat:
mariosokoban-0.0.1 mariosokoban_0.0.1-0ubuntu1_i386.deb mariosokoban_0.0.1-0ubuntu1.dsc mariosokoban_0.0.1-0ubuntu1.tar.gz mariosokoban_0.0.1-0ubuntu1_i386.changes
Nous avons donc le répertoire contenant les sources et les informations pour créer notre package. Un fichier .dsc servant à la création du binaire, un .changes pareil. Puis nous avons un .deb, c'est notre jeu compilé et prêt à être utilisé. Le .tar.gz quand à lui contient uniquement les fichiers sources du jeu.
Vérifions que nous avons tous ce que nous voulons dans le .deb, je rappel que nous voulons un répertoire usr/share/games/mariosokoban contenant le jeu compilé et usr/share/games/mariosokoban/images contenant les image du jeu.
Nous faisons la vérification:
dpkg -c mariosokoban_0.0.1-0ubuntu1_i386.deb
Il nous affichera:
drwxr-xr-x root/root 0 2007-04-11 13:50 ./ drwxr-xr-x root/root 0 2007-04-11 13:50 ./usr/ drwxr-xr-x root/root 0 2007-04-11 13:50 ./usr/share/ drwxr-xr-x root/root 0 2007-04-11 13:50 ./usr/share/games/ drwxr-xr-x root/root 0 2007-04-11 13:50 ./usr/share/games/mariosokoban/ -rwxr-xr-x root/root 4692 2007-04-11 13:50 ./usr/share/games/mariosokoban/mariosokoban drwxr-xr-x root/root 0 2007-04-11 13:50 ./usr/share/games/mariosokoban/images/ -rw-r--r-- root/root 9011 2007-04-10 20:21 ./usr/share/games/mariosokoban/images/caisse.jpg -rw-r--r-- root/root 8978 2007-04-10 20:21 ./usr/share/games/mariosokoban/images/caisse_ok.jpg -rw-r--r-- root/root 1062 2007-04-10 20:21 ./usr/share/games/mariosokoban/images/mario_bas.gif -rw-r--r-- root/root 1037 2007-04-10 20:21 ./usr/share/games/mariosokoban/images/mario_droite.gif -rw-r--r-- root/root 1035 2007-04-10 20:21 ./usr/share/games/mariosokoban/images/mario_gauche.gif -rw-r--r-- root/root 1035 2007-04-10 20:21 ./usr/share/games/mariosokoban/images/mario_haut.gif -rw-r--r-- root/root 24864 2007-04-10 20:21 ./usr/share/games/mariosokoban/images/menu.jpg -rw-r--r-- root/root 9333 2007-04-10 20:21 ./usr/share/games/mariosokoban/images/mur.jpg -rw-r--r-- root/root 1315 2007-04-10 20:21 ./usr/share/games/mariosokoban/images/objectif.png drwxr-xr-x root/root 0 2007-04-11 13:50 ./usr/share/doc/ drwxr-xr-x root/root 0 2007-04-11 13:50 ./usr/share/doc/mariosokoban/ -rw-r--r-- root/root 203 2007-04-11 11:49 ./usr/share/doc/mariosokoban/README.Debian -rw-r--r-- root/root 653 2007-04-11 11:49 ./usr/share/doc/mariosokoban/copyright -rw-r--r-- root/root 173 2007-04-11 13:19 ./usr/share/doc/mariosokoban/changelog.Debian.gz drwxr-xr-x root/root 0 2007-04-11 13:50 ./usr/bin/ drwxr-xr-x root/root 0 2007-04-11 13:50 ./usr/sbin/
Nous retrouvons bien ce que nous voulons, seule chose nous avons sur/share/doc en plus créer automatiquement par dpkg et usr/bin ainsi que usr/sbin comme c'était indiqué dans le fichier dirs.
Installons maintenant le jeu pour etre tous a fait sur:
sudo dpkg -i mariosokoban_0.0.1-0ubuntu1_i386.deb
Faisons maintenant:
ls /usr/share/games
Afin de vérifier que tout s'est bien passé, nous voyons bien notre répertoire mariosokoban, lisons ce qu'il y a dedans:
ls /usr/share/games/mariosokoban
Nous voyons un fichier éxécutable (mariosokoban) et un répertoire (images), listons ce répertore:
ls /usr/share/games/mariosokoban/images
Nous voyons bien qu'il y a les images.
Final
Nous voyons donc que tous à fonctionné à la perfection. si nous voulons désinstaller le jeu nous avons juste à faire:
apt-get remove mariosokoban
et APT supprimera donc l'installation d'après le package.
Remerciements
Merci d'être venu lire ce tutorial sur la création d'un paquet debian/ubuntu de manière simple sans avoir à chercher pendant un moment d'où viens le problème.
Si vous avez des suggestions, faite m'en part sur le forum ou encore par e-mail.
Ce tutorial m'a pris quelques heures car je n'avais pas pris de notes quand j'ai trouvé la solution, j'ai donc du refaire en même temps que je rédigé.
Cela me permet d'ailleurs de vous montrer que le tutorial est pleinement fonctionnel (normal sinon je n'aurais pas fais le tuto )
J'espère que vous avez pris autant de plaisir à lire ce tutorial que moi à l'écrire.
Constributeur: Otheym