Die Fibel für neue Mitarbeiter des FreeBSD-Dokumentationsprojekts
Zurück | Kapitel 7. Die Erzeugung der Zieldokumente | Weiter

# 7.3. Make-Includes des FreeBSD Documentation Projects

Diese Dateien lassen sich am besten verstehen, indem man sich deren Inhalt näher ansieht. Konkret handelt es sich dabei um folgende Dateien:

- `doc.project.mk` ist die Haupt-Include-Datei, die bei Bedarf alle folgenden Include-Dateien enthält.

- `doc.subdir.mk` sorgt dafür, dass alle benötigten Verzeichnisse (und Unterverzeichnisse) beim Bau der Dokumentation durchlaufen werden.

- `doc.install.mk` definiert Variablen, die die Installation der Dokumentation beeinflussen.

- `doc.docbook.mk` wird verwendet, wenn die Variable `DOCFORMAT` den Wert `docbook` hat und und die Variable `DOC` gesetzt ist.

## 7.3.1. `doc.project.mk`

Diese Datei hat folgenden Aufbau:

    DOCFORMAT?=	docbook
    MAINTAINER?=	doc@FreeBSD.org

    PREFIX?=	/usr/local
    PRI_LANG?=	en_US.ISO8859-1

    .if defined(DOC)
    .if ${DOCFORMAT} == "docbook"
    .include "doc.docbook.mk"
    .endif
    .endif

    .include "doc.subdir.mk"
    .include "doc.install.mk"

### 7.3.1.1. Variablen

`DOCFORMAT` und `MAINTAINER` enthalten Standardwerte, falls ihnen über das Dokument-Makefile keine anderen Werte zugewiesen werden.

Bei `PREFIX` handelt es sich um das Präfix, unter dem die zum Bau der Dokumentation erforderlichen SGML-Werkzeuge installiert sind. In der Regel handelt es sich dabei um `/usr/local`.

`PRI_LANG` sollte auf die Sprache und Kodierung eingestellt werden, die unter den Leser der Dokumentation am häufigsten verwendet wird. Diese Variable hat den Standardwert "US English".

> Anmerkung: `PRI_LANG` beeinflusst in keinster Weise, welche Dokumente gebaut werden können oder sollen. Diese Variable wird lediglich dazu verwendet, häufig verwendete Dokumente in das Wurzelverzeichnis der installierten Dokumentation zu verlinken.

### 7.3.1.2. Bedingungen

Die Zeile `.if defined(DOC)` ist ein Beispiel für eine make-Bedingung, die (analog zum Einsatz in anderen Programmen) festlegt, was geschehen soll, wenn eine Bedingung "wahr" oder "falsch" ist. `defined` ist eine Funktion, die zurückgibt, ob die angegebene Variable existiert oder nicht.

`.if ${DOCFORMAT} == "docbook"` testet, ob die Variable `DOCFORMAT` den Wert `"docbook"` hat. Ist dies der Fall, wird `doc.docbook.mk` mit in den Bau aufgenommen.

Die zwei `.endif`s schließen die zwei weiter oben definierten Bedingungen.

## 7.3.2. `doc.subdir.mk`

Den Inhalt dieser Datei hier zu beschreiben, würde zu weit führen. Sie sollten aber nach dem Lesen der vorangegangenen Abschnitte und der folgenden Ausführungen in der Lage sein, Inhalt und Aufgabe dieser Datei zu verstehen.

### 7.3.2.1. Variablen

- `SUBDIR` legt die Unterverzeichnisse fest, deren Inhalt beim Bau der Dokumentation inkludiert werden muss.

- Mit `ROOT_SYMLINKS` wird der Name der Verzeichnisse angegeben, die von ihrer tatsächlichen Position aus in das Wurzelverzeichnis, unter dem die Dokumentation installiert wird, verlinkt werden sollen. Vorausgesetzt, bei der verwendeten Sprache handelt es sich um die primäre Sprache (die über `PRI_LANG` festgelegt wird).

- `COMPAT_SYMLINK` wird im Abschnitt Unterverzeichnis-Makefiles beschrieben.

### 7.3.2.2. Targets und Makros

