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

# 5.14. Installation von Dateien

## 5.14.1. INSTALL_* macros

Nutzen Sie die Makros in `bsd.port.mk`, um korrekte Modi und Eigentümer von Dateien in Ihren `*-install`-Targets sicherzustellen.

- `INSTALL_PROGRAM` ist ein Befehl, um binäre Binärdateien zu installieren.

- `INSTALL_SCRIPT` ist ein Befehl, um ausführbare Skripte zu installieren.

- `INSTALL_LIB` ist ein Befehl zur Installation Shared-Libraries.

- `INSTALL_KLD` ist ein Befehl, mit dem Kernelmodule installiert werden können. Einige Architekturen haben Probleme mit stripped-Modulen. Daher sollten Sie diesen Befehl anstelle von `INSTALL_PROGRAM` verwenden.

- `INSTALL_DATA` ist ein Befehl, um gemeinsam nutzbare Daten zu installieren.

- `INSTALL_MAN` ist ein Befehl, um Manualpages oder andere Dokumentation zu installieren (es wird nichts komprimiert).

Das sind grundsätzlich alle `install`-Befehle mit ihren passenden Flags.

## 5.14.2. Zerlegen von Binärdateien und Shared-Libraries

Zerlegen Sie keine Binärdateien manuell, wenn Sie es nicht müssen. Alle Binaries sollten gestripped werden; allerdings vermag das `INSTALL_PROGRAM`-Makro gleichzeitig eine Binärdatei zu installieren und zu strippen (beachten Sie den nächsten Abschnitt). Das Makro `INSTALL_LIB` erledigt das gleiche für Shared-Libraries.

Wenn Sie eine Datei strippen müssen, aber weder das `INSTALL_PROGRAM`- noch das `INSTALL_LIB`-Makro nutzen wollen, dann kann `${STRIP_CMD}` Ihr Programm strippen. Dies wird typischerweise innerhalb des `post-install`-Targets gemacht. Zum Beispiel:

    post-install:
        ${STRIP_CMD} ${PREFIX}/bin/xdl

Nutzen Sie file(1) für die installierte Applikation, um zu überprüfen, ob eine Binärdatei gestripped ist oder nicht. Wenn es nicht meldet `not stripped`, dann ist es bereits gestripped. Zudem wird strip(1) nicht ein bereits gestripptes Programm nochmals versuchen zu strippen, sondern wird stattdessen einfach sauber beenden.

## 5.14.3. Installation eines ganzen Verzeichnisbaums inklusive Dateien

Manchmal muss man eine große Zahl von Dateien unter Erhalt ihrer hierarchischen Struktur installieren, d.h. Kopieraktionen über einen ganzen Verzeichnisbaum von `WRKSRC` zu einem Zielverzeichnis unter `PREFIX`.

Für diesen Fall gibt es zwei Makros. Der Vorteil der Nutzung dieser Makros anstatt `cp` ist, dass sie korrekte Besitzer und Berechtigungen auf den Zieldateien garantieren. Das erste Makro, `COPYTREE_BIN`, wird alle installierten Dateien ausführbar markieren und damit passend für die Installation in ``PREFIX`/bin` vorbereiten. Das zweite Makro, `COPYTREE_SHARE`, setzt keine Ausführungsberechtigungen auf Dateien und ist daher geeignet für die Installation von Dateien im Target von ``PREFIX`/share`.

    post-install:
        ${MKDIR} ${EXAMPLESDIR}
        (cd ${WRKSRC}/examples/ && ${COPYTREE_SHARE} \* ${EXAMPLESDIR})

Dieses Beispiel wird den Inhalt des `examples`-Verzeichnisses im Distfile des Drittanbieters in das Beispielverzeichnis Ihres Ports kopieren.

    post-install:
        ${MKDIR} ${DATADIR}/summer
        (cd ${WRKSRC}/temperatures/ && ${COPYTREE_SHARE} "June July August" ${DATADIR}/summer/)

Und dieses Beispiel wird die Daten der Sommermonate in das `summer`-Unterverzeichnis eines ``DATADIR`` installieren.

Zusätzliche `find`-Argumente können mit dem dritten Argument an die `COPYTREE_*`-Makros übergeben werden. Um zum Beispiel alle Dateien aus dem 1. Beispiel ohne die Makefiles zu installieren, kann man folgenden Befehl benutzen.

    post-install:
        ${MKDIR} ${EXAMPLESDIR}
        (cd ${WRKSRC}/examples/ && \
    	${COPYTREE_SHARE} \* ${EXAMPLESDIR} "! -name Makefile")

Beachten Sie bitte, dass diese Makros die installierten Dateien nicht zur `pkg-plist` hinzufügen, Sie müssen sie immer noch selbst auflisten.

## 5.14.4. Installation zusätzlicher Dokumentation

Falls Ihre Software zusätzlich zu den üblichen Manualpages und Info-Seiten weitere Dokumentation hat und Sie diese für nützlich halten, dann installieren Sie sie unter ``PREFIX`/share/doc`. Dies kann wie vorstehend im Target des `post-install` geschehen.

Legen Sie ein neues Verzeichnis für Ihren Port an. Das Verzeichnis sollte wiederspiegeln, was der Port ist. Das bedeutet normalerweise `PORTNAME`. Wie auch immer, wenn Sie meinen, der Nutzer möchte verschiedene Versionen des Ports zur gleichen Zeit installiert haben, dann können Sie die gesamte Variable `PKGNAME` nutzen.

