Fink

Tutoriel d'empaquetage - 2. Exemple - le paquet Maxwell

2.1 Préparation

Tout d'abord Maxwell. Ouvrez votre éditeur de texte et commençons. Nous connaissons le nom du paquet, sa version et l'endroit où est située l'archive tar source. Entrons donc ces informations dans la fenêtre de l'éditeur de texte :

Package: maxwell
Version: 0.5.1
Revision: 1
Source: mirror:sourceforge:%n/%n-%v.tar.gz

Les champs nom (Package) et version sont faciles à comprendre, mais qu'en est-il des autres champs ? Le champ Revision correspond à la "version" du paquet dans Fink, tandis que le champ Version correspond à la version du source en amont. Comme c'est la première fois que nous tentons de construire un paquet maxwell-0.5.1 dans Fink, son numéro de révision est 1.

Le champ Source donne l'adresse à partir de laquelle fink téléchargera l'archive tar source. Comme Sourceforge comprend un système mondial de miroirs pour les paquets et que fink le connaît, on utilise mirror:sourceforge:. %n est un raccourci pour le nom du paquet, maxwell, et %v un raccourci pour la version du paquet, 0.5.1.

Nous pouvons maintenant sauvegarder ceci sous le nom maxwell.info dans le répertoire /opt/sw/fink/dists/local/main/finkinfo/. Ceci fait, voyons ce que cela donne avec fink validate.

finkdev% fink validate maxwell.info 
Validating package file maxwell.info...
Error: Required field "Maintainer" missing. (maxwell.info)

Heu ! On dirait que nous avons oublié un certain nombre de champs. Ajoutons-en quelques-uns :

Maintainer: Paul Dupont <pdupont@exemple.com>
HomePage: http://maxwell.sourceforge.net
License: MIT

Nous ajoutons notre nom en tant que mainteneur du paquet maxwell dans Fink ainsi que l'url de sa page d'accueil. En regardant sur la page sourceforge du projet, on voit que maxwell est distribué sous licence MIT, nous ajoutons également cette information. Maintenant, réessayons :

finkdev% fink validate maxwell.info
Validating package file maxwell.info...
Warning: Unknown license "MIT". (maxwell.info)
Error: No MD5 checksum specified for "source". (maxwell.info)
Error: No package description supplied. (maxwell.info)

Grrr ! On dirait que c'est de pire en pire, pas de panique, rabattons-nous sur le Guide de construction de paquets pour voir quelles sont les licences autorisées. On voit que l'on peut remplacer MIT par OSI-Approved, car la licence MIT a été approuvée par OSI. On peut aussi copier une courte description du paquet à partir de sa page d'accueil. Voici les changements que nous opérons :

License: OSI-Approved
Description: Mac OS X S.M.A.R.T. Tool

Mais que faire de l'erreur concernant les sommes de contrôle MD5 ? Pourquoi ne pas tout simplement demander à fink de récupérer le source ?

finkdev% fink fetch maxwell
/usr/bin/sudo /opt/sw/bin/fink  fetch maxwell
Reading package info...
Updating package index... done.
Information about 3377 packages read in 30 seconds.
WARNING: No MD5 specified for Source of package maxwell-0.5.1-1 \
Maintainer: Paul Dupont <pdupont@exemple.com>
curl -f -L -O http://distfiles.opendarwin.org/maxwell-0.5.1.tar.gz
  % Total    % Received % Xferd  Average Speed          Time             Curr.
                                 Dload  Upload Total    Current  Left    Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:00 --:--:--     0
curl: (22) The requested URL returned error: 404
### execution of curl failed, exit code 22
Downloading the file "maxwell-0.5.1.tar.gz" failed.

(1)      Give up
(2)      Retry the same mirror
(3)      Retry another mirror from your continent
(4)      Retry another mirror
(5)      Retry using next mirror set "sourceforge"

How do you want to proceed? [3] 5
curl -f -L -O http://west.dl.sourceforge.net/sourceforge/maxwell/maxwell-0.5.1.tar.gz
  % Total    % Received % Xferd  Average Speed          Time             Curr.
                                 Dload  Upload Total    Current  Left    Speed
