# Abhängigkeiten (dependencies)

Das FreeBSD Porter-Handbuch
Zurück | Kapitel 5. Die Konfiguration des Makefile | Weiter

# 5.7. Abhängigkeiten (dependencies)

Viele Ports hängen von anderen Ports ab. Dies ist ein sehr praktisches und nettes Feature der meisten Unix-ähnlichen Betriebssysteme, FreeBSD nicht ausgeschlossen. Es erlaubt, dass häufig vorkommende Abhängigkeiten nicht mit jedem Port oder Paket zusammen ausgeliefert werden müssen, da viele Ports diese gemeinsam benutzen. Es gibt sieben Variablen, die benutzt werden können, um sicherzustellen, dass alle benötigten Teile auf dem Rechner des Nutzers sind. Zusätzlich gibt es einige vordefinierte Variablen für Abhängigkeiten in häufigen Fällen und einige, welche das Verhalten der Abhängigkeiten bestimmen.

## 5.7.1. `LIB_DEPENDS`

Diese Variable spezifiziert die Shared-Libraries, von denen der Port abhängt. Es ist eine Liste von `lib`:`dir`[`:target`]-Tupeln wobei `lib` den Name der gemeinsam genutzten Bibliothek, `dir` das Verzeichnis, in welchem sie zu finden ist, falls nicht verfügbar, und `target` das Target in diesem Verzeichnis angeben. Zum Beispiel wird

    LIB_DEPENDS=   jpeg.9:${PORTSDIR}/graphics/jpeg

auf eine jpeg-Bibliothek mit der Hauptversionsnummer 9 prüfen, in das `graphics/jpeg`-Unterverzeichnis Ihrer Ports-Sammlung wechseln, es bauen und installieren, falls es nicht gefunden wird. Der `target`-Teil kann weggelassen werden, falls er identisch mit `DEPENDS_TARGET` ist (Vorgabe hierfür ist `install`).

> Anmerkung: Der `lib`-Teil ist ein regulärer Ausdruck, welcher die Ausgabe von `ldconfig -r` ausgewertet. Werte wie `intl.[5-7]` und `intl` sind zulässig. Das erste Muster, `intl.[5-7]`, stimmt überein mit: `intl.5`, `intl.6` oder `intl.7`. Das zweite Muster, `intl`, stimmt überein mit jeder Version der `intl`-Bibliothek.

Die Abhängigkeit wird zwei Mal überprüft, einmal innerhalb des `extract`-Target und dann innerhalb des `install`-Target. Zudem wird der Name der Abhängigkeit in das Paket eingefügt, damit pkg_add(1) es automatisch installiert, falls es nicht auf dem Rechner des Nutzers ist.

## 5.7.2. `RUN_DEPENDS`

Diese Variable legt Binärdateien oder Dateien, von denen der Port abhängt, für die Laufzeit fest. Es ist eine Liste von `path`:`dir`[`:target`]-Tupeln, wobei `path` der Name der Binärdatei oder Datei, `dir` das Verzeichnis, in welchem sie gefunden werden kann, falls nicht vorhanden, und `target` das Target in diesem Verzeichnis angeben. Falls `path` mit einem Slash (`/`) beginnt, wird es als Datei behandelt und deren Vorhandensein wird mit `test -e`; überprüft. Andernfalls wird angenommen, dass es eine Binärdatei ist und `which -s` wird benutzt, um zu überprüfen, ob das Programm im Pfad vorhanden ist.

Zum Beispiel wird

    RUN_DEPENDS=   ${LOCALBASE}/etc/innd:${PORTSDIR}/news/inn \
    	   xmlcatmgr:${PORTSDIR}/textproc/xmlcatmgr

überprüfen, ob die Datei oder das Verzeichnis `/usr/local/etc/innd` existiert und es erstellen und installieren aus dem `news/inn`-Unterverzeichnis der Ports-Sammlung, falls es nicht gefunden wird. Es wird zudem überprüft, ob die Binärdatei namens `xmlcatmgr` im Suchpfad vorhanden ist und danach zum Unterverzeichnis `textproc/xmlcatmgr` in Ihrer Ports-Sammlung wechseln, es bauen und installieren, falls es nicht gefunden wird.

