Nächste: Paketvarianten definieren, Vorige: Paketmodule, Nach oben: Programmierschnittstelle [Inhalt][Index]
Mit den Modulen (guix packages)
und (guix build-system)
können
Paketdefinitionen auf einer hohen Abstraktionsebene geschrieben werden. Zum
Beispiel sieht die Paketdefinition bzw. das Rezept für das Paket von
GNU Hello so aus:
(define-module (gnu packages hello) #:use-module (guix packages) #:use-module (guix download) #:use-module (guix build-system gnu) #:use-module (guix licenses) #:use-module (gnu packages gawk)) (define-public hello (package (name "hello") (version "2.10") (source (origin (method url-fetch) (uri (string-append "mirror://gnu/hello/hello-" version ".tar.gz")) (sha256 (base32 "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i")))) (build-system gnu-build-system) (arguments '(#:configure-flags '("--enable-silent-rules"))) (inputs (list gawk)) (synopsis "Hello, GNU world: An example GNU package") (description "Guess what GNU Hello prints!") (home-page "https://www.gnu.org/software/hello/") (license gpl3+)))
Auch ohne ein Experte in Scheme zu sein, könnten Leser erraten haben, was
die verschiedenen Felder dabei bedeuten. Dieser Ausdruck bindet die Variable
hello
an ein <package>
-Objekt, was an sich nur ein Verbund
(Record) ist (siehe Scheme-Verbünde in Referenzhandbuch
zu GNU Guile). Die Felder dieses Paket-Objekts lassen sich mit den
Prozeduren aus dem Modul (guix packages)
auslesen, zum Beispiel
liefert (package-name hello)
– Überraschung! –
"hello"
.
Mit etwas Glück können Sie die Definition vielleicht teilweise oder sogar
ganz aus einer anderen Paketsammlung importieren, indem Sie den Befehl
guix import
verwenden (siehe guix import
aufrufen).
In obigem Beispiel wurde hello
in einem eigenen Modul ganz für sich
alleine definiert, und zwar (gnu packages hello)
. Technisch gesehen
muss es nicht unbedingt in einem solchen Modul definiert werden, aber es ist
bequem, denn alle Module unter (gnu packages …)
werden automatisch
von den Befehlszeilenwerkzeugen gefunden (siehe Paketmodule).
Ein paar Dinge sind noch erwähnenswert in der obigen Paketdefinition:
source
-Feld für die Quelle des Pakets ist ein
<origin>
-Objekt, was den Paketursprung angibt (siehe origin
-Referenz für eine vollständige Referenz). Hier wird dafür die Methode
url-fetch
aus dem Modul (guix download)
benutzt, d.h. die
Quelle ist eine Datei, die über FTP oder HTTP heruntergeladen werden soll.
Das Präfix mirror://gnu
lässt url-fetch
einen der
GNU-Spiegelserver benutzen, die in (guix download)
definiert sind.
Das Feld sha256
legt den erwarteten SHA256-Hashwert der
herunterzuladenden Datei fest. Ihn anzugeben ist Pflicht und er ermöglicht
es Guix, die Integrität der Datei zu überprüfen. Die Form (base32 …)
geht der base32-Darstellung des Hash-Wertes voraus. Sie finden die
base32-Darstellung mit Hilfe der Befehle guix download
(siehe
guix download
aufrufen) und guix hash
(siehe guix hash
aufrufen).
Wenn nötig kann in der origin
-Form auch ein patches
-Feld
stehen, wo anzuwendende Patches aufgeführt werden, sowie ein
snippet
-Feld mit einem Scheme-Ausdruck mit den Anweisungen, wie der
Quellcode zu modifizieren ist.
build-system
legt fest, mit welcher Prozedur das Paket
erstellt werden soll (siehe Erstellungssysteme). In diesem Beispiel steht
gnu-build-system
für das wohlbekannte GNU-Erstellungssystem, wo
Pakete mit der üblichen Befehlsfolge ./configure && make && make check
&& make install
konfiguriert, erstellt und installiert werden.
Sobald Sie anfangen, Pakete für nichttriviale Software zu schreiben, könnten Sie Werkzeuge benötigen, um jene Erstellungsphasen abzuändern, Dateien zu verändern oder Ähnliches. Siehe Werkzeuge zur Erstellung für mehr Informationen dazu.
arguments
gibt an, welche Optionen dem Erstellungssystem
mitgegeben werden sollen (siehe Erstellungssysteme). In diesem Fall
interpretiert gnu-build-system
diese als Auftrag, configure
mit der Befehlszeilenoption --enable-silent-rules auszuführen.
Was hat es mit diesen einfachen Anführungszeichen ('
) auf sich? Sie
gehören zur Syntax von Scheme und führen eine wörtlich zu interpretierende
Datenliste ein; dies nennt sich Maskierung oder Quotierung. '
ist
synonym mit quote
. Ihnen könnte auch `
begegnen (ein
Backquote, stattdessen kann man auch das längere Synonym quasiquote
schreiben); damit können wir eine wörtlich als Daten interpretierte Liste
einführen, aber bei dieser „Quasimaskierung“ kann ,
(ein Komma, oder
dessen Synonym unquote
) benutzt werden, um den ausgewerteten Wert
eines Ausdrucks in diese Liste einzufügen. Quotierung in Referenzhandbuch zu GNU Guile enthält weitere
Details. Hierbei ist also der Wert des arguments
-Feldes eine Liste
von Argumenten, die an das Erstellungssystem weitergereicht werden, wie bei
apply
(siehe apply
in Referenzhandbuch zu GNU Guile).
Ein Doppelkreuz gefolgt von einem Doppelpunkt (#:
) definiert ein
Scheme-Schlüsselwort (siehe Keywords in Referenzhandbuch
zu GNU Guile) und #:configure-flags
ist ein Schlüsselwort, um eine
Befehlszeilenoption an das Erstellungssystem mitzugeben (siehe Coding
With Keywords in Referenzhandbuch zu GNU Guile).
inputs
legt Eingaben an den Erstellungsprozess fest –
d.h. Abhängigkeiten des Pakets zur Erstellungs- oder Laufzeit. Hier fügen
wir eine Eingabe hinzu, eine Referenz auf die Variable gawk
;
gawk ist auch selbst wiederum an ein <package>
-Objekt als
Variablenwert gebunden.
Beachten Sie, dass GCC, Coreutils, Bash und andere essenzielle Werkzeuge
hier nicht als Eingaben aufgeführt werden müssen. Stattdessen sorgt schon
gnu-build-system
dafür, dass diese vorhanden sein müssen (siehe
Erstellungssysteme).
Sämtliche anderen Abhängigkeiten müssen aber im inputs
-Feld
aufgezählt werden. Jede hier nicht angegebene Abhängigkeit wird während des
Erstellungsprozesses schlicht nicht verfügbar sein, woraus ein
Erstellungsfehler resultieren kann.
Siehe package
-Referenz für eine umfassende Beschreibung aller
erlaubten Felder.
Vertiefung: Fühlen Sie sich eingeschüchtert von der Scheme-Sprache oder wurde Ihre Neugier geweckt? Im Kochbuch gibt es einen kurzen Abschnitt, wie man anfängt. Dort werden einige der oben gezeigten Dinge wiederholt und die Grundlagen erklärt. Siehe Ein Schnellkurs in Scheme in GNU-Guix-Kochbuch für weitere Informationen.
Sobald eine Paketdefinition eingesetzt wurde, können Sie das Paket mit Hilfe
des Befehlszeilenwerkzeugs guix build
dann auch tatsächlich erstellen
(siehe Aufruf von guix build
) und dabei jegliche Erstellungsfehler, auf
die Sie stoßen, beseitigen (siehe Fehlschläge beim Erstellen untersuchen). Sie
können den Befehl guix edit
benutzen, um leicht zur
Paketdefinition zurückzuspringen (siehe guix edit
aufrufen). Unter
Paketrichtlinien finden Sie mehr Informationen darüber, wie Sie
Paketdefinitionen testen, und unter guix lint
aufrufen finden Sie
Informationen, wie Sie prüfen, ob eine Definition alle Stilkonventionen
einhält.
Zuletzt finden Sie unter Kanäle Informationen, wie Sie die
Distribution um Ihre eigenen Pakete in einem „Kanal“ erweitern.
Zu all dem sei auch erwähnt, dass Sie das Aktualisieren einer
Paketdefinition auf eine vom Anbieter neu veröffentlichte Version mit dem
Befehl guix refresh
teilweise automatisieren können (siehe
guix refresh
aufrufen).
Hinter den Kulissen wird die einem <package>
-Objekt entsprechende
Ableitung zuerst durch package-derivation
berechnet. Diese Ableitung
wird in der .drv-Datei unter /gnu/store gespeichert. Die von
ihr vorgeschriebenen Erstellungsaktionen können dann durch die Prozedur
build-derivations
umgesetzt werden (siehe Der Store).
Das <derivation>
-Objekt zum Paket für das angegebene
System liefern (siehe Ableitungen).
Als Paket muss ein gültiges <package>
-Objekt angegeben werden
und das System muss eine Zeichenkette sein, die das Zielsystem
angibt – z.B. "x86_64-linux"
für ein auf x86_64 laufendes,
Linux-basiertes GNU-System. Store muss eine Verbindung zum Daemon
sein, der die Operationen auf dem Store durchführt (siehe Der Store).
Auf ähnliche Weise kann eine Ableitung berechnet werden, die ein Paket für ein anderes System cross-erstellt.
<derivation>
-Objekt, um das Paket zu cross-erstellen vom
System aus für das Ziel-System.
Als Ziel muss ein gültiges GNU-Tripel angegeben werden, was die
Ziel-Hardware und das zugehörige Betriebssystem beschreibt, wie z.B.
"aarch64-linux-gnu"
(siehe Specifying Target Triplets in Autoconf).
Wenn Sie einmal Paketdefinitionen fertig verfasst haben, können Sie leicht Varianten derselben Pakete definieren. Siehe Paketvarianten definieren für mehr Informationen dazu.
Nächste: Paketvarianten definieren, Vorige: Paketmodule, Nach oben: Programmierschnittstelle [Inhalt][Index]