Fink

Packaging Tutorial - 2. Beispiel - das Maxwell Paket

2.1 Grundlagen

Als erstes Maxwell. Öffnen sie einen Editor und es kann los gehen. Sie wissen den Namen des Pakets, seine Version und wo man den Quellcode-Tarball bekommt. Tragen sie dies in ihr Editorfenster ein:

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

Package und Version sind offensichtlich, aber welche Bedeutung haben die beiden anderen Felder? Revision ist die "version" des Fink-Pakets während Version die Upstream-Version des Quellcodes ist. Da es der erste Versuch ist, ein Paket für maxwell-0.5.1 zu erstellen, bekommt das Paket die Revisionsnummer 1.

Das Feld Source gibt an, wo fink den Quellcode-Tarball abholen soll. Sourceforge hat ein weltweites System von Spiegelservern, das auch von fink benutzt werden kann. Deshalb lautet der Eintrag mirror:sourceforge:. %n wird zum Namen des Pakets erweitert, also maxwell, und %v zur Upstream-Version des Quellcodes, also 0.5.1.

Jetzt können sie die Datei als maxwell.info im Verzeichnis /sw/fink/dists/local/main/finkinfo/ soeichern. Danach können sie mit fink validate schauen, wie weit sie gekommen sind.

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

Oha. Sieht also so aus, dass wohl noch einige Felder fehlen. Fügen sie folgendes hinzu:

Maintainer: John Doe <jdoe@example.com>
HomePage: http://maxwell.sourceforge.net
License: MIT

Tragen sie sich als Betreuer des Fink-Pakets maxwell ein, ebenso seine Homepage. Auf der Projektseite bei sourceforge können sie heraus finden, dass der Quellcode unter MIT-Lizenz vertrieben wird. Machen sie den entsprechenden Eintrag. Der nächste Versuch ergibt:

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)

Mist. Es scheint eher schlechter als besser zu werden, aber geben sie nicht auf und schauen sie in der Anleitung für die Paketerstellung nach, welche Lizensen erlaubt sind. Eine MIT-Lizenz wird mit OSI-Approved abgedeckt, wie man bei dem Link OSI nachschauen kann. Den Einzeiler für die Beschreibung des Pakets kann man sich auch von der Homeoage bei sourceforge holen. Machen sie folgende Einträge:

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

Aber wie löst man das Problem mit der MD5-Prüfsumme? Dazu kann man einfach mit fink den Quellcode holen:

finkdev% fink fetch maxwell
/usr/bin/sudo /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: John Doe <jdoe@example.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

Der Tarball konnte noch nicht von den Fink-Spiegeln geholt werden, weil das Paket noch nicht akzeptiert wurde. Deshalb müssen sie auf den nächsten Satz von Spiegeln wechseln. Weitere Information dazu stehen in der FAQ.

Jetzt kann man die md5-Prüfsumme mit dem Kommando md5sum /sw/src/maxwell-0.5.1.tar.gz erhalten und in der .info-Datei eintragen:

Source-MD5: ce5c354b2fed4e237524ad0bc59997a3

Und jetzt klappt es auch mit fink validate, yippee!

2.2 Paket erstellen

Jetzt können sie einfach versuchen, das Paket zu erstellen:

finkdev% fink -m --build-as-nobody rebuild maxwell
/usr/bin/sudo /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 /sw/src/maxwell-0.5.1.tar.gz | /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=/sw
Can't exec "./configure": No such file or directory at \
/sw/lib/perl5/Fink/Services.pm line 403.

Das hat wohl noch nicht so gut geklappt. Lesen sie bitte nach, was in der Datei /sw/src/maxwell-0.5.1-1/maxwell-0.5.1/README steht. Üblicherweise steht da in etwa:

To build type 'make'.

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

Mit anderen Worten: Man kann nicht die voreingestellten Skripte nehmen, sondern muss eigene version von CompileScript und InstallScript eintragen:

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

Man muss prefix=%i verwenden, denn fink erstellt die binäre .deb-Datei aus den Dateien in %i. Später werden diese Dateien mit dem Befehl fink install maxwell in %p installiert. Die Voreinstellung für %p ist /sw. Weitere Details über %p und %i stehen in der Anleitung für die Paketerstellung.

Normalerweise werden die Zeilen in den Skriptfeldern Zeile für Zeile an die Shell übergeben, aber mit der Zeile #! /bin/sh -ev lässt fink das Ganze als ein separates Skript ausführen. Der Parameter -e bedeutet "die on error" und -v bedeutet "verbose".

Ein erneuter Versuch, das Paket zu erstellen und zu validieren:

