Nächste: Herangehensweisen, Nach oben: Anleitung zum Paketeschreiben [Inhalt][Index]
Der Abschnitt „Pakete definieren“ im Handbuch führt in die Grundlagen des Paketschreibens für Guix ein (siehe Pakete definieren in Referenzhandbuch zu GNU Guix). Im folgenden Abschnitt werden wir diese Grundlagen teilweise rekapitulieren.
GNU Hello ist ein Projekt, das uns als Stellvertreter für „richtige“
Projekte und allgemeines Beispiel für das Schreiben von Paketen dient. Es
verwendet das GNU-Erstellungssystem (./configure && make && make
install
). Guix stellt uns schon eine Paketdefinition zur Verfügung, die uns
einen perfekten Ausgangspunkt bietet. Sie können sich ihre Deklaration
anschauen, indem Sie guix edit hello
von der Befehlszeile
ausführen. Schauen wir sie uns an:
(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)
(synopsis "Hello, GNU world: An example GNU package")
(description
"GNU Hello prints the message \"Hello, world!\" and then exits. It
serves as an example of standard GNU coding practices. As such, it supports
command-line arguments, multiple languages, and so on.")
(home-page "https://www.gnu.org/software/hello/")
(license gpl3+)))
Wie Sie sehen können, ist das meiste klar strukturiert. Aber sehen wir uns die Felder zusammen an:
Der Name des Projekts. Wir halten uns an die Konventionen von Scheme und bevorzugen deshalb Kleinschreibung ohne Unterstriche, sondern mit Bindestrichen zwischen den Wörtern.
Dieses Feld enthält eine Beschreibung, was der Ursprung des Quellcodes
ist. Das origin
-Verbundsobjekt enthält diese Felder:
url-fetch
, um über HTTP/FTP herunterzuladen,
aber es gibt auch andere Methoden wie git-fetch
für Git-Repositorys.
url-fetch
normalerweise eine Ortsangabe mit https://
ist.
In diesem Fall verweist die besondere URI ‚mirror://gnu‘ auf eine von
mehreren wohlbekannten Ortsangaben, von denen Guix jede durchprobieren kann,
um den Quellcode herunterzuladen, wenn es bei manchen davon nicht klappt.
sha256
-Prüfsumme der angefragten Datei.
Sie ist notwendig, damit sichergestellt werden kann, dass der Quellcode
nicht beschädigt ist. Beachten Sie, dass Guix mit Zeichenketten in
Base32-Kodierung arbeitet, weshalb wir die base32
-Funktion aufrufen.
Hier glänzt Schemes Fähigkeit zur Abstraktion: In diesem Fall abstrahiert
gnu-build-system
die berühmten Schritte ./configure && make &&
make install
, die sonst in der Shell aufgerufen würden. Zu den anderen
Erstellungssystemen gehören das trivial-build-system
, das nichts tut
und dem Paketautoren das Schreiben sämtlicher Erstellungsschritte
abverlangt, das python-build-system
, das emacs-build-system
,
und viele mehr (siehe Erstellungssysteme in Referenzhandbuch
zu GNU Guix).
Die Zusammenfassung. Sie sollte eine knappe Beschreibung sein, was das Paket tut. Für viele Pakete findet sich auf der Homepage ein Einzeiler, der als Zusammenfassung benutzt werden kann.
Genau wie bei der Zusammenfassung ist es in Ordnung, die Beschreibung des Projekts für das Paket wiederzuverwenden. Beachten Sie, dass Guix dafür Texinfo-Syntax verlangt.
Hier soll möglichst HTTPS benutzt werden.
Siehe die vollständige Liste verfügbarer Lizenzen in
guix/licenses.scm
im Guix-Quellcode.
Es wird Zeit, unser erstes Paket zu schreiben! Aber noch nichts tolles, wir
bleiben bei einem Paket my-hello
stelltvertretend für „richtige“
Software; es ist eine Kopie obiger Deklaration.
Genau wie beim Ritual, Neulinge in Programmiersprachen „Hallo Welt“ schreiben zu lassen, fangen wir mit der vielleicht „arbeitsintensivsten“ Herangehensweise ans Paketeschreiben an. Wir kümmern uns später darum, wie man am besten an Paketen arbeitet; erst einmal nehmen wir den einfachsten Weg.
Speichern Sie den folgenden Code in eine Datei my-hello.scm.
(use-modules (guix packages) (guix download) (guix build-system gnu) (guix licenses)) (package (name "my-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) (synopsis "Hello, Guix world: An example custom Guix package") (description "GNU Hello prints the message \"Hello, world!\" and then exits. It serves as an example of standard GNU coding practices. As such, it supports command-line arguments, multiple languages, and so on.") (home-page "https://www.gnu.org/software/hello/") (license gpl3+))
Wir erklären den zusätzlichen Code in Kürze.
Spielen Sie ruhig mit unterschiedlichen Werten für die verschiedenen Felder herum. Wenn Sie den Quellort (die „source“) ändern, müssen Sie die Prüfsumme aktualisieren. Tatsächlich weigert sich Guix, etwas zu erstellen, wenn die angegebene Prüfsumme nicht zu der berechneten Prüfsumme des Quellcodes passt. Um die richtige Prüfsumme für die Paketdeklaration zu finden, müssen wir den Quellcode herunterladen, die SHA256-Summe davon berechnen und sie in Base32 umwandeln.
Glücklicherweise kann Guix diese Aufgabe automatisieren; wir müssen lediglich die URI übergeben.
$ guix download mirror://gnu/hello/hello-2.10.tar.gz Starting download of /tmp/guix-file.JLYgL7 From https://ftpmirror.gnu.org/gnu/hello/hello-2.10.tar.gz... following redirection to `https://mirror.ibcp.fr/pub/gnu/hello/hello-2.10.tar.gz'... …10.tar.gz 709KiB 2.5MiB/s 00:00 [##################] 100.0% /gnu/store/hbdalsf5lpf01x4dcknwx6xbn6n5km6k-hello-2.10.tar.gz 0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i
In diesem speziellen Fall sagt uns die Ausgabe, welcher Spiegelserver
ausgewählt wurde. Wenn das Ergebnis des obigen Befehls nicht dasselbe ist
wie im Codeschnipsel, dann aktualisieren Sie Ihre
my-hello
-Deklaration entsprechend.
Beachten Sie, dass Tarball-Archive von GNU-Paketen mit einer OpenPGP-Signatur ausgeliefert werden, deshalb sollten Sie mit Sicherheit die Signatur dieses Tarballs mit „gpg“ überprüfen, um ihn zu authentifizieren, bevor Sie weitermachen.
$ guix download mirror://gnu/hello/hello-2.10.tar.gz.sig Starting download of /tmp/guix-file.03tFfb From https://ftpmirror.gnu.org/gnu/hello/hello-2.10.tar.gz.sig... following redirection to `https://ftp.igh.cnrs.fr/pub/gnu/hello/hello-2.10.tar.gz.sig'... ….tar.gz.sig 819B 1.2MiB/s 00:00 [##################] 100.0% /gnu/store/rzs8wba9ka7grrmgcpfyxvs58mly0sx6-hello-2.10.tar.gz.sig 0q0v86n3y38z17rl146gdakw9xc4mcscpk8dscs412j22glrv9jf $ gpg --verify /gnu/store/rzs8wba9ka7grrmgcpfyxvs58mly0sx6-hello-2.10.tar.gz.sig /gnu/store/hbdalsf5lpf01x4dcknwx6xbn6n5km6k-hello-2.10.tar.gz gpg: Signatur vom So 16 Nov 2014 13:08:37 CET gpg: mittels RSA-Schlüssel A9553245FDE9B739 gpg: Korrekte Signatur von "Sami Kerola (https://www.iki.fi/kerolasa/) <kerolasa@iki.fi>" [unbekannt] gpg: WARNUNG: Dieser Schlüssel trägt keine vertrauenswürdige Signatur! gpg: Es gibt keinen Hinweis, daß die Signatur wirklich dem vorgeblichen Besitzer gehört. Haupt-Fingerabdruck = 8ED3 96E3 7E38 D471 A005 30D3 A955 3245 FDE9 B739
Sie können dann unbesorgt das hier ausführen:
$ guix package --install-from-file=my-hello.scm
Nun sollte my-hello
in Ihrem Profil enthalten sein!
$ guix package --list-installed=my-hello my-hello 2.10 out /gnu/store/f1db2mfm8syb8qvc357c53slbvf1g9m9-my-hello-2.10
Wir sind so weit gekommen, wie es ohne Scheme-Kenntnisse möglich ist. Bevor wir mit komplexeren Paketen weitermachen, ist jetzt der Zeitpunkt gekommen, Ihr Wissen über Scheme zu entstauben. Siehe Ein Schnellkurs in Scheme für eine Auffrischung.
Nächste: Herangehensweisen, Nach oben: Anleitung zum Paketeschreiben [Inhalt][Index]