100  7856  100  7856    0     0  19838      0  0:00:00  0:00:00  0:00:00 6511k

L'archive tar ne peut être téléchargée à partir des miroirs de Fink, car le paquet n'a pas encore été ajouté à la distribution. C'est pourquoi il faut changer de miroir et sélectionner l'option 5. Voir les Q.F.P. pour de plus amples informations à ce sujet.

Maintenant nous pouvons calculer la somme de contrôle md5 en exécutant md5sum /opt/sw/src/maxwell-0.5.1.tar.gz, et l'ajouter à notre fichier .info

Source-MD5: ce5c354b2fed4e237524ad0bc59997a3

Maintenant fink validate marche, youpi !

2.2 Construction

Désormais, nous pouvons construire le paquet, essayons :

finkdev% fink -m --build-as-nobody rebuild maxwell
/usr/bin/sudo /opt/sw/bin/fink  build maxwell
Reading package info...
Updating package index... done.
Information about 3498 packages read in 32 seconds.
The following package will be built:
 maxwell
gzip -dc /opt/sw/src/maxwell-0.5.1.tar.gz | /opt/sw/bin/tar -xvf -  \
--no-same-owner --no-same-permissions 
maxwell-0.5.1/
maxwell-0.5.1/LICENSE
maxwell-0.5.1/Makefile
maxwell-0.5.1/maxwell.8
maxwell-0.5.1/maxwell.c
maxwell-0.5.1/README
./configure --prefix=/opt/sw 
Can't exec "./configure": No such file or directory at \
/opt/sw/lib/perl5/Fink/Services.pm line 403.

Hum ! Ça ne marche pas très bien. Lisons le README (situé dans /opt/sw/src/maxwell-0.5.1-1/maxwell-0.5.1/README) et voyons ce qu'il dit...

To build type 'make'.

To install in /usr/local type 'sudo make install', to install elsewhere, type 
'sudo make install prefix=/elsewhere'

Ah ! Nous ne pouvons pas utiliser les scripts par défaut CompileScript et InstallScript, nous devons créer nos propres scripts, allons-y, c'est facile :

CompileScript: make
InstallScript: <<
#! /bin/sh -ev
make install prefix=%i
<<

Nous devons utiliser prefix=%i car fink construit le fichier binaire à partir des fichiers se trouvant dans %i. Ces fichiers seront ensuite installés dans %p (qui correspond par défaut à /opt/sw) quand on exécutera fink install maxwell. Pour de plus amples informations sur %p et %i, consultez le Guide de construction des paquets.

Normalement, les lignes des champs Script sont passées au shell ligne après ligne. Mais la ligne #! /bin/sh -ev permet à fink d'exécuter l'ensemble comme un script séparé. Le paramètre -e correspond à "die on error" et -v à "verbose".

Validons de nouveau le paquet et tentons de le construire :

finkdev% fink validate maxwell.info 
Validating package file maxwell.info...
Package looks good!
finkdev% fink -m --build-as-nobody rebuild maxwell
/usr/bin/sudo /opt/sw/bin/fink  build maxwell
Reading package info...
Updating package index... done.
Information about 3498 packages read in 32 seconds.
The following package will be built:
 maxwell
