This is the Title of the Book, eMatter Edition
Copyright © 2005 O’Reilly & Associates, Inc. All rights reserved.
|
97
First
Max.
Linie
Max.
Linie
Kapitel 5
KAPITEL 5
Kommandos
Wir haben mittlerweile viele der grundsätzlichen Bestandteile der Kommandos von make
behandelt. Um sicherzugehen, dass wir auf dem gleichen Stand sind, wollen wir kurz
zurückschauen.
Kommandos sind letztendlich einzeilige Shell-Skripten. Eigentlich übergibt
make einfach
eine Zeile nach der anderen zur Ausführung an eine Subshell.
make kann diesen (relativ)
teuren fork/exec-Algorithmus optimieren, wenn sichergestellt ist, dass dadurch das Ver-
halten des Programms nicht verändert wird. Hierfür wird jede Kommandozeile nach
Shell-spezifischen Zeichen untersucht, beispielsweise Wildcard-Zeichen und E/A-Umlei-
tungen. Werden keine gefunden, führt
make das Kommando direkt aus, ohne es an eine
Subshell zu übergeben.
Standardmäßig wird die Verwendung von /bin/shr die Shell erzwungen. Welche Shell
tatsächlich benutzt wird, wird durch die
make-Variable SHELL kontrolliert, die allerdings
nicht von der Umgebung geerbt wird. Beim Start von
make werden sämtliche Umge-
bungsvariablen bis auf
SHELL als make-Variablen importiert. Das ist eine Vorsichtsmaß-
nahme, damit die vom Benutzer gewählte Shell nicht dazu führt, dass ein Makefile (das
womöglich als Teil eines Softwarepakets heruntergeladen wurde) nicht ausgeführt wer-
den kann. Wir werden im Abschnitt »Die richtige Shell« später in diesem Kapitel genauer
auf diese Thematik eingehen.
Parsen von Kommandos
Zeilen, die auf ein make-Ziel folgen und deren erstes Zeichen ein Tabulator ist, werden als
Shell-Kommandos angesehen (es sei denn, die vorangehende Zeile wird mit einem Back-
slash fortgesetzt). GNU make versucht bei der Behandlung von Tabulatorzeichen unter an-
deren Umständen möglichst schlau vorzugehen. Ist ein Missverständnis auszuschließen,
dürfen Tabulatorzeichen auch in Kommentaren, Variablenzuweisungen und include-An-
weisungen als erstes Zeichen verwendet werden. Findet
make eine Kommandozeile, die
nicht direkt auf ein Ziel folgt, wird eine Fehlermeldung ausgegeben:
makefile:20: *** commands commence before first target. Stop.
This is the Title of the Book, eMatter Edition
Copyright © 2005 O’Reilly & Associates, Inc. All rights reserved.
98
|
Kapitel 5: Kommandos
Links
Max.
Linie
Max.
Linie
Die Formulierung der Nachricht ist ein wenig seltsam, da sie oft mitten in einem Makefile
auftaucht, lange nachdem das »erste« Ziel definiert wurde. Das können wir jetzt aber
problemlos verstehen. Die Meldung könnte man besser formulieren als: »Kommando
ohne den Kontext eines Ziels gefunden.«
Findet der Parser ein Kommando im gültigen Kontext, schaltet er in den »Kommando-
parser«-Modus und baut das Skript zeilenweise auf. Findet der Parser eine Zeile, die
nicht Teil eines Kommandoskripts sein kann, schaltet er wieder in den »normalen«
Modus und hängt keine weiteren Zeilen mehr an. Folgende Dinge dürfen in einem Kom-
mandoskript vorkommen:
Zeilen, die mit einem Tabulatorzeichen beginnen, sind Kommandos und werden
von einer Subshell ausgeführt. Ist der »Kommandoparser«-Modus aktiviert, werden
selbst Zeilen als Kommandos behandelt, die normalerweise als
make-Konstrukte
interpretiert werden (z.B.
ifdef, Kommentare, include usw.).
Leere Zeilen werden ignoriert und nicht von einer Subshell »ausgeführt«.
Zeilen, die mit einem Doppelkreuz (
#), möglicherweise auch mit vorangestellten
Leerzeichen (aber keinen Tabulatoren), beginnen, sind Makefile-Kommentare und
werden ignoriert.
Bedingungsabhängige Verarbeitungsanweisungen wie ifdef und ifeq werden er-
kannt und in Kommandoskripten normal verarbeitet.
Eingebaute
make-Funktionen beenden den Kommandoparser-Modus, es sei denn, ihnen
steht ein Tabulatorzeichen voran. Die Funktionen müssen entweder zu gültigen Shell-
Kommandos oder zu nichts expandieren.
Die Tatsache, dass leere Zeilen und
make-Kommentare in Kommandoskripten erlaubt
sind, mag anfangs überraschen. Die folgenden Zeilen zeigen, wie das vor sich geht:
long-command:
@echo Line 2: A blank line follows
@echo Line 4: A shell comment follows
# A shell comment (leading tab)
@echo Line 6: A make comment follows
# A make comment, at the beginning of a line
@echo Line 8: Indented make comments follow
# A make comment, indented with leading spaces
# Another make comment, indented with leading spaces
@echo Line 11: A conditional follows
ifdef COMSPEC
@echo Running Windows
endif
@echo Line 15: A warning "command" follows
$(warning A warning)
@echo Line 17: An eval "command" follows
$(eval $(shell echo Shell echo 1>&2))
Auch wenn die Zeilen 5 und 10 identisch erscheinen, gibt es einen gren Unterschied.
Zeile 5 enthält einen Shell-Kommentar, der durch den vorangestellten Tabulator gekenn-

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.