Abhängigkeiten (Dependencies) werden folgendermaßen definiert: ``target` `abhaengigkeit1 abhaengigkeit2 ...``. Um `target` zu bauen, müssen Sie zuvor die angegebenen Abhängigkeiten bauen.

Daran anschließend können Anweisungen zum Bau des angegebenen Targets folgen, falls der Konvertierungsprozess zwischen dem Target und seinen Abhängigkeiten nicht bereits früher definiert wurde oder falls die Konvertierung nicht der Standardkonvertierungsmethode entspricht.

Die spezielle Abhängigkeit `.USE` definiert das Äquivalent eines Makros.

    _SUBDIRUSE: .USE
    .for entry in ${SUBDIR}
    	@${ECHO} "===> ${DIRPRFX}${entry}"
    	@(cd ${.CURDIR}/${entry} && \
    	${MAKE} ${.TARGET:S/realpackage/package/:S/realinstall/install/} DIRPRFX=${DIRPRFX}${entry}/ )
    .endfor

In diesem Beispiel kann `_SUBDIRUSE` nun als Makro, welches die angegebenen Befehle ausführt, verwendet werden, indem es im Makefile als Abhängigkeit angegeben wird.

Was unterscheidet dieses Makro nun von beliebigen anderen Targets? Der Hauptunterschied ist, dass es nach den Anweisungen der Bauprozedur, in der es als Abhängigkeit angegeben ist, ausgeführt wird. Außerdem ändert es die Variable `.TARGET` (die den Namen des aktuell gebauten Targets enthält) nicht.

    clean: _SUBDIRUSE
    	rm -f ${CLEANFILES}

In diesem Beispiel führt `clean` das Makro `_SUBDIRUSE` aus, nachdem es den Befehl `rm -f ${CLEANFILES}` erfolgreich ausgeführt hat. Dadurch löscht `clean` zwar beim Wechsel in ein neues Unterverzeichnis beim Bau erstellte Dateien, aber nicht beim Wechsel aus einem Unterverzeichnis in ein übergeordnetes Verzeichnis.

#### 7.3.2.2.1. Vorhandene Targets

- `install` und `package` arbeiten nacheinander alle Unterverzeichnisse ab und rufen dabei jeweils ihre realen Versionen (`realinstall` beziehungsweise `realpackage`) auf.

- `clean` entfernt alle Dateien, die beim Bau der Dokumentation erzeugt wurden (dies sowohl im aktuellen Verzeichnis als auch in allen Unterverzeichnissen). `cleandir` hat die gleiche Aufgabe, würde aber zusätzlich die Objekt-Verzeichnisse löschen (falls diese existieren).

### 7.3.2.3. Weitere Bedingungen

- `exists` gibt "wahr" zurück, wenn wenn die angegebene Datei bereits existiert.

- `empty` gibt "wahr" zurück, wenn die angegebene Variable leer ist.

- `target` gibt "wahr" zurück, wenn das angegebene Target noch nicht existiert.

### 7.3.2.4. Schleifenkonstrukte in `make (.for)`

`.for` erlaubt es, bestimmte Anweisungen für jedes Element einer Variable zu wiederholen, indem dieser Variable in jedem Durchlauf der Schleife das jeweilige Element der untersuchten Liste zugewiesen wird.

    _SUBDIRUSE: .USE
    .for entry in ${SUBDIR}
    	@${ECHO} "===> ${DIRPRFX}${entry}"
    	@(cd ${.CURDIR}/${entry} && \
    	${MAKE} ${.TARGET:S/realpackage/package/:S/realinstall/install/} DIRPRFX=${DIRPRFX}${entry}/ )
    .endfor

Falls das Verzeichnis `SUBDIR` leer ist, würde in unserem Beispiel keine Aktion erfolgen. Enthält das Verzeichnis hingegen ein oder mehrere Elemente, werden die Anweisungen zwischen `.for` und `.endfor` für jedes Element ausgeführt, wobei `entry` durch das jeweilige Element ersetzt werden würde.

Zurück | Zum Anfang | Weiter
Die `Makefile`s des Dokumentationsbaums verstehen | Nach oben | Die Webseite

Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an <de-bsd-questions@de.FreeBSD.org>.
Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an <de-bsd-translators@de.FreeBSD.org>.