Cela faisait un petit moment que l'envie d'écrire un tip sur la création de ports sous FreeBSD me titillait le slip. Cependant, j'avoue avoir eu un peu de mal à trouver un cas d'école, et encore il n'est pas parfait (voir un peu plus bas). En effet, la difficulté consiste à trouver une application qui :
Apres avoir tourné un moment avec google, les FreeBSD PR et les logs de portmgr, je suis tombé sur gimmix..
GCU Breaking News
On (flz) me chuchote à l'oreillette le port “porttools”
FreeBSD Port Tools includes the following commands: - port create: create a new port from a template - port diff: generate a diff against a previous version of the port - port fetch: fetch distfile(s) of a new version of the port - port help: display usage summary for port(1) commands - port submit: submit a PR with new port, or port change/update - port test: automate testing a new port or a port update WWW: http://sourceforge.net/projects/porttools/
Bien évidemment ça peut aider.
Avant d'aller plus loin, je précise que la création de ce port n'a nécessité aucun patch, c'est à dire que l'auteur de gimmix a suffisament bien bossé pour que tout compile parfaitement sous FreeBSD bien que sa platforme de base soit Linux.
Où est le probleme ? Ben justement, j'aurai préferé faire un ou deux petits patchs pour rendre ce tip un peu plus complet et croustillant. Je propose donc au lecteur de ne pas hésiter à le compléter (wiki wiki wiki) pour palier ce manque.
Je tiens à préciser que la documentation de FreeBSD, et dans ce cas, le Porter's Handbook, est _trés_ bien foutue. Elle rend presque inutile la présence de ce tip c'est donc dire.. JETEZ Y UN OEIL !@#@ ET MEME DEUX !@#!
Evidemment, pour ceux que la lecture de documentation reloute et qui préferent le style lutinesque, je vous propose de lire la suite.
Commençons tout d'abord à créer un environnement propre, nettoyer son bureau, bref préparer l'espace pour bien bosser :
[lutin@monstrebon /home/lutin]% mkdir -p FreeBSD/ports/#@!NOMDUPORT#@!
Idéalement, et je pense même que c'est indispensable pour porter de gros poissons ou si l'on est pas sûr des dependances, il faudrait un FreeBSD installation minimale, c'est à dire avec les ports de base ou alors un environnement chrooté/jail..
CE N'EST PAS LE CAS DANS CE TIP car j'ai voulu éviter toute complication (oui flemme toussa *kof*kof*).
Ne pas oublier que vous allez devenir un port _maintainer_, et du coup, on compte sur vous : Il vous faudra donner un peu de votre temps pour maintenir le port (lors de mises à jour du software par exemple), vérifier sa compilation sur plusieurs architectures (amd64, i386..), bref vous êtes LA réference vis à vis de FreeBSD pour la bonne tenue de votre port.
Pour en savoir plus allez voir ici
Maintenant qu'on a un espace de travail, nous allons sereinement récupérer et compiler notre application de manière authentique :
[lutin@monstrebon ~/FreeBSD/ports]% fetch http://download.berlios.de/gimmix/gimmix-0.4.1.tar.bz2 [lutin@monstrebon ~/FreeBSD/ports]% tar jvxf gimmix-0.4.1.tar.bz2 [lutin@monstrebon ~/FreeBSD/ports]% cd gimmix-0.4.1/ [lutin@monstrebon ~/FreeBSD/ports/gimmix-0.4.1]% ./configure - SNIP - [lutin@monstrebon ~/FreeBSD/ports/gimmix-0.4.1]% make && make install
Normalement tout s'est bien déroulé car nous avions les bonnes dépendances et que c'est un cas d'école et que ça se passe comme ça dans le jardin. Mais il est possible que la compilation foire sur votre application et il sera nécessaire de la patcher (non abordé ici)
Dirigeons nous maintenant dans le répertoire de notre futur port (~/FreeBSD/ports/gimmix) et éditons son futur Makefile
Makefile :
# New ports collection makefile for: gimmix #nom du port # Date created: 11 April 2007 #date de création # Whom: Matthieu Guegan <monmail> #mainteneur du port # #+ addr email # # $FreeBSD$ #laisser tel quel : sera remplacé par le CVS # PORTNAME= gimmix #nom du port PORTVERSION= 0.4.1 #version du port au final cela donne $PORTNAME-$PORTVERSION #respectez donc bien ce schema CATEGORIES= audio #catégorie dans l'arbre des ports MASTER_SITES= ${MASTER_SITE_BERLIOS} #site de téléchargement, dans mon cas berlios.de étant #connu, il bénéficie d'une variable propre MASTER_SITE_SUBDIR= gimmix #sous répertoire du site de téléchargement #cad. http://download.berlios.de/gimmix/ MAINTAINER= MONEMAIL #mettre ici son email COMMENT= Gimmix is a graphical MPD client written in C using GTK+2 #COURTE description du port LIB_DEPENDS= mpd:${PORTSDIR}/audio/libmpd \ #librairies nécéssaires pour la compilation du #port -dépendances- tag.5:${PORTSDIR}/audio/taglib #attention il existe BUILD_DEPENDS, RUN_DEPENDS #etc... voir leur description dans #/usr/ports/Mk/bsd.port.mk USE_GNOME= gtk20 libglade2 #gtk2 et libglade2 sont requis et il existe #USE_GNOME (/usr/ports/Mk/bsd.gnome.mk) #pour gérer ces dépendances USE_BZIP2= yes #l'archive n'est pas en .tar.gz (défaut) mais #.tar.bz2 GNU_CONFIGURE= yes #il y a un configure dans l'archive qu'il faut utiliser .include <bsd.port.mk> #nécessaire pour que le Makefile soit compréhensible..
Apres ce joli Makefile nous allons créer rapidement le descriptif du port dans le fichier pkg-descr. Dans mon cas j'ai simplement fait un copy/paste du fichier README présent dans l'archive initiale
pkg-descr :
Gimmix is a graphical Music player daemon (MPD) client written in C using GTK+2. Features: ========= * Simple and Clean Interface. * Library Browser. * Library search. (search by artist, album, filename, etc) * Playlist management (manage mpd playlists) * ID3v2 tag editing support. * System tray icon support. * Support for controlling gimmix through Keyboard. * Notification support (Displays the currently playing song in systray). * Small memory footprint. WWW: http://gimmix.berlios.de/index.php
Enfin, il faut renseigner le fichier pkg-plist qui est utilisé pour la création de package et la désinstallation du port. C'est en fait une liste qui indique les fichiers installés par le port (et donc qui doivent être effacés lors de sa suppression).
Il existe plusieurs méthodes pour le renseigner :
On refait la même que pour le Makefile (supprimez les commentaires hein)
bin/gimmix #la racine est /usr/local/ par défaut (var $LOCALBASE) share/applications/gimmix.desktop %%DATADIR%%/gimmix.glade #DATADIR est le chemin créé pour l'application : /usr/local/share/gimmix %%DATADIR%%/gimmix_firstrun.png share/pixmaps/gimmix.png share/pixmaps/gimmix_logo_small.png share/pixmaps/gimmix_playlist.png @dirrmtry share/pixmaps #suppression si possible (vide) @dirrm %%DATADIR%% #suppression dans tous les cas @dirrmtry share/applications #executé à l'installation pour les librairies partagées @exec %%LOCALBASE%%/bin/update-desktop-database > /dev/null || /usr/bin/true #pareil mais à la désinstallation @unexec %%LOCALBASE%%/bin/update-desktop-database > /dev/null || /usr/bin/true
Voilà, nous avons les trois fichiers renseignés à la main, il nous reste plus qu'a générer le fichier distinfo qui contient les signatures de notre archive (afin de s'assurer de sa validité) :
[lutin@monstrebon ~/FreeBSD/ports/gimmix]% make makesum
Donc au final nous avons :
[lutin@monstrebon ~/FreeBSD/ports/gimmix]%ls Makefile distinfo pkg-descr pkg-plist
Pour vérifier que nos fichiers ne comportent pas d'erreurs importantes, un outil a été crée pour l'occasion : portlint
Installez-le (portinstall / pkg_add / cquevouvoulez) et exécutez-le dans le répertoire de votre port. Au final vous devriez obtenir cette sortie :
[lutin@monstrebon ~/FreeBSD/ports/gimmix]% portlint looks fine.
Le Porter's handbook, décrit une méthode rapide pour tester votre port avant son commit :
make install make package make deinstall pkg_add package-name make deinstall make reinstall make package
Vérifiez bien que tout se déroule comme prevu.
On a pas fait tout ça pour rien, vous avez la possibilité d'ajouter votre port dans l'arbre officiel de FreeBSD. L'opération peut durer quelque semaines mais dans mon cas le commit s'est deroulé.. assez rapidement :
Arrival-Date: Wed Apr 11 17:20:16 GMT 2007 Closed-Date: Wed Apr 11 18:43:36 GMT 2007
*ch0mp* *ch0mp*
Courage lutin, pour effectuer cette operation, il te faut (si tu n'as pas déjà le commit bit hinhin…) envoyer un PR à freebsd-ports-bugs AVEC les champs suivants (via send-pr(1) ou l'interface web) :
Subject/Synopsis: New port: %categorie du port%/%nom du port% - %COMMENT% Category: ports Severity: non-critical Priority: low Class: change-request
Il te faut bien évidemment avec cela envoyer ton travail. La commande shar(1) est faite pour cela :
[lutin@monstrebon ~/FreeBSD/ports]% shar `find gimmix` > gimmix.shar
Attache-le avec le mail ou alors copy/paste le résultat dans le champ “Fix:”
Le reste étant trivial (from, release …) consulte, http://www.freebsd.org/cgi/query-pr.cgi?pr=111482 pour te donner une idée
Il ne reste plus qu'à attendre la réponse d'un membre de portmgr@ pour enfin avoir son petit dans le port tree
Comme tu es beau lutin, profites-en pour informer l'auteur de l'application portée que son bébé est maintenant disponible sous FreeBSD.