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
/opt/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 /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: 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 /opt/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 /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.
Das hat wohl noch nicht so gut geklappt. Lesen sie bitte nach, was in der
Datei /opt/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
/opt/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 /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'.
Anscheinend hat Fink alles am korrekten Platz installiert:
/opt/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/opt/sw/include
).
Schauen sie noch nach, was das binäre Paket enthält:
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
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 \ /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
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 /opt/sw/share/man
installiert werden müssen und Dateien wie README
in
/opt/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 /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) ...
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!