Nächste: , Vorige: , Nach oben: Aufruf von guix build   [Inhalt][Index]


10.1.2 Paketumwandlungsoptionen

Eine weitere Gruppe von Befehlszeilenoptionen, die guix build und auch guix package unterstützen, sind Paketumwandlungsoptionen. Diese Optionen ermöglichen es, Paketvarianten zu definieren – zum Beispiel können Pakete aus einem anderen Quellcode als normalerweise erstellt werden. Damit ist es leicht, angepasste Pakete schnell zu erstellen, ohne die vollständigen Definitionen von Paketvarianten einzutippen (siehe Pakete definieren).

Paketumwandlungsoptionen bleiben über Aktualisierungen hinweg erhalten: guix upgrade versucht, Umwandlungsoptionen, die vorher zur Erstellung des Profils benutzt wurden, auf die aktualisierten Pakete anzuwenden.

Im Folgenden finden Sie die verfügbaren Befehlszeilenoptionen. Die meisten Befehle unterstützen sie ebenso wie eine Option --help-transform, mit der all die verfügbaren Optionen und je eine Kurzbeschreibung dazu angezeigt werden. (Diese Optionen werden der Kürze wegen nicht in der Ausgabe von --help aufgeführt.)

--tune[=CPU]

Die optimierte Version als „tunebar“ markierter Pakete benutzen. CPU gibt die Prozessorarchitektur an, für die optimiert werden soll. Wenn als CPU die Bezeichnung native angegeben wird oder nichts angegeben wird, wird für den Prozessor optimiert, auf dem der Befehl guix läuft.

Gültige Namen für CPU sind genau die, die vom zugrunde liegenden Compiler erkannt werden. Vorgegeben ist, dass als Compiler die GNU Compiler Collection benutzt wird. Auf x86_64-Prozessoren gehören nehalem, haswell, und skylake zu den CPU-Namen (siehe -march in Using the GNU Compiler Collection (GCC)).

Mit dem Erscheinen neuer Generationen von Prozessoren wächst der Standardbefehlssatz (die „Instruction Set Architecture“, ISA) um neue Befehle an, insbesondere wenn es um Befehle zur Parallelverarbeitung geht („Single-Instruction/Multiple-Data“, SIMD). Zum Beispiel implementieren sowohl die Core2- als auch die Skylake-Prozessoren den x86_64-Befehlssatz, jedoch können nur letztere AVX2-SIMD-Befehle ausführen.

Der Mehrwert, den --tune bringt, besteht in erster Linie bei Programmen, für die SIMD-Fähigkeiten geeignet wären und die über keinen Mechanismus verfügen, zur Laufzeit die geeigneten Codeoptimierungen zuzuschalten. Pakete, bei denen die Eigenschaft tunable? angegeben wurde, werden bei der Befehlszeilenoption --tune als tunebare Pakete optimiert. Eine Paketdefinition, bei der diese Eigenschaft hinterlegt wurde, sieht so aus:

(package
  (name "hello-simd")
  ;; …

  ;; Dieses Paket kann von SIMD-Erweiterungen profitieren,
  ;; deshalb markieren wir es als "tunebar".
  (properties '((tunable? . #t))))

Andere Pakete werden als nicht tunebar aufgefasst. Dadurch kann Guix allgemeine Binärdateien verwenden, wenn sich die Optimierung für einen bestimmten Prozessor wahrscheinlich nicht lohnt.

Bei der Erstellung tunebarer Pakete wird -march=CPU übergeben. Intern wird die Befehlszeilenoption -march durch einen Compiler-Wrapper an den eigentlichen Wrapper übergeben. Weil die Erstellungsmaschine den Code für die Mikroarchitektur vielleicht gar nicht ausführen kann, wird der Testkatalog bei der Erstellung tunebarer Pakete übersprungen.

Damit weniger Neuerstellungen erforderlich sind, werden die von tunebaren Paketen abhängigen Pakete mit den optimierten Paketen veredelt (siehe Veredelungen). Wenn Sie --no-grafts übergeben, wirkt --tune deshalb nicht mehr.

Wir geben dieser Technik den Namen Paket-Multiversionierung: Mehrere Varianten des tunebaren Pakets können erstellt werden; eine für jede Prozessorvariante. Das ist die grobkörnige Entsprechung der Funktions-Multiversionierung, die in der GNU-Toolchain zu finden ist (siehe Function Multiversioning in Using the GNU Compiler Collection (GCC)).

--with-source=Quelle
--with-source=Paket=Quelle
--with-source=Paket@Version=Quelle

Den Paketquellcode für das Paket von der angegebenen Quelle holen und die Version als seine Versionsnummer verwenden. Die Quelle muss ein Dateiname oder eine URL sein wie bei guix download (siehe guix download aufrufen).

Wird kein Paket angegeben, wird als Paketname derjenige auf der Befehlszeile angegebene Paketname angenommen, der zur Basis am Ende der Quelle passt – wenn z.B. als Quelle die Datei /src/guile-2.0.10.tar.gz angegeben wurde, entspricht das dem guile-Paket.

Ebenso wird, wenn keine Version angegeben wurde, die Version als Zeichenkette aus der Quelle abgeleitet; im vorherigen Beispiel wäre sie 2.0.10.

Mit dieser Option können Nutzer versuchen, eine andere Version ihres Pakets auszuprobieren, als die in der Distribution enthaltene Version. Folgendes Beispiel lädt ed-1.7.tar.gz von einem GNU-Spiegelserver herunter und benutzt es als Quelle für das ed-Paket:

guix build ed --with-source=mirror://gnu/ed/ed-1.4.tar.gz

Für Entwickler wird es einem durch --with-source leicht gemacht, „Release Candidates“, also Vorabversionen, zu testen, oder sogar welchen Einfluss diese auf abhängige Pakete haben:

guix build elogind --with-source=…/shepherd-0.9.0rc1.tar.gz 

… oder ein Checkout eines versionskontrollierten Repositorys in einer isolierten Umgebung zu erstellen:

$ git clone git://git.sv.gnu.org/guix.git
$ guix build guix --with-source=guix@1.0=./guix
--with-input=Paket=Ersatz

Abhängigkeiten vom Paket durch eine Abhängigkeit vom Ersatz-Paket ersetzen. Als Paket muss ein Paketname angegeben werden und als Ersatz eine Paketspezifikation wie guile oder guile@1.8.

Mit folgendem Befehl wird zum Beispiel Guix erstellt, aber statt der aktuellen stabilen Guile-Version hängt es von der alten Guile-Version guile@2.0 ab:

guix build --with-input=guile=guile@2.0 guix

Die Ersetzung ist rekursiv und umfassend. In diesem Beispiel würde nicht nur guix, sondern auch seine Abhängigkeit guile-json (was auch von guile abhängt) für guile@2.0 neu erstellt.

Implementiert wird das alles mit der Scheme-Prozedur package-input-rewriting (siehe package-input-rewriting).

--with-graft=Paket=Ersatz

Dies verhält sich ähnlich wie mit --with-input, aber mit dem wichtigen Unterschied, dass nicht die gesamte Abhängigkeitskette neu erstellt wird, sondern das Ersatz-Paket erstellt und die ursprünglichen Binärdateien, die auf das Paket verwiesen haben, damit veredelt werden. Im Abschnitt Sicherheitsaktualisierungen finden Sie weitere Informationen über Veredelungen.

Zum Beispiel veredelt folgender Befehl Wget und alle Abhängigkeiten davon mit der Version 3.5.4 von GnuTLS, indem Verweise auf die ursprünglich verwendete GnuTLS-Version ersetzt werden:

guix build --with-graft=gnutls=gnutls@3.5.4 wget

Das hat den Vorteil, dass es viel schneller geht, als alles neu zu erstellen. Die Sache hat aber einen Haken: Veredelung funktioniert nur, wenn das Paket und sein Ersatz miteinander streng kompatibel sind – zum Beispiel muss, wenn diese eine Programmbibliothek zur Verfügung stellen, deren Binärschnittstelle („Application Binary Interface“, kurz ABI) kompatibel sein. Wenn das Ersatz-Paket auf irgendeine Art inkompatibel mit dem Paket ist, könnte das Ergebnispaket unbrauchbar sein. Vorsicht ist also geboten!

--with-debug-info=Paket

Das Paket auf eine Weise erstellen, die Informationen zur Fehlersuche enthält, und von ihm abhängige Pakete damit veredeln. Das ist nützlich, wenn das Paket noch keine Fehlersuchinformationen als installierbare debug-Ausgabe enthält (siehe Dateien zur Fehlersuche installieren).

Als Beispiel nehmen wir an, Inkscape stürzt bei Ihnen ab und Sie möchten wissen, was dabei in GLib passiert. Die GLib-Bibliothek liegt tief im Abhängigkeitsgraphen von Inkscape und verfügt nicht über eine debug-Ausgabe; das erschwert die Fehlersuche. Glücklicherweise können Sie GLib mit Informationen zur Fehlersuche neu erstellen und an Inkscape anheften:

guix install inkscape --with-debug-info=glib

Nur GLib muss neu kompiliert werden, was in vernünftiger Zeit möglich ist. Siehe Dateien zur Fehlersuche installieren für mehr Informationen.

Anmerkung: Intern funktioniert diese Option, indem ‘#:strip-binaries? #f’ an das Erstellungssystem des betreffenden Pakets übergeben wird (siehe Erstellungssysteme). Die meisten Erstellungssysteme unterstützen diese Option, manche aber nicht. In diesem Fall wird ein Fehler gemeldet.

Auch wenn ein in C/C++ geschriebenes Paket ohne -g erstellt wird (was selten der Fall ist), werden Informationen zur Fehlersuche weiterhin fehlen, obwohl #:strip-binaries? auf falsch steht.

--with-c-toolchain=Paket=Toolchain

Mit dieser Befehlszeilenoption wird die Kompilierung des Pakets und aller davon abhängigen Objekte angepasst, so dass mit der Toolchain statt der vorgegebenen GNU-Toolchain für C/C++ erstellt wird.

Betrachten Sie dieses Beispiel:

guix build octave-cli \
  --with-c-toolchain=fftw=gcc-toolchain@10 \
  --with-c-toolchain=fftwf=gcc-toolchain@10

Mit dem obigen Befehl wird eine Variante der Pakete fftw und fftwf mit Version 10 der gcc-toolchain anstelle der vorgegebenen Toolchain erstellt, um damit anschließend eine diese benutzende Variante des GNU-Octave-Befehlszeilenprogramms zu erstellen. Auch GNU Octave selbst wird mit gcc-toolchain@10 erstellt.

Das zweite Beispiel bewirkt eine Erstellung der „Hardware Locality“-Bibliothek (hwloc) sowie ihrer abhängigen Objekte bis einschließlich intel-mpi-benchmarks mit dem Clang-C-Compiler:

guix build --with-c-toolchain=hwloc=clang-toolchain \
           intel-mpi-benchmarks

Anmerkung: Es kann vorkommen, dass die Anwendungsbinärschnittstellen („Application Binary Interfaces“, kurz ABIs) der Toolchains inkompatibel sind. Das tritt vor allem bei der C++-Standardbibliothek und Bibliotheken zur Laufzeitunterstützung wie denen von OpenMP auf. Indem alle abhängigen Objekte mit derselben Toolchain erstellt werden, minimiert --with-c-toolchain das Risiko, dass es zu Inkompatibilitäten kommt, aber es kann nicht ganz ausgeschlossen werden. Bedenken Sie, für welches Paket Sie dies benutzen.

--with-git-url=Paket=URL

Das Paket aus dem neuesten Commit im master-Branch des unter der URL befindlichen Git-Repositorys erstellen. Git-Submodule des Repositorys werden dabei rekursiv geladen.

Zum Beispiel erstellt der folgende Befehl die NumPy-Python-Bibliothek unter Verwendung des neuesten Commits von Python auf dessen „master“-Branch.

guix build python-numpy \
  --with-git-url=python=https://github.com/python/cpython

Diese Befehlszeilenoption kann auch mit --with-branch oder --with-commit kombiniert werden (siehe unten).

Da es den neuesten Commit auf dem verwendeten Branch benutzt, ändert sich das Ergebnis natürlich mit der Zeit. Nichtsdestoweniger ist es eine bequeme Möglichkeit, ganze Softwarestapel auf dem neuesten Commit von einem oder mehr Paketen aufbauen zu lassen. Es ist besonders nützlich im Kontext Kontinuierlicher Integration (englisch „Continuous Integration“, kurz CI).

Checkouts bleiben zwischengespeichert als ~/.cache/guix/checkouts, damit danach schneller auf dasselbe Repository zugegriffen werden kann. Eventuell möchten Sie das Verzeichnis ab und zu bereinigen, um Plattenplatz zu sparen.

--with-branch=Paket=Branch

Das Paket aus dem neuesten Commit auf dem Branch erstellen. Wenn das source-Feld des Pakets ein origin-Objekt mit der Methode git-fetch (siehe origin-Referenz) oder ein git-checkout-Objekt ist, wird die URL des Repositorys vom source-Feld genommen. Andernfalls müssen Sie die Befehlszeilenoption --with-git-url benutzen, um die URL des Git-Repositorys anzugeben.

Zum Beispiel wird mit dem folgenden Befehl guile-sqlite3 aus dem neuesten Commit seines master-Branches erstellt und anschließend guix (was von guile-sqlite3 abhängt) und cuirass (was von guix abhängt) unter Nutzung genau dieser guile-sqlite3-Erstellung erstellt:

guix build --with-branch=guile-sqlite3=master cuirass
--with-commit=Paket=Commit

Dies verhält sich ähnlich wie --with-branch, außer dass es den angegebenen Commit benutzt statt die Spitze eines angegebenen Branches. Als Commit muss ein gültiger SHA1-Bezeichner, ein Tag oder ein Bezeichner wie von git describe (wie 1.0-3-gabc123) für einen Git-Commit angegeben werden.

--with-patch=Paket=Datei

Die Datei zur Liste der auf das Paket anzuwendenden Patches hinzufügen. Als Paket muss eine Spezifikation wie python@3.8 oder glibc benutzt werden. In der Datei muss ein Patch enthalten sein; er wird mit den im Ursprung (origin) des Pakets angegebenen Befehlszeilenoptionen angewandt (siehe origin-Referenz). Die vorgegebenen Optionen enthalten -p1 (siehe patch Directories in Comparing and Merging Files).

Zum Beispiel wird mit dem folgenden Befehl für die Neuerstellung von Coreutils die GNU-C-Bibliothek (glibc) wie angegeben gepatcht:

guix build coreutils --with-patch=glibc=./glibc-frob.patch

In diesem Beispiel wird glibc selbst und alles, was im Abhängigkeitsgraphen auf dem Weg zu Coreutils liegt, neu erstellt.

--with-latest=Paket

Sie hätten gerne das Neueste vom Neuen? Dann ist diese Befehlszeilenoption das Richtige für Sie! Damit wird jedes Vorkommen von Paket im Abhängigkeitsgraphen durch dessen neueste angebotene Version ersetzt, wie sie auch von guix refresh gemeldet würde (siehe guix refresh aufrufen).

Dazu wird die neueste angebotene Version des Pakets ermittelt (wenn möglich), heruntergeladen und, wenn eine OpenPGP-Signatur mit dabei ist, es damit authentifiziert.

Zum Beispiel wird durch folgenden Befehl Guix mit der neuesten Version von Guile-JSON erstellt:

guix build guix --with-latest=guile-json

Es gibt jedoch Einschränkungen. Erstens gehen Sie in dem Fall, dass das Werkzeug nicht in der Lage ist oder nicht weiß, wie es den Quellcode authentifiziert, das Risiko ein, dass bösartiger Code ausgeführt wird; Ihnen wird dann eine Warnung angezeigt. Zweitens wird mit dieser Option einfach der Quellcode ausgetauscht und die übrige Paketdefinition bleibt erhalten. Manchmal reicht das nicht; es könnte sein, dass neue Abhängigkeiten hinzugefügt oder neue Patches angewandt werden müssen oder dass ganz allgemein Arbeiten zur Qualitätssicherung, die Guix-Entwickler normalerweise leisten, fehlen werden.

Sie sind gewarnt worden! Wenn aber kein Problem auftritt, können Sie das Paket zackig auf den neuesten Stand bringen. Wir ermutigen Sie dazu, Patches einzureichen, die die eigentliche Paketdefinition aktualisieren, sobald Sie die neue Version erfolgreich getestet haben (siehe Mitwirken).

--without-tests=Paket

Das Paket erstellen, ohne seine Tests zu durchlaufen. Das erweist sich als nützlich, wenn Sie Testkataloge überspringen möchten, die viel Zeit in Anspruch nehmen, oder wenn der Testkatalog eines Pakets nichtdeterministisch fehlschlägt. Dies sollte mit Bedacht eingesetzt werden, denn das Ausführen des Testkatalogs sichert zu, dass ein Paket wie gewollt funktioniert.

Wenn die Tests abgeschaltet werden, ergibt sich ein anderes Store-Objekt. Dadurch muss, wenn diese Option benutzt wird, auch alles, was vom Paket abhängt, neu erstellt werden, wie Sie in diesem Beispiel sehen können:

guix install --without-tests=python python-notebook

Mit obigem Befehl wird python-notebook für ein python installiert, dessen Testkatalog nicht ausgeführt wurde. Dazu wird auch alles neu erstellt, was von python abhängt, einschließlich python-notebook.

Intern funktioniert --without-tests, indem es die Option #:tests? der check-Phase eines Pakets abändert (siehe Erstellungssysteme). Beachten Sie, dass manche Pakete eine angepasste check-Phase benutzen, die eine Einstellung wie #:tests? #f nicht berücksichtigt. Deshalb wirkt sich --without-tests auf diese Pakete nicht aus.

Sie fragen sich sicher, wie Sie dieselbe Wirkung mit Scheme-Code erzielen können, zum Beispiel wenn Sie Ihr Manifest oder eine eigene Paketumwandlung schreiben? Siehe Paketvarianten definieren für eine Übersicht über verfügbare Programmierschnittstellen.


Nächste: Zusätzliche Erstellungsoptionen, Vorige: Gemeinsame Erstellungsoptionen, Nach oben: Aufruf von guix build   [Inhalt][Index]