finkdev% fink validate maxwell.info
Validating package file maxwell.info...
Package looks good!
finkdev% fink -m --build-as-nobody rebuild maxwell
/usr/bin/sudo /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 /sw/src/maxwell-0.5.1.tar.gz | /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/sw/lib -c -o maxwell.o maxwell.c
cc  -I/sw/include -o maxwell -framework IOKit -framework CoreFoundation maxwell.o
/bin/rm -rf /sw/src/root-maxwell-0.5.1-1
/bin/mkdir -p /sw/src/root-maxwell-0.5.1-1/sw
/bin/mkdir -p /sw/src/root-maxwell-0.5.1-1/DEBIAN
/var/tmp/tmp.1.A3sRc2
#! /bin/sh -ev
make install prefix=/sw/src/root-maxwell-0.5.1-1/sw
/usr/bin/install -d -m 755 /sw/src/root-maxwell-0.5.1-1/sw/doc/maxwell
/usr/bin/install -m 644 LICENSE /sw/src/root-maxwell-0.5.1-1/sw/doc/maxwell/LICENSE
/usr/bin/install -m 644 README /sw/src/root-maxwell-0.5.1-1/sw/doc/maxwell/README
/usr/bin/install -d -m 755 /sw/src/root-maxwell-0.5.1-1/sw/bin
/usr/bin/install -m 755 maxwell /sw/src/root-maxwell-0.5.1-1/sw/bin/maxwell
/usr/bin/install -d -m 755 /sw/src/root-maxwell-0.5.1-1/sw/man/man8
/usr/bin/install -m 644 maxwell.8 /sw/src/root-maxwell-0.5.1-1/sw/man/man8/maxwell.8
/bin/rm -f /sw/src/root-maxwell-0.5.1-1/sw/info/dir \
/sw/src/root-maxwell-0.5.1-1/sw/info/dir.old \
/sw/src/root-maxwell-0.5.1-1/sw/share/info/dir \
/sw/src/root-maxwell-0.5.1-1/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 /sw/fink/dists/local/main/binary-darwin-powerpc
dpkg-deb: building package `maxwell' in \
`/sw/fink/dists/local/main/binary-darwin-powerpc/maxwell_0.5.1-1_darwin-powerpc.deb'.

Anscheinend hat Fink alles am korrekten Platz installiert: /sw/src/root-maxwell-0.5.1-1, von wo aus das Binärpaket maxwell_0.5.1-1_darwin-powerpc.deb erstellt wurde.

Bitte beachten sie auch, wie fink automatisch einige Optionen für den Compiler setzt, wie den Zugang zu anderen Fink-Paketen (also -I/sw/include).

Schauen sie noch nach, was das binäre Paket enthält:

finkdev% dpkg -c \
/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 ./sw/
drwxr-xr-x root/admin        0 2004-07-15 09:40:39 ./sw/bin/
-rwxr-xr-x root/admin    29508 2004-07-15 09:40:39 ./sw/bin/maxwell
drwxr-xr-x root/admin        0 2004-07-15 09:40:39 ./sw/doc/
drwxr-xr-x root/admin        0 2004-07-15 09:40:39 ./sw/doc/maxwell/
-rw-r--r-- root/admin     1076 2004-07-15 09:40:39 ./sw/doc/maxwell/LICENSE
-rw-r--r-- root/admin     1236 2004-07-15 09:40:39 ./sw/doc/maxwell/README
drwxr-xr-x root/admin        0 2004-07-15 09:40:39 ./sw/man/
drwxr-xr-x root/admin        0 2004-07-15 09:40:39 ./sw/man/man8/
-rw-r--r-- root/admin     1759 2004-07-15 09:40:39 ./sw/man/man8/maxwell.8
drwxr-xr-x root/admin        0 2004-07-15 09:40:39 ./sw/var/
drwxr-xr-x root/admin        0 2004-07-15 09:40:39 ./sw/var/lib/
drwxr-xr-x root/admin        0 2004-07-15 09:40:39 ./sw/var/lib/fink/
drwxr-xr-x root/admin        0 2004-07-15 09:40:39 ./sw/var/lib/fink/prebound/
drwxr-xr-x root/admin        0 2004-07-15 09:40:39 ./sw/var/lib/fink/prebound/files/
-rw-r--r-- root/admin       16 2004-07-15 09:40:39 ./sw/var/lib/fink/prebound/files/maxwell.pblist

Sieht gut aus, oder? Aber es bleibt noch zu verifizieren, ob das Paket die Regeln von Fink für Pakete einhält. Validieren sie das Paket mit dem Kommando:

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

Oha. Noch stimmt etwas nicht. Schauen sie noch einmal in der Anleitung für die Paketerstellung nach. Da steht, dass Seiten für man in /sw/share/man installiert werden müssen und Dateien wie README in /sw/share/doc/%n. Schaut man sich den Makefile von maxwell an, sieht man, dass mandir und datadir gesetzt werden können:

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

Das einfachste ist es, den InstallScript abzuändern:

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

und das Paket neu zu erstellen:

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

(Man muss fink rebuild nehmen, weil fink build nichts bewirken würde, weil das Paket bereits erfolgreich erstellt wurde.)

Überprüfen sie den Inhalt der .deb-Datei (mit dpkg -c) und und schauen wie, wo die Dateien jetzt installiert werden. Dann validieren die .deb-Datei mit fink validate. Ist alles in Ordnung, können sie das Paket mit diesem Kommando installieren:

finkdev% fink install maxwell
/usr/bin/sudo /sw/bin/fink  install maxwell
Information about 3377 packages read in 30 seconds.
The following package will be installed or updated:
maxwell
dpkg -i /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) ...

Jetzt kann man das Programm mit diesem Kommando ausführen:

finkdev% maxwell

Gratuliere. Sie haben ihr erstes Fink-Paket erstellt! Jetzt können sie es selbst versuchen, indem sie dieser Einführung vom Anfang an folgen.

Wir sind auf ihre Beiträge zu Fink gespannt!