Creation d'un port FreeBSD

Intro

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 :

  • N'est évidemment pas présente dans le ports tree de FreeBSD (on approche des 17000 ports)
  • Compile pratiquement out-of-the-box

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.

Prérequis

  • FreeBSD (ça aide..)
  • Un port à AJOUTER dans /usr/ports

Ce qui manque à ce tip

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.

Un peu de nettoyage

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

Le portage

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 :

  • A la mano ! c'est mon cas, j'avais une dizaine de fichiers à renseigner
  • Par la méthode dite automatique qui a l'avantage de ne rien oublier et qui s'occupe aisément des gros ports (grui)

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

On essaye ça vite fait

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.

envoi du port

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.

Changelog

  • 12/04/2007 création du tip par hotbox

References

freebsd/freebsd_port_creation.txt · Last modified: 2010/01/12 13:29 (external edit)