Machen Sie die Installation von der Variablen `NOPORTDOCS` abhängig, damit die Nutzer sie in `/etc/make.conf` abschalten können:

    post-install:
    .if !defined(NOPORTDOCS)
        ${MKDIR} ${DOCSDIR}
        ${INSTALL_MAN} ${WRKSRC}/docs/xvdocs.ps ${DOCSDIR}
    .endif

Hier einige praktische Variablen und wie sie standardmässig bei Verwendung im `Makefile` expandiert werden:

- `DATADIR` wird expandiert zu ``PREFIX`/share/`PORTNAME``.

- `DATADIR_REL` wird expandiert zu `share/`PORTNAME``.

- `DOCSDIR` wird expandiert zu ``PREFIX`/share/doc/`PORTNAME``.

- `DOCSDIR_REL` wird expandiert zu `share/doc/`PORTNAME``.

- `EXAMPLESDIR` wird expandiert zu ``PREFIX`/share/examples/`PORTNAME``.

- `EXAMPLESDIR_REL` wird expandiert zu `share/examples/`PORTNAME``.

> Anmerkung: `NOPORTDOCS` behandelt nur zusätzliche Dokumentation, die in `DOCSDIR` installiert ist. Für normale Manualpages und Info-Seiten wird die Variable benutzt. Dinge, welche in `DATADIR` und `EXAMPLESDIR` installiert werden, legen die Variablen `NOPORTDATA` und `NOPORTEXAMPLES` fest.

Die Variablen werden nach `PLIST_SUB` exportiert. Ihre Werte erscheinen dort als Pfadnamen relativ zu ``PREFIX``, falls möglich. Das bedeutet, dass `share/doc/`PORTNAME`` standardmässig ersetzt wird durch `%%DOCSDIR%%` in der Packliste usw. (mehr zur Ersetzung durch die `pkg-plist` finden Sie hier).

Alle installierten Dokumentationsdateien und –Verzeichnisse sollten in der `pkg-plist` dem `%%PORTDOCS%%`-Präfix enthalten sein, zum Beispiel:

    %%PORTDOCS%%%%DOCSDIR%%/AUTHORS
    %%PORTDOCS%%%%DOCSDIR%%/CONTACT
    %%PORTDOCS%%@dirrm %%DOCSDIR%%

Alternativ zur Auflistung der Dokumentationsdateien in der `pkg-plist` kann in einem Port auch die Variable `PORTDOCS` gesetzt werden für eine Liste von Dateien und Shell-Globs, um diese zur endgültigen Packliste hinzuzufügen. Die Namen werden relativ zur Variable `DOCSDIR` sein. Wenn Sie also einen Port haben, welcher `PORTDOCS` benutzt, und Sie haben eine vom Standard abweichenden Platz für seine Dokumentation, dann müssen Sie die Variable `DOCSDIR` entsprechend setzen. Wenn ein Verzeichnis in `PORTDOCS` aufgeführt ist, oder von einem Shell-Glob dieser Variable abgebildet wird, dann wird der komplette Verzeichnisbaum inklusive Dateien und Verzeichnissen in der endgültigen Packliste aufgenommen. Wenn die Variable `NOPORTDOCS` gesetzt ist, dann werden die Dateien und Verzeichnisse, die in `PORTDOCS` aufgelistet sind, nicht installiert und werden auch nicht zur Packliste des Ports hinzugefügt. Wie oben gezeigt bleibt es dem Port selbst überlassen, die Dokumentation in `PORTDOCS` zu installieren. Ein typisches Beispiel für den Gebrauch von `PORTDOCS` sieht wie folgt aus:

    PORTDOCS=       README.* ChangeLog docs/*

> Anmerkung: Die Äquivalente zu `PORTDOCS` für unter `DATADIR` und `EXAMPLESDIR` installierte Dateien sind `PORTDATA` beziehungsweise `PORTEXAMPLES`.

> Sie können auch `pkg-message` benutzen, um Meldungen während der Installation anzuzeigen. Lesen Sie diesen Abschnitt über den Gebrauch von `pkg-message` für weitere Details. Die `pkg-message`-Datei muss nicht zur `pkg-plist` hinzugefügt werden.

## 5.14.5. Unterverzeichnisse mit PREFIX

Lassen Sie den Port die Dateien in die richtigen Unterverzeichnisse von `PREFIX` verteilen. Einige Ports werfen alles in einen Topf und legen es im Unterverzeichnis mit dem Namen des Ports ab, was falsch ist. Ausserdem legen viele Ports alles ausser Binaries, Header-Dateien und Manualpages in ein Unterverzeichnis von `lib`, was natürlich auch nicht der BSD-Philosophie entspricht und nicht gut funktioniert. Viele der Dateien sollten in eines der folgenden Verzeichnisse geschoben werden: `etc` (Konfigurationsdateien), `libexec` (intern gestartete Binärdateien), `sbin` (Binärdateien für Superuser/Manager), `info` (Dokumentation für Info-Browser) oder `share` (Architektur-unabhängige Dateien). Lesen Sie hierzu hier(7); weitestgehend greifen die Regeln für `/usr` auch für `/usr/local`. Die Ausnahme sind Ports, welche mit ``news'' aus dem USENET arbeiten. In diesem Falle sollte ``PREFIX`/news` als Zielort für die Dateien benutzt werden.

Zurück | Zum Anfang | Weiter
Konfliktbehandlung | Nach oben | Besonderheiten

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