> Anmerkung: In diesem Fall ist `innd` eine Binärdatei. Falls sich eine Binärdatei an einem ungewöhnlichen Platz befindet, der nicht im Suchpfad ist, dann sollten Sie die volle Pfadangabe verwenden.

> Anmerkung: Der offizielle Suchpfad `PATH`, welcher im Ports Cluster benutzt wird, ist

>     /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin

Die Abhängigkeit wird innerhalb des `install`-Target überprüft. Zudem wird der Name der Abhängigkeit in das Paket übernommen, damit pkg_add(1) es automatisch installieren wird, falls es auf dem System des Nutzers nicht vorhanden ist. Der `target`-Teil kann weggelassen werden, wenn er der gleiche ist wie in der Variable `DEPENDS_TARGET`.

Es kommt recht häufig vor, dass `RUN_DEPENDS` genau dasselbe enthält wie `BUILD_DEPENDS`, gerade dann, wenn die portierte Software in einer Skriptsprache geschrieben ist oder dieselbe Umgebung, die zum Bau verwendet wurde, zur Laufzeit gebraucht wird. In diesem Fall ist es sowohl verlockend als auch intuitiv, den Wert der einen Variable der anderen direkt zuzuweisen:

    RUN_DEPENDS= ${BUILD_DEPENDS}

Jedoch kann eine solche Zuweisung dazu führen, dass die Liste der Laufzeitabhängigkeiten mit überflüssigen Einträgen belastet wird, die sich nicht in der ursprünglichen Liste `BUILD_DEPENDS` des Ports befanden, da sich make(1) bei der Auswertung solcher Zuweisungen träge verhält. Stellen Sie sich ein `Makefile` mit `USE_`*``-Variablen vor, die von `ports/Mk/bsd.*.mk` verarbeitet werden, um initiale Bauabhängigkeiten zusammenzutragen. Zum Beispiel fügt `USE_GMAKE=yes` `devel/gmake` zu `BUILD_DEPENDS` hinzu. Um zu verhindern, dass solche zusätzlichen Abhängigkeiten `RUN_DEPENDS` belasten, achten Sie darauf, bei gleichzeitiger Auswertung zuzuweisen, d.h. der Ausdruck wird ausgewertet, bevor er als Wert der Variablen zugewiesen wird:

    RUN_DEPENDS:=  ${BUILD_DEPENDS}

## 5.7.3. `BUILD_DEPENDS`

Diese Variable legt Binärdateien oder Dateien fest, die dieser Port zur Erstellung benötigt. Wie `RUN_DEPENDS` ist es eine Liste von `path`:`dir`[`:target`]-Tupeln. Zum Beispiel wird

     BUILD_DEPENDS=
    	  unzip:${PORTSDIR}/archivers/unzip

überprüfen, ob eine Binärdatei `unzip` vorhanden ist und in das Unterverzeichnis `archivers/unzip` Ihrer Ports-Sammlung wechseln und sie erstellen und installieren, falls sie nicht gefunden wird.

> Anmerkung: ``Erstellen'' bedeutet hier alles von der Extraktion bis zur Kompilierung. Die Abhängigkeit wird im `extract`-Target überprüft. Der `target`-Teil kann weggelassen werden, falls er identisch mit der Variable `DEPENDS_TARGET` ist.

## 5.7.4. `FETCH_DEPENDS`

Diese Variable legt eine Binärdatei oder Datei fest, welche der Port benötigt, um heruntergeladen werden zu können. Wie die vorherigen beiden Variablen ist er eine Liste von `path`:`dir`[`:target`]-Tupeln. Zum Beispiel wird

     FETCH_DEPENDS=
    	  ncftp2:${PORTSDIR}/net/ncftp2

überprüfen, ob eine Binärdatei namens `ncftp2` vorhanden ist, in das Unterverzeichnis `net/ncftp2` Ihrer Ports-Sammlung wechseln, sie erstellen und installieren, falls sie nicht gefunden wird.

Die Abhängigkeit wird innerhalb des `fetch`-Target überprüft. Der `target`-Teil kann weggelassen werden, falls er identisch mit der Variable `DEPENDS_TARGET` ist.

## 5.7.5. `EXTRACT_DEPENDS`

