Cette page n'a pas encore d'étiquettes.
Apportez votre aide…

Ceci est une ancienne révision du document !


Créer simplement un package Debian/Ubuntu

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.

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é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.

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.

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.

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 correcte, retournons dans le répertoire contenant le répertoire du jeu, vous savez celui qui s'appel: mariosokoban-0.0.1 ont va donc faire un simple:

 cd ..

ont 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 ud 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 tous c'est bien passé, nous voyons bien notre répertoire mariosokoban, lison 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.

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.

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'ailleur de vous montrer que le tutorial est pleinement fonctionnel(normale sinon je n'aurais pas fais le tuto LOL

J'espère que vous avez pris autant de plaisir à lire ce tutorial que moi à l'écrire.


Constributeur: Otheym

  • tutoriel/package_debian.1176987824.txt.gz
  • Dernière modification: Le 18/04/2011, 14:50
  • (modification externe)