gzip -dc /opt/sw/src/maxwell-0.5.1.tar.gz | /opt/sw/bin/tar -xvf -  \
--no-same-owner --no-same-permissions 
maxwell-0.5.1/
maxwell-0.5.1/LICENSE
maxwell-0.5.1/Makefile
maxwell-0.5.1/maxwell.8
maxwell-0.5.1/maxwell.c
maxwell-0.5.1/README
make
cc  -L/opt/sw/lib -c -o maxwell.o maxwell.c
cc  -I/opt/sw/include -o maxwell -framework IOKit -framework CoreFoundation maxwell.o
/bin/rm -rf /opt/sw/src/root-maxwell-0.5.1-1
/bin/mkdir -p /opt/sw/src/root-maxwell-0.5.1-1/opt/sw
/bin/mkdir -p /opt/sw/src/root-maxwell-0.5.1-1/DEBIAN
/var/tmp/tmp.1.A3sRc2
#! /bin/sh -ev
make install prefix=/opt/sw/src/root-maxwell-0.5.1-1/opt/sw
/usr/bin/install -d -m 755 /opt/sw/src/root-maxwell-0.5.1-1/opt/sw/doc/maxwell
/usr/bin/install -m 644 LICENSE /opt/sw/src/root-maxwell-0.5.1-1/opt/sw/doc/maxwell/LICENSE
/usr/bin/install -m 644 README /opt/sw/src/root-maxwell-0.5.1-1/opt/sw/doc/maxwell/README
/usr/bin/install -d -m 755 /opt/sw/src/root-maxwell-0.5.1-1/opt/sw/bin
/usr/bin/install -m 755 maxwell /opt/sw/src/root-maxwell-0.5.1-1/opt/sw/bin/maxwell
/usr/bin/install -d -m 755 /opt/sw/src/root-maxwell-0.5.1-1/opt/sw/man/man8
/usr/bin/install -m 644 maxwell.8 /opt/sw/src/root-maxwell-0.5.1-1/opt/sw/man/man8/maxwell.8
/bin/rm -f /opt/sw/src/root-maxwell-0.5.1-1/opt/sw/info/dir \
/opt/sw/src/root-maxwell-0.5.1-1/opt/sw/info/dir.old \
/opt/sw/src/root-maxwell-0.5.1-1/opt/sw/share/info/dir \
/opt/sw/src/root-maxwell-0.5.1-1/opt/sw/share/info/dir.old
Writing control file...
Finding prebound objects...
Writing dependencies...
Writing package script postinst...
dpkg-deb -b root-maxwell-0.5.1-1 /opt/sw/fink/dists/local/main/binary-darwin-powerpc
dpkg-deb: building package `maxwell' in \
`/opt/sw/fink/dists/local/main/binary-darwin-powerpc/maxwell_0.5.1-1_darwin-powerpc.deb'.

Fink semble avoir tout installé au bon endroit : /opt/sw/src/root-maxwell-0.5.1-1 à partir de l'emplacement où le paquet binaire maxwell_0.5.1-1_darwin-powerpc.deb a été construit.

Notez aussi que fink inclut automatiquement certains drapeaux de compilation pour lui permettre d'accéder à d'autres paquets fink (par exemple -I/opt/sw/include).

Regardons ce qu'il y a à l'intérieur du paquet binaire :

finkdev% dpkg -c \
/opt/sw/fink/dists/local/main/binary-darwin-powerpc/maxwell_0.5.1-1_darwin-powerpc.deb
drwxr-xr-x root/admin        0 2004-07-15 09:40:38 ./
drwxr-xr-x root/admin        0 2004-07-15 09:40:39 ./opt/sw/
drwxr-xr-x root/admin        0 2004-07-15 09:40:39 ./opt/sw/bin/
-rwxr-xr-x root/admin    29508 2004-07-15 09:40:39 ./opt/sw/bin/maxwell
drwxr-xr-x root/admin        0 2004-07-15 09:40:39 ./opt/sw/doc/
drwxr-xr-x root/admin        0 2004-07-15 09:40:39 ./opt/sw/doc/maxwell/
-rw-r--r-- root/admin     1076 2004-07-15 09:40:39 ./opt/sw/doc/maxwell/LICENSE
-rw-r--r-- root/admin     1236 2004-07-15 09:40:39 ./opt/sw/doc/maxwell/README
drwxr-xr-x root/admin        0 2004-07-15 09:40:39 ./opt/sw/man/
drwxr-xr-x root/admin        0 2004-07-15 09:40:39 ./opt/sw/man/man8/
-rw-r--r-- root/admin     1759 2004-07-15 09:40:39 ./opt/sw/man/man8/maxwell.8
drwxr-xr-x root/admin        0 2004-07-15 09:40:39 ./opt/sw/var/
drwxr-xr-x root/admin        0 2004-07-15 09:40:39 ./opt/sw/var/lib/
drwxr-xr-x root/admin        0 2004-07-15 09:40:39 ./opt/sw/var/lib/fink/
drwxr-xr-x root/admin        0 2004-07-15 09:40:39 ./opt/sw/var/lib/fink/prebound/
drwxr-xr-x root/admin        0 2004-07-15 09:40:39 ./opt/sw/var/lib/fink/prebound/files/
-rw-r--r-- root/admin       16 2004-07-15 09:40:39 ./opt/sw/var/lib/fink/prebound/files/maxwell.pblist