Diese Variable spezifiziert eine Binärdatei oder eine Datei, welche dieser Port für die Extraktion benötigt. Wie die vorherigen Variablen ist er eine Liste von `path`:`dir`[`:target`]-Tupeln. Zum Beispiel wird

    EXTRACT_DEPENDS=
    	  unzip:${PORTSDIR}/archivers/unzip

überprüfen, ob eine Binärdatei namens `unzip` vorhanden ist, in das Unterverzeichnis `archivers/unzip` Ihrer Ports-Sammlung wechseln, sie erstellen und installieren, falls sie nicht gefunden wird.

Die Abhängigkeit wird innerhalb des `extract`-Target überprüft. Der `target`-Teil kann weggelassen werden, falls er identisch mit der Variable `DEPENDS_TARGET` ist.

> Anmerkung: Nutzen Sie diese Variable nur, wenn die Extraktion nicht funktioniert (die Vorgabe nimmt `gzip` an) und nicht mit `USE_ZIP` oder `USE_BZIP2` wie in Abschnitt 5.7.7 beschrieben zum Laufen gebracht werden kann.

## 5.7.6. `PATCH_DEPENDS`

Diese Variable legt eine Binärdatei oder eine Datei fest, welche dieser Port zum Patchen benötigt. Wie die vorhergehenden Variablen ist diese eine Liste von `path`:`dir`[`:target`]-Tupeln. Zum Beispiel wird

     PATCH_DEPENDS=
    	  ${NONEXISTENT}:${PORTSDIR}/java/jfc:extract

in das Unterverzeichnis `java/jfc` Ihrer Ports-Sammlung wechseln, um es zu entpacken.

Die Abhängigkeit wird innerhalb des `patch`-Target überprüft. Der `target`-Teil kann entfallen, falls er identisch mit der Variable `DEPENDS_TARGET` ist.

## 5.7.7. `USE_`*``

Es gibt eine Reihe von Variablen, um gebräuchliche Abhängigkeiten einzukapseln, die viele Ports aufweisen. Obwohl Ihre Verwendung optional ist, können sie helfen die Übersichtlichkeit des `Makefile` eines Ports zu erhöhen. Jede von ihnen ist im Stil von `USE_`*``. Der Gebrauch dieser Variablen ist beschränkt auf das `Makefile` eines Ports und `ports/Mk/bsd.*.mk`. Es ist nicht entworfen worden, um durch den Nutzer setzbare Optionen einzukapseln; benutzen Sie `WITH_`*`` und `WITHOUT_`*`` für diese Zwecke.

> Anmerkung: Es ist immer falsch, irgendeine `USE_`*``-Variable in der `/etc/make.conf` zu setzen. Zum Beispiel würde das Setzen von

>     USE_GCC=3.4

> eine Abhängigkeit für GCC34 für jeden Port einschliesslich GCC34 selbst hinzufügen!

Tabelle 5-2. Die `USE_`*``-Varibalen

Variable | Bedeutung
--- | ---
`USE_BZIP2` | Der Tarball dieses Ports wird mit `bzip2` komprimiert.
`USE_ZIP` | Der Tarball des Ports wird mit `zip` komprimiert.
`USE_BISON` | Der Port benutzt `bison` für die Erstellung.
`USE_CDRTOOLS` | Der Port erfordert cdrecord entweder von `sysutils/cdrtools` oder `sysutils/cdrtools-cjk`, abhängig davon, was der Nutzer vorgibt.

`USE_GCC`

Dieser Port benötigt eine bestimmte Version von `gcc` zur Erstellung. Die genaue Version kann festgelegt werden mit Werten wie `3.4`. Mit `3.4+` kann die mindestens erforderliche Version spezifiziert werden. Der `gcc` aus dem Basissystem wird genutzt, wenn er die erforderliche Version erfüllt, andernfalls wird eine geeignete Version des `gcc` aus den Ports kompiliert und die Variablen `CC` und `CXX` werden angepasst.

