Nächste: Der Store, Vorige: Werkzeuge zur Erstellung, Nach oben: Programmierschnittstelle [Inhalt][Index]
Zahlreiche Programme und Bibliotheken suchen nach Eingabedaten in einem Suchpfad, d.h. einer Liste von Verzeichnissen: Shells wie Bash suchen ausführbare Dateien im Befehls-Suchpfad, ein C-Compiler sucht .h-Dateien in seinem Header-Suchpfad, der Python-Interpretierer sucht .py-Dateien in seinem Suchpfad, der Rechtschreibprüfer hat einen Suchpfad für Wörterbücher und so weiter.
Suchpfade kann man für gewöhnlich über Umgebungsvariable festlegen (siehe
Environment Variables in Referenzhandbuch der
GNU-C-Bibliothek). Zum Beispiel ändern Sie die oben genannten Suchpfade,
indem Sie den Wert der Umgebungsvariablen PATH
, C_INCLUDE_PATH
,
PYTHONPATH
(oder GUIX_PYTHONPATH
) und DICPATH
festlegen – Sie wissen schon, diese Variablen, die auf PATH
enden
und wenn Sie etwas daran falsch machen, werden Dinge „nicht gefunden“.
Vielleicht ist Ihnen auf der Befehlszeile aufgefallen, dass Guix Bescheid
weiß, welche Umgebungsvariablen definiert sein müssen und wie. Wenn Sie
Pakete in Ihr Standardprofil installieren, wird die Datei
~/.guix-profile/etc/profile angelegt, die Sie mit source
in
Ihre Shell übernehmen können, damit die Variablen richtig festgelegt
sind. Genauso werden Ihnen, wenn Sie mit guix shell
eine Umgebung
mit Python und der Python-Bibliothek NumPy erzeugen lassen und die
Befehlszeilenoption --search-paths angeben, die Variablen
PATH
und GUIX_PYTHONPATH
gezeigt (siehe guix shell
aufrufen):
$ guix shell python python-numpy --pure --search-paths export PATH="/gnu/store/…-profile/bin" export GUIX_PYTHONPATH="/gnu/store/…-profile/lib/python3.9/site-packages"
Wenn Sie --search-paths weglassen, werden diese Umgebungsvariablen direkt festgelegt, so dass Python NumPy vorfinden kann:
$ guix shell python python-numpy -- python3 Python 3.9.6 (default, Jan 1 1970, 00:00:01) [GCC 10.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import numpy >>> numpy.version.version '1.20.3'
Damit das funktioniert, wurden in der Definition des python
-Pakets
der dafür nötige Suchpfad und die zugehörige Umgebungsvariable
GUIX_PYTHONPATH
deklariert. Das sieht so aus:
(package
(name "python")
(version "3.9.9")
;; davor stehen andere Felder …
(native-search-paths
(list (search-path-specification
(variable "GUIX_PYTHONPATH")
(files (list "lib/python/3.9/site-packages"))))))
Die Aussage hinter dem native-search-paths
-Feld ist, dass wenn das
python
-Paket benutzt wird, die Umgebungsvariable
GUIX_PYTHONPATH
so definiert wird, dass alle Unterverzeichnisse
lib/python/3.9/site-packages in seiner Umgebung enthalten sind. (Mit
native-
meinen wir, dass in einer Umgebung zur Cross-Kompilierung nur
native Eingaben zum Suchpfad hinzugefügt werden dürfen; siehe search-paths
.) In unserem NumPy-Beispiel oben enthält das
Profil, in dem python
auftaucht, genau ein solches Unterverzeichnis,
auf das GUIX_PYTHONPATH
festgelegt wird. Wenn es mehrere
lib/python/3.9/site-packages gibt – etwa wenn wir über
Erstellungsumgebungen reden –, dann werden alle durch Doppelpunkte
(:
) getrennt zu GUIX_PYTHONPATH
hinzugefügt.
Anmerkung: Wir weisen darauf hin, dass
GUIX_PYTHONPATH
als Teil der Definition despython
-Pakets spezifiziert wird und nicht als Teil vonpython-numpy
. Der Grund ist, dass diese Umgebungsvariable zu Python „gehört“ und nicht zu NumPy: Python ist es, das den Wert der Variablen ausliest und befolgt.Daraus folgt, dass wenn Sie ein Profil ohne
python
erzeugen,GUIX_PYTHONPATH
nicht definiert wird, selbst wenn .py-Dateien zum Profil gehören:$ guix shell python-numpy --search-paths --pure export PATH="/gnu/store/…-profile/bin"Das ist logisch, wenn wir das Profil alleine betrachten: Keine Software im Profil würde
GUIX_PYTHONPATH
auslesen.
Selbstverständlich gibt es mehr als nur eine Sorte Suchpfad: Es gibt Pakete,
die mehrere Suchpfade berücksichtigen, solche mit anderen Trennzeichen als
dem Doppelpunkt, solche, die im Suchpfad gleich mehrere Verzeichnisse
aufnehmen, und so weiter. Ein weiterführendes Beispiel ist der Suchpfad von
libxml2: Der Wert der Umgebungsvariablen XML_CATALOG_FILES
wird durch
Leerzeichen getrennt, er muss eine Liste von catalog.xml-Dateien
(keinen Verzeichnissen) fassen und diese sind in
xml-Unterverzeichnissen zu finden – ganz schön
anspruchsvoll. Die Suchpfadspezifikation dazu sieht so aus:
(package
(name "libxml2")
;; davor stehen andere Felder …
(native-search-paths
(list (search-path-specification
(variable "XML_CATALOG_FILES")
(separator " ")
(files '("xml"))
(file-pattern "^catalog\\.xml$")
(file-type 'regular)))))
Keine Angst; die meisten Suchpfadspezifikationen sind einfacher.
Im Modul (guix search-paths)
wird der Datentyp für
Suchpfadspezifikationen definiert sowie eine Reihe von Hilfsprozeduren. Es
folgt nun die Referenz der Suchpfadspezifikationen.
Der Datentyp für Suchpfadspezifikationen.
variable
Welchen Namen die Umgebungsvariable für diesen Suchpfad trägt (als Zeichenkette).
files
Eine Liste der Unterverzeichnisse, die zum Suchpfad hinzugefügt werden sollen.
separator
(Vorgabe: ":"
)Die Zeichenkette, wodurch Komponenten des Suchpfads voneinander getrennt werden.
Für den Sonderfall, dass für separator
der Wert #f
gewählt
wird, handelt es sich um einen „Suchpfad mit nur einer Komponente“, mit
anderen Worten einen Suchpfad, der höchstens ein Element enthalten darf. Das
ist für Fälle gedacht wie die SSL_CERT_DIR
-Variable (die OpenSSL,
cURL und ein paar andere Pakete beachten) oder die
ASPELL_DICT_DIR
-Variable (auf die das Rechtschreibprüfprogramm
GNU Aspell achtet), welche beide auf ein einzelnes Verzeichnis zeigen
müssen.
file-type
(Vorgabe: 'directory
)Welche Art von Datei passt – hier kann 'directory
(für
Verzeichnisse) oder 'regular
(für reguläre Dateien) angegeben werden,
aber auch jedes andere Symbol, was stat:type
zurückliefern kann
(siehe stat
in Referenzhandbuch zu GNU
Guile).
Im libxml2-Beispiel oben sind es reguläre Dateien, die wir suchen, dagegen würde beim Python-Beispiel nach Verzeichnissen gesucht.
file-pattern
(Vorgabe: #f
)Das hier muss entweder #f
oder ein regulärer Ausdruck sein, der
angibt, welche Dateien innerhalb der mit dem Feld files
angegebenen Unterverzeichnisse darauf passen.
Auch hier sehen Sie im libxml2-Beispiel eine Situation, wo dies gebraucht wird.
Manche Suchpfade sind an mehr als ein Paket gekoppelt. Um sie nicht doppelt
und dreifach zu spezifizieren, sind manche davon vordefiniert in (guix
search-paths)
.
Mit diesen beiden Suchpfaden wird angegeben, wo X.509-Zertifikate zu finden sind (siehe X.509-Zertifikate).
Diese vordefinierten Suchpfade kann man wie im folgenden Beispiel benutzen:
(package
(name "curl")
;; eigentlich stehen hier noch ein paar Felder …
(native-search-paths (list $SSL_CERT_DIR $SSL_CERT_FILE)))
Wie macht man aus Suchpfadspezifikationen einerseits und einem Haufen
Verzeichnisse andererseits nun eine Menge von Definitionen für
Umgebungsvariable? Das ist die Aufgabe von evaluate-search-paths
.
als Liste von Suchpfadspezifikationen übergeben und untersucht werden Verzeichnisse, eine Liste von Verzeichnisnamen. Das Ergebnis wird als Liste von Paaren aus Spezifikation und Wert zurückgeliefert. Wenn Sie getenv angeben, werden darüber die momentanen Festlegungen erfasst und nur die nicht bereits gültigen gemeldet.
Das Modul (guix profiles)
enthält eine zugeschnittenere Hilfsprozedur
load-profile
, mit der Umgebungsvariable eines Profils festgelegt
werden.
Nächste: Der Store, Vorige: Werkzeuge zur Erstellung, Nach oben: Programmierschnittstelle [Inhalt][Index]