This is the Title of the Book, eMatter Edition
Copyright © 2005 O’Reilly & Associates, Inc. All rights reserved.
|
217
First
Max.
Linie
Max.
Linie
Kapitel 11
KAPITEL 11
Beispiele von Makefiles
Die in diesem Buch erarbeiteten Makefiles sind von professioneller Qualität. Sie können
diese Beispiele bedenkenlos in eigene Projekte übernehmen und werden damit selbst
fortgeschrittenen Ansprüchen gerecht. Trotzdem lohnt sich das Studium weiterer Bei-
spiele aus realen Projekten. Es ist durchaus interessant, wozu man
make missbrauchen
kann, wenn man unter dem Druck steht, ein Ergebnis liefern zu müssen. Darum wollen
wir nun einige Beispiele im Detail betrachten. Das erste Beispiel ist das Makefile, mit dem
dieses Buch erstellt wurde. Das zweite Beispiel ist das Makefile des Linux-Kernel 2.6.7.
Das Makefile dieses Buchs
Ein Buch über Programmierung zu schreiben fällt durchaus unter das Thema Software-
Aufbau und kann dabei eine recht interessante Erfahrung sein. Der Text des Buchs
besteht aus einer Reihe von Dateien, die verschiedenen Stufen der Vorbereitung unterlie-
gen. Die Beispiele sind echte Programme. Man sollte sie also zur Probe ausführen, ihre
Ausgabe sichern, eventuell nachbearbeiten und in den Haupttext einbinden. (Mit Cut-
and-Paste zu arbeiten wäre viel zu umständlich und vor allem viel zu unsicher.) Während
der Bearbeitung ist es hilfreich, den Text in verschiedenen Formaten ausgeben zu kön-
nen. Die letztendlich entstandenen Dateien sollte man vor der Auslieferung auch noch
irgendwie verpacken. Und natürlich muss das alles wiederholbar und gut zu warten sein.
Das klingt nach einem Fall für
make! Einer der Vorzüge dieses Programms ist eben, dass es
sich in derart verschiedenen Situationen einsetzen lässt. Dieses Buch wurde zum Beispiel
in DocBook (also einem XML-basierten Format) verfasst. Völlig analog lässt sich make
aber auch bei der Arbeit mit , oder troff einsetzen. Tatsächlich sind die
Benutzer dieser Programme fast immer auch mit
make vertraut.
Beispiel 11-1 zeigt das Makefile dieses Buchs. Es ist ungefähr 440 Zeilen lang. Grob glie-
dern lässt es sich in die folgenden Abschnitte:
Verwaltung der Beispiele
Vorverarbeitung der XML-Eingabedaten
T
E
XL
A
T
E
X
This is the Title of the Book, eMatter Edition
Copyright © 2005 O’Reilly & Associates, Inc. All rights reserved.
218
|
Kapitel11: Beispiele von Makefiles
Links
Max.
Linie
Max.
Linie
Generierung verschiedener Ausgabeformate
Validierung der Quelltexte
Grundlegende Wartungsfunktionen
Beispiel 11-1: Das Makefile dieses Buchs
# Bau das Buch!
#
# Die wichtigsten Ziele in dieser Datei sind:
#
# show_pdf Generiere PDF und starte einen PDF-Reader.
# pdf Generiere PDF.
# print Drucke PDF.
# show_html Generiere HTML und starte einen Browser.
# html Generiere HTML.
# xml Generiere XML.
# release Erstelle ein Tar-Archiv mit dem Release.
# clean Lösche alle generierten Dateien.
#
BOOK_DIR := /test/book
SOURCE_DIR := text
OUTPUT_DIR := out
EXAMPLES_DIR := examples
QUIET = @
SHELL = bash
AWK := awk
CP := cp
EGREP := egrep
HTML_VIEWER := cygstart
KILL := /bin/kill
M4 := m4
MV := mv
PDF_VIEWER := cygstart
RM := rm -f
MKDIR := mkdir -p
LNDIR := lndir
SED := sed
SORT := sort
TOUCH := touch
XMLTO := xmlto
XMLTO_FLAGS = -o $(OUTPUT_DIR) $(XML_VERBOSE)
process-pgm := bin/process-includes
make-depend := bin/make-depend
m4-macros := text/macros.m4
# $(call process-includes, input-file, output-file)
# Entferne Tabs, expandiere Makros und verarbeite Include-Anweisungen.
This is the Title of the Book, eMatter Edition
Copyright © 2005 O’Reilly & Associates, Inc. All rights reserved.
Das Makefile dieses Buchs
|
219
Rechts
Max.
Linie
Max.
Linie
define process-includes
expand $1 | \
$(M4) --prefix-builtins --include=text $(m4-macros) - | \
$(process-pgm) > $2
endef
# $(call file-exists, file-name)
# Liefert null, wenn eine Datei existiert, sonst nicht-null.
file-exists = $(wildcard $1)
# $(call maybe-mkdir, directory-name-opt)
# Erzeuge ein Verzeichnis, falls es nicht bereits existiert.
# Wenn directory-name-opt fehlt, nimm $@ als Verzeichnisnamen.
maybe-mkdir = $(if $(call file-exists, \
$(if $1,$1,$(dir $@))),, \
$(MKDIR) $(if $1,$1,$(dir $@)))
# $(kill-acroread)
# Beende den Acrobat Reader.
define kill-acroread
$(QUIET) ps -W | \
$(AWK) 'BEGIN { FIELDWIDTHS = "9 47 100" } \
/AcroRd32/ { \
print "Killing " $$3; \
system( "$(KILL) -f " $$1 ) \
}'
endef
# $(call source-to-output, file-name)
# Transformation eines Pfads aus dem Quelltextbaum in den Binärbaum.
define source-to-output
$(subst $(SOURCE_DIR),$(OUTPUT_DIR),$1)
endef
# $(call run-script-example, script-name, output-file)
# Aufruf eines Beispiel-Makefile.
define run-script-example
( cd $(dir $1); \
$(notdir $1) 2>&1 | \
if $(EGREP) --silent '\$$\(MAKE\)' [mM]akefile; \
then \
$(SED) -e 's/^++*/$$/'; \
else \
$(SED) -e 's/^++*/$$/' \
-e '/ing directory /d' \
-e 's/\[[0-9]\]//'; \
fi ) \
> $(TMP)/out.$$$$ & \
$(MV) $(TMP)/out.$$$$ $2
endef
Beispiel 11-1: Das Makefile dieses Buchs (Fortsetzung)

Get GNU make, 3rd Edition now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.