Nächste: , Vorige: , Nach oben: Programmierschnittstelle   [Inhalt][Index]


9.8 Suchpfade

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 des python-Pakets spezifiziert wird und nicht als Teil von python-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.

Datentyp: search-path-specification

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).

Scheme-Variable: $SSL_CERT_DIR
Scheme-Variable: $SSL_CERT_FILE

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.

Scheme-Prozedur: evaluate-search-paths Suchpfade Verzeichnisse [getenv] Die Suchpfade auswerten. Sie werden

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]