Cela semble correct, non ? Mais il faut vérifier que les règles de construction des paquets dans Fink sont respectées. Validons le paquet avec :

finkdev% fink validate \
/opt/sw/fink/dists/local/main/binary-darwin-powerpc/maxwell_0.5.1-1_darwin-powerpc.deb 
Validating .deb file \
/opt/sw/fink/dists/local/main/binary-darwin-powerpc/maxwell_0.5.1-1_darwin-powerpc.deb...
Warning: File installed into deprecated directory /opt/sw/doc/
                                        Offender is /opt/sw/doc/
Warning: File installed into deprecated directory /opt/sw/doc/
                                        Offender is /opt/sw/doc/maxwell/
Warning: File installed into deprecated directory /opt/sw/doc/
                                        Offender is /opt/sw/doc/maxwell/LICENSE
Warning: File installed into deprecated directory /opt/sw/doc/
                                        Offender is /opt/sw/doc/maxwell/README
Warning: File installed into deprecated directory /opt/sw/man/
                                        Offender is /opt/sw/man/
Warning: File installed into deprecated directory /opt/sw/man/
                                        Offender is /opt/sw/man/man8/
Warning: File installed into deprecated directory /opt/sw/man/
                                        Offender is /opt/sw/man/man8/maxwell.8

Heu ! Quelque chose ne va pas. Consultons encore le Guide de construction des paquets. On y voit que les pages man doivent être installées dans /opt/sw/share/man et les fichiers README dans /opt/sw/share/doc/%n. Si nous ouvrons le Makefile de maxwell, nous voyons que nous pouvons définir les répertoires mandir et datadir :

prefix = /usr/local
mandir = ${prefix}/man
man8dir = ${mandir}/man8
bindir = ${prefix}/bin
datadir = ${prefix}/doc/maxwell

On peut régler facilement le problème en changeant le script InstallScript :

make install prefix=%i mandir=%i/share/man datadir=%i/share/doc/%n

et reconstruire le paquet avec :

finkdev% fink -m --build-as-nobody rebuild maxwell

(On utilise fink ... rebuild car fink build ne ferait rien du tout, puisque le paquet a déjà été construit.)

Revérifiez le contenu du fichier .deb (avec dpkg -c) pour voir où les fichiers sont installés maintenant. Puis validez de nouveau le fichier .deb avec fink validate. Si tout se passe bien, vous pouvez installer le nouveau paquet avec :

finkdev% fink install maxwell
/usr/bin/sudo /opt/sw/bin/fink  install maxwell
Information about 3377 packages read in 30 seconds.
The following package will be installed or updated:
 maxwell
dpkg -i /opt/sw/fink/dists/local/main/binary-darwin-powerpc/maxwell_0.5.1-1_darwin-powerpc.deb
Selecting previously deselected package maxwell.
(Reading database ... 56046 files and directories currently installed.)
Unpacking maxwell (from .../maxwell_0.5.1-1_darwin-powerpc.deb) ...
Setting up maxwell (0.5.1-1) ...

Et faire tourner le paquet avec :

finkdev% maxwell

Félicitations ! Vous venez de construire votre premier paquet Fink. Maintenant, essayez de construire un autre paquet tout seul en suivant le Tutoriel d'empaquetage à partir du début.

Nous attendons impatiemment vos premières contributions à Fink !