Variablen zugehörig zu gmake und dem `configure`-Skript werden in Abschnitt 6.3 beschrieben, währenddessen autoconf, automake und libtool in Abschnitt 6.4 beschrieben sind. Perl-spezifische Variablen werden in Abschnitt 6.6 behandelt. X11-Variablen sind aufgelistet in Abschnitt 6.7. Abschnitt 6.8 behandelt GNOME-bezogene Variablen und Abschnitt 6.10 KDE-bezogene Variablen. Abschnitt 6.11 dokumentiert Java-Variablen, während Abschnitt 6.12Informationen zu Apache, PHP und PEAR-Modulen enthält. Python wird in Abschnitt 6.13 und Ruby in Abschnitt 6.16 erörtert. Abschnitt 6.17 stellt Variablen für SDL-Programme zur Verfügung und Abschnitt 6.20 enthält schliesslich Variablen für Xfce.

## 5.7.8. Minimale Version einer Abhängigkeit

Eine minimale Version einer Abhängigkeit kann in jeder `*_DEPENDS`-Variable festgelegt werden mit Ausnahme von `LIB_DEPENDS` durch Anwendung folgender Syntax:

    p5-Spiffy>=0.26:${PORTSDIR}/devel/p5-Spiffy

Das erste Feld enthält einen abhängigen Paketnamen, welcher einem Eintrag in der Paketdatenbank entsprechen muss und einen Vergleich mit einer Paketversion. Die Abhängigkeit wird erfüllt, wenn p5-Spiffy-0.26 oder eine neuere Version auf dem System installiert ist.

## 5.7.9. Anmerkungen zu Abhängigkeiten

Wie vorstehend beschrieben ist das Vorgabe-Target `DEPENDS_TARGET`, wenn eine Abhängigkeit benötigt wird. Die Vorgabe hierfür ist `install`. Dies ist eine Nutzer-Variable; sie wird niemals im `Makefile` eines Ports definiert. Falls Ihr Port einen besonderen Weg benötigt, um mit einer Abhängigkeit umzugehen, dann benutzen Sie bitte den `:target`-Teil der `*_DEPENDS`-Variablen, anstatt `DEPENDS_TARGET` zu ändern.

Falls Sie `make clean` schreiben, werden dessen Abhängigkeiten auch gesäubert. Falls Sie dies nicht wollen, definieren Sie die Variable `NOCLEANDEPENDS` in Ihrer Umgebung. Dies kann besonders erstrebenswert sein, wenn der Port etwas in seiner Liste von Abhängigkeiten hat, das sehr viel Zeit für einen rebuild benötigt wie KDE, GNOME oder Mozilla.

Um von einem anderen Port bedingungslos abhängig zu sein, benutzen Sie bitte die Variable `${NONEXISTENT}` als erstes Feld von `BUILD_DEPENDS` oder `RUN_DEPENDS`. Benutzen Sie dies nur, wenn Sie den Quelltext eines anderen Port benötigen. Sie können auch oft Kompilierzeit sparen, wenn Sie das Target festlegen. Zum Beispiel wird

    BUILD_DEPENDS=   ${NONEXISTENT}:${PORTSDIR}/graphics/jpeg:extract

immer zum `jpeg`-Port wechseln und ihn extrahieren.

## 5.7.10. Zirkuläre Abhängigkeiten sind fatal

> Wichtig: Führen Sie niemals irgendwelche zirkulären Abhängigkeiten in der Ports-Sammlung ein!

Die Struktur für die Erstellung von Ports dulde keinerlei zirkuläre Abhängigkeiten. Falls Sie dennoch eine verwenden, wird es irgendjemanden irgendwo auf der Welt geben, dessen FreeBSD-Installation nahezu sofort zusammenbricht und vielen anderen wird es sehr schnell genauso ergehen. So etwas kann extrem schwer festzustellen sein. Falls Sie Zweifel haben vor einer Änderung, dann vergewissern Sie sich, dass Sie folgendes getan haben: `cd /usr/ports; make index`. Dieser Prozess kann auf alten Maschinen sehr langsam sein, aber Sie ersparen sich und einer Vielzahl von Menschen möglicherweise eine Menge Ärger.

Zurück | Zum Anfang | Weiter
`COMMENT` | Nach oben | `MASTERDIR`

Fragen zum FreeBSD Ports-System richten Sie bitte an <ports@FreeBSD.org>, Fragen zu diesem Dokument hingegen an <de-bsd-translators@de.FreeBSD.org>.