Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
tutoriel:creer_un_paquet [Le 02/11/2010, 14:04] – correction 86.67.229.2 | tutoriel:creer_un_paquet [Le 09/10/2018, 17:17] (Version actuelle) – pas de rm -rf si cd fail ... 176.133.45.15 | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | {{tag> | ||
+ | ---- | ||
+ | |||
+ | ====== Comment créer des paquets ? ====== | ||
+ | |||
+ | < | ||
+ | |||
+ | Dans une version récente d'un système [[: | ||
+ | <note aide>Il est aussi possible de créer un paquet d'une façon très simple avec [[: | ||
+ | |||
+ | ===== Pré-requis ===== | ||
+ | |||
+ | Pour pouvoir suivre cette documentation un certain nombre de pré-requis sont nécessaires : | ||
+ | |||
+ | * Les dépôts source doivent être disponibles dans synaptic (décommentez les lignes qui commencent par deb-src dans / | ||
+ | * [[tutoriel: | ||
+ | |||
+ | |||
+ | ===== Étude du contenu d'un paquet debian source ===== | ||
+ | |||
+ | ==== Paquet binaire et paquet source ==== | ||
+ | |||
+ | Commençons par une petite précision technique : | ||
+ | |||
+ | - Un paquet binaire est un paquet (.deb) qui contient les fichiers nécessaires à l' | ||
+ | Tous les paquets binaires disponibles dans les dépôts Ubuntu ont été construits à partir de paquets sources. | ||
+ | |||
+ | - Un paquet source est un ensemble de fichiers (attention le terme de paquet est utilisé par analogie. Il n'y a pas ici de fichier conteneur comme peut l' | ||
+ | |||
+ | ==== Étude d'un exemple de paquet source ==== | ||
+ | |||
+ | Pour illustrer cela, nous allons examiner le contenu d'un paquet source. Pour cela il faut le télécharger d'un des dépôts source configuré pour apt. | ||
+ | |||
+ | Commençons par créer le dossier dans lequel nous allons travailler. | ||
+ | |||
+ | mkdir ~/packaging && cd ~/packaging | ||
+ | |||
+ | Et téléchargeons un paquet source : | ||
+ | |||
+ | apt-get source xfce4-xkb-plugin | ||
+ | ls | ||
+ | |||
+ | La commande « ls » nous donne comme contenu : | ||
+ | * un répertoire xfce4-xkb-plugin-0.4.1 | ||
+ | * et les fichiers suivants : | ||
+ | * xfce4-xkb-plugin_0.4.1.orig.tar.gz | ||
+ | * xfce4-xkb-plugin_0.4.1-0ubuntu5.dsc | ||
+ | * xfce4-xkb-plugin_0.4.1-0ubuntu5.diff.gz | ||
+ | |||
+ | < | ||
+ | |||
+ | Le fichier **xfce4-xkb-plugin_0.4.1.orig.tar.gz** est en fait l' | ||
+ | |||
+ | Le fichier **xfce4-xkb-plugin_0.4.1-0ubuntu5.dsc** contient la description du paquet source (et des deux autres fichiers, avec leur taille et leur somme MD5). | ||
+ | |||
+ | Le fichier **xfce4-xkb-plugin_0.4.1-0ubuntu5.diff.gz** contient toutes les modifications nécessaires pour construire le paquet Debian. Constituer un paquet source nécessite d' | ||
+ | |||
+ | Maintenant que l'on a une idée de ce que sont les paquets sources, nous allons créer notre premier paquet. | ||
+ | |||
+ | ===== Création de notre premier paquet ===== | ||
+ | |||
+ | ==== Création du paquet source ==== | ||
+ | |||
+ | Pour notre exemple nous allons construire le paquet de l' | ||
+ | |||
+ | Après avoir supprimé le contenu de notre dossier « ~/ | ||
+ | |||
+ | Donc dans **~/ | ||
+ | |||
+ | <note warning> | ||
+ | |||
+ | cd ~/packaging && rm -rf * # on nettoie :-) | ||
+ | mkdir epdfview && cd epdfview | ||
+ | wget http:// | ||
+ | |||
+ | On utilise ici le site de Gloubiboulga en lieu et place du site officiel, car ce dernier est particulièrement lent. | ||
+ | Une fois les sources récupérées, | ||
+ | Il faut donc exécuter dans le terminal : | ||
+ | |||
+ | mv epdfview-0.1.5.tar.gz epdfview_0.1.5.orig.tar.gz | ||
+ | |||
+ | Notez le nom similaire au fichier correspondant que nous avons trouvé dans le chapitre précédent. | ||
+ | |||
+ | Puis on décompresse cette archive et on entre dans le répertoire contenant les sources : | ||
+ | |||
+ | tar zxvf epdfview_0.1.5.orig.tar.gz | ||
+ | cd epdfview-0.1.5 | ||
+ | |||
+ | Une règle d'or dans la création de paquets est de **ne pas toucher au tarball d' | ||
+ | Maintenant que les sources sont là, ainsi que le « .orig.tar.gz », | ||
+ | Pour créer un squelette de dossier « debian/ | ||
+ | |||
+ | La commande : | ||
+ | |||
+ | <code bash> | ||
+ | dh_make -e votreaddresse@email.tld | ||
+ | </ | ||
+ | |||
+ | doit normalement vous retourner ceci : | ||
+ | |||
+ | <code bash> | ||
+ | Type of package: single binary, multiple binary, library, kernel module or cdbs? | ||
+ | [s/m/l/k/b] | ||
+ | </ | ||
+ | |||
+ | Ceci vous permet de préciser quel type de package vous construisez. Ici, choisissez le type de paquet " | ||
+ | |||
+ | Pour les curieux, quelques commentaires sur les autres choix : | ||
+ | * multiple binary permet de créer plusieurs paquets binaires à partir d'un unique paquet source | ||
+ | * library permet de créer une bibliothèque (lib quelque chose) | ||
+ | * kernel module... un module pour le noyau | ||
+ | * cdbs... on verra plus tard | ||
+ | |||
+ | Attention, il faut saisir cette commande dans le dossier contenant les sources. Dans notre cas : | ||
+ | |||
+ | < | ||
+ | $ ~/ | ||
+ | Hit < | ||
+ | </ | ||
+ | |||
+ | On confirme avec la touche « Entrée ». | ||
+ | |||
+ | On doit maintenant avoir un dossier « debian/ | ||
+ | |||
+ | On entre dans ce dossier « debian/ | ||
+ | |||
+ | cd debian && ls | ||
+ | |||
+ | Et là, horreur, plein de fichiers à éditer ! Certains éléments de ce squelette ne nous sont pas utiles ici. On va supprimer le fichier « README » et les fichiers « *.ex » et « *.EX » (qui sont des fichiers exemples) avec la commande suivante : | ||
+ | |||
+ | rm -rf *ex *EX README* && ls | ||
+ | |||
+ | Il ne nous reste plus que 7 fichiers : | ||
+ | * changelog | ||
+ | * compat | ||
+ | * control | ||
+ | * copyright | ||
+ | * docs | ||
+ | * rules | ||
+ | * dirs | ||
+ | |||
+ | Le fichier « docs » n'est pas indispensable mais les 6 autres sont absolument essentiels et il va falloir les éditer avec votre éditeur de texte préféré. | ||
+ | |||
+ | === Le fichier « changelog » === | ||
+ | |||
+ | Il contient le détail de toute l' | ||
+ | * nom_du_paquet_source (version_du_paquet) distro; urgency=low | ||
+ | * ligne vide | ||
+ | * descriptif des changements | ||
+ | * ligne vide | ||
+ | * nom du packageur < | ||
+ | |||
+ | Attention à la syntaxe, les espaces et ponctuations ne sont pas anodins. La compilation du paquet source étant très automatisée, | ||
+ | |||
+ | Quelques mots sur les versions de paquets... Une même version d'un logiciel peut être empaquetée plusieurs fois. De même, Ubuntu étant basée sur Debian, il peut exister plusieurs modifications faites dans Ubuntu à partir du même paquet venant de chez Debian. Les versions sont donc de la forme *< | ||
+ | Ce qui donne pour nous (ePDFView n' | ||
+ | |||
+ | < | ||
+ | |||
+ | Il faut donc mettre à jour ce fichier avec : | ||
+ | * le nom du paquet ; | ||
+ | * la version ; | ||
+ | * le nom de la distribution (dapper) ou (edgy) à la place de " | ||
+ | |||
+ | Le « '' | ||
+ | |||
+ | Les dates et heures sont à renseigner au format UTC + décalage horaire. | ||
+ | |||
+ | Pour vérifier, voici un exemple de [[http:// | ||
+ | |||
+ | < | ||
+ | |||
+ | === Le fichier « copyright » === | ||
+ | |||
+ | Le squelette de ce fichier est plutôt clair, pas vraiment besoin de s' | ||
+ | Notez que ce n'est pas ce fichier qui sert de référence pour définir la licence, mais les fichiers source (qui contiennent le code, souvent présents dans un dossier « src/ | ||
+ | |||
+ | Regardez par exemple le fichier « DocumentRectangle.cxx » dans les sources : | ||
+ | |||
+ | less ../ | ||
+ | |||
+ | Les quatres premiers paragraphes sont ceux à recopier bêtement (et oui) dans « debian/ | ||
+ | Attention, vérifiez bien tous les fichiers sources ! Plusieurs copyrights ou licences peuvent être utilisés ! | ||
+ | Dans notre cas, le fichier « debian/ | ||
+ | [[http:// | ||
+ | |||
+ | Il est important de faire attention à ce fichier car s'il est mal renseigné, le détenteur du copyright peut très bien aller jusqu' | ||
+ | |||
+ | D' | ||
+ | |||
+ | === Le fichier « control » === | ||
+ | |||
+ | C'est le fichier de description du paquet source et de son paquet binaire résultant. | ||
+ | |||
+ | Le premier paragraphe décrit le paquet source. Le(s) paragraphe(s) suivant(s) décrit(décrivent) le(s) paquet(s) binaire(s), car il peut y avoir plusieurs paquets binaires générés pour un seul paquet source. Les champs présents dans ce fichier squelette **doivent** être présents. | ||
+ | |||
+ | Jetons d' | ||
+ | * Source: le nom du logiciel que vous packagez | ||
+ | * Section: la catégorie dans laquelle pourra se trouver le paquet source (voir [[http:// | ||
+ | * Priority: l' | ||
+ | * Maintainer: Le mainteneur du paquet, en l' | ||
+ | * Build-Depends: | ||
+ | |||
+ | * Standards-Version: | ||
+ | |||
+ | La debian policy peut faire peur... mais c'est la référence pour l' | ||
+ | |||
+ | Jetons ensuite un coup d'oeil aux champs concernant le paquet binaire : | ||
+ | * Package: le nom du paquet binaire (qui peut différer du nom du paquet source) | ||
+ | * Architecture: | ||
+ | * Depends: les dépendances du paquet (${shlibs: | ||
+ | * Description: | ||
+ | |||
+ | Notez que l'on peut indiquer ici les paquets supplémentaires suggérés par l' | ||
+ | |||
+ | Voici le fichier « control » de notre exemple : [[http:// | ||
+ | |||
+ | La difficulté principale de cette étape est d' | ||
+ | Attention lors des tests sur votre machine. Il se peut qu'une dépendance nécessaire soit déjà installée et que la compilation fonctionne (à priori) parfaitement. Cependant tous les paquets ubuntu sont compilés dans un environnement vierge. Si la ligne " | ||
+ | apt-cache show epdfview | ||
+ | </ | ||
+ | == Le paquet « debhelper » == | ||
+ | |||
+ | Dans la ligne Build-Depends figure la mention d'un paquet particulier : le paquet debhelper. | ||
+ | |||
+ | debhelper est un outil qui facilite la vie des empaqueteurs, | ||
+ | |||
+ | === Le fichier « compat » === | ||
+ | |||
+ | Ce fichier sert à indiquer la compatibilité debhelper. | ||
+ | |||
+ | === Le fichier « rules » === | ||
+ | |||
+ | Le fichier « rules » est un fichier exécutable. C'est lui qui va servir à piloter la compilation lors de la création du paquet binaire. | ||
+ | |||
+ | C'est ce fichier qui contient les règles nécessaires à la compilation du paquet. Le principe est simple. Il s'agit tout simplement de compiler le logiciel exactement comme on compile avec `./ | ||
+ | |||
+ | Le fichier rules est un makefile | ||
+ | * config.status: | ||
+ | * build: correspond au `make` ($(MAKE)) | ||
+ | * install: correspond au `make install` | ||
+ | |||
+ | Ici l' | ||
+ | Le fichier « rules » que vous avez n'a pas à être modifié pour notre exemple. | ||
+ | En général il n'est pas nécessaire de le modifier, c'est uniquement dans le cas où la compilation classique ('' | ||
+ | Par contre si l'on veut ajouter des éléments particuliers à l' | ||
+ | On va d' | ||
+ | |||
+ | wget http:// | ||
+ | |||
+ | Cette page est à installer dans « ~/ | ||
+ | Si vous ajoutez un fichier dans les sources c'est **toujours et uniquement** dans le dossier **debian**. Les sources de l' | ||
+ | |||
+ | Pour indiquer que l'on veut ajouter cette page man on va utiliser l' | ||
+ | Cherchez dans votre fichier rules la ligne qui contient // | ||
+ | |||
+ | dh_installman debian/ | ||
+ | |||
+ | (vous aurez remarqué que dh_installman fait partie des outils du paquet debhelper). | ||
+ | |||
+ | Pour avoir des informations sur tous les outils dh_* que vous voyez listés dans ce fichier n' | ||
+ | |||
+ | Une fois arrivé ici notre paquet source est prêt, il ne nous reste plus qu'à le créer vraiment pour pouvoir retrouver les trois fichiers que nous avons vus plus tôt, dans notre premier exemple. | ||
+ | |||
+ | === Le fichier « dirs » === | ||
+ | |||
+ | Le fichier « dirs » permet de créer des répertoires qui ne sont pas créés automatiquement à l' | ||
+ | |||
+ | |||
+ | |||
+ | ==== Construction des fichiers de compilation ==== | ||
+ | |||
+ | Pour construire ce paquet : | ||
+ | |||
+ | < | ||
+ | cd .. # on se place à la racine du dossier source : ~/ | ||
+ | debuild -S -sa --lintian-opts -i | ||
+ | </ | ||
+ | |||
+ | Le ' | ||
+ | La commande utilise automatiquement fakeroot (commande simulant les privilèges super-utilisateur) si rien est précisé (voir le man de debuild). | ||
+ | |||
+ | <note important>// | ||
+ | |||
+ | À ce stade, vous risquez d' | ||
+ | |||
+ | < | ||
+ | debuild: fatal error at line 791: | ||
+ | running debsign failed | ||
+ | </ | ||
+ | |||
+ | Pas de panique contrairement, | ||
+ | Pour créer une clef gpg voir le lien suivant : [[: | ||
+ | Si vous avez une clef gpg associée à l' | ||
+ | |||
+ | Pour obtenir cette clef, il vous suffit de la chercher. | ||
+ | < | ||
+ | gpg --list-keys une_partie_de_son_uid | ||
+ | </ | ||
+ | |||
+ | (la dernière option n'est pas obligatoire et permet simplement un tri) | ||
+ | |||
+ | Cela renvoie : | ||
+ | |||
+ | < | ||
+ | / | ||
+ | ---------------------------------- | ||
+ | pub | ||
+ | uid partie_de_son_uid (commentaire) < | ||
+ | sub | ||
+ | </ | ||
+ | Votre clef hexadécimale de 8 caractères récupérée , il vous suffit de rajouter un 0x devant afin de l' | ||
+ | debuild -k0x12345678 -S -sa --lintian-opts -i | ||
+ | |||
+ | Une autre solution est d' | ||
+ | < | ||
+ | |||
+ | < | ||
+ | < | ||
+ | gpg: [stdin]: clearsign failed: mauvaise phrase de passe | ||
+ | | ||
+ | </ | ||
+ | |||
+ | Taper les lignes suivantes de commande suivante et lancer debuild à nouveau : | ||
+ | < | ||
+ | | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | Pour voir le résultat : | ||
+ | |||
+ | cd .. && ls | ||
+ | |||
+ | Et, ô miracle ! Nous avons bien nos trois fichiers ! | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==== Compilation et création du paquet binaire ==== | ||
+ | |||
+ | === Préparation de pbuilder=== | ||
+ | |||
+ | On va utiliser l' | ||
+ | Lors de l' | ||
+ | Le principal intérêt de pbuilder est de vérifier que les Build Deps sont bonnes (cf. notre fichier control). | ||
+ | |||
+ | Pour supporter les dépôts Universe et Multiverse | ||
+ | |||
+ | < | ||
+ | echo " | ||
+ | sudo pbuilder update | ||
+ | </ | ||
+ | |||
+ | Pour initialiser pbuilder, tapez dans votre terminal : | ||
+ | |||
+ | < | ||
+ | sudo pbuilder create | ||
+ | </ | ||
+ | |||
+ | La première ligne permet d' | ||
+ | |||
+ | <note idée> | ||
+ | |||
+ | sudo pbuilder create --distribution feisty | ||
+ | |||
+ | (feisty peut être remplacé par le nom de code d'une autre version d' | ||
+ | |||
+ | Ces commandes peuvent être lancées en début de travail dans un autre terminal, car cette étape peut prendre un certain temps. N' | ||
+ | |||
+ | |||
+ | ===Création du paquet binaire=== | ||
+ | |||
+ | Une fois l' | ||
+ | |||
+ | <code bash> | ||
+ | sudo pbuilder build *.dsc | ||
+ | </ | ||
+ | |||
+ | Et à laisser mariner… en cas d' | ||
+ | |||
+ | <code bash> | ||
+ | sudo pbuilder update --extrapackages nomdupaquetmanquant (ex: libqt3-dev) | ||
+ | </ | ||
+ | |||
+ | |||
+ | Une fois cette étape terminée, votre .deb est dans **/ | ||
+ | |||
+ | En dernière étape, nous allons vérifier quelques points : | ||
+ | * d' | ||
+ | dpkg -f / | ||
+ | </ | ||
+ | * la liste des fichiers contenus dans le .deb< | ||
+ | dpkg -c / | ||
+ | * Utilisons enfin lintian, qui permet de vérifier la qualité des .debs et des paquets source (par rapport à la debian policy) :<code bash> | ||
+ | lintian -Iv / | ||
+ | lintian -Iv ~/ | ||
+ | </ | ||
+ | |||
+ | Cet avertissement de lintian : | ||
+ | > W: epdfview: old-fsf-address-in-copyright-file | ||
+ | n'est pas un bloqueur. | ||
+ | |||
+ | Linda fonctionne de la même manière que lintian. | ||
+ | |||
+ | Il faut remplacer l' | ||
+ | L' | ||
+ | 02110-1301, USA. | ||
+ | |||
+ | ===== Conclusion ===== | ||
+ | |||
+ | Vous avez donc maintenant votre paquet debian compilé et prêt à être diffusé (à vous de trouver le moyen de le faire, le plus simple étant de vous joindre à une équipe gérant déjà un dépôt existant. Cela vous permettra d' | ||
+ | |||
+ | |||
+ | |||
+ | ===== Foire aux questions ===== | ||
+ | |||
+ | === Est-ce que je dois passer en root pour créer mon paquet ? === | ||
+ | |||
+ | Ce n'est pas nécessaire, | ||
+ | |||
+ | === L' | ||
+ | |||
+ | `sudo pbuilder login` vous amènera dans l' | ||
+ | |||
+ | === Après avoir exécuté `debuild -S -sa`, je n'ai pas de .diff.gz ! === | ||
+ | |||
+ | C'est que la syntaxe de votre .orig.tar.gz n'est pas correcte. Vérifiez bien qu'il est de la forme : nomDuPaquet**_**x.y.z.orig.tar.gz | ||
+ | |||
+ | Notez le ' | ||
+ | |||
+ | Lors de l' | ||
+ | dpkg-source: | ||
+ | dpkg-source: | ||
+ | |||
+ | === Le programme que je veux empaqueter est fourni dans un .tar.bz2. Qu' | ||
+ | |||
+ | Il faut absolument avoir une archive compressée avec gzip. Décompressez ce que vous avez téléchargé avec : | ||
+ | |||
+ | bunzip2 foo-x.y.z.tar.bz2 | ||
+ | |||
+ | puis recompressez avec gzip (compression maximale) : | ||
+ | |||
+ | gzip -9 foo-x.y.z.tar | ||
+ | |||
+ | Renommez enfin votre archive pour avoir un .orig.tar.gz correct. | ||
+ | |||
+ | === De nombreuses applications sous Ubuntu sont disponibles via plusieurs paquets notamment app.deb et app-common.deb. Comment cela est il obtenu ? === | ||
+ | |||
+ | |||
+ | Cela nécessite deux étapes : | ||
+ | |||
+ | * Décrire les deux paquets binaires résultants dans debian/ | ||
+ | * en installant les fichiers voulus dans les dossiers debian/app et debian/ | ||
+ | |||
+ | L' | ||
+ | |||
+ | === Quand on installe un paquet qui va dans « / | ||
+ | |||
+ | Oui, jusqu' | ||
+ | |||
+ | === Comment faire pour tester un paquet sans toucher à son système de base ? === | ||
+ | |||
+ | FIXME | ||
+ | <note tip>Une des solutions pour tester est d' | ||
+ | |||
+ | <note tip>Une autre solution est d' | ||
+ | |||
+ | ---- | ||
+ | |||
+ | // | ||
+ | |||
+ | //Suite à la séance de formation organisée par [[utilisateurs: |