MAKE-Makros
Nach oben zu MAKE.EXE
Ein Makro ist eine Variable, die von MAKE zu einem String erweitert wird, wenn MAKE in einer MAKE-Datei auf das Makro trifft. Beispielsweise können Sie ein Makro LIBNAME
definieren, das den String mylib.lib
repräsentiert. Dazu geben Sie die Zeile
LIBNAME = mylib.lib
am Anfang der MAKE-Datei ein. Wenn MAKE später auf das Makro $(LIBNAME)
trifft, wird stattdessen der String mylib.lib
eingesetzt. Mit Makros lassen sich Dateivorlagen erstellen, die dann jeweils projektspezifisch angepasst werden können.
Um ein Makro in einer MAKE-Datei zu verwenden, geben Sie $(MacroName)
ein, wobei MacroName
ein definiertes Makro sein muss. MacroName
kann in geschweifte oder runde Klammern eingeschlossen werden.
MAKE erweitert Makros zu verschiedenen Zeitpunkten, und zwar abhängig davon, wo sie in der MAKE-Datei stehen:
- Verschachtelte Makros werden erweitert, sobald das umschließende Makro aufgerufen wird.
- Makros in Regeln und Direktiven werden erweitert, sobald MAKE die MAKE-Datei zum ersten Mal öffnet.
- Makros in Befehlen werden erweitert, wenn der Befehl ausgeführt wird.
Wenn MAKE ein nicht definiertes Makro in einer MAKE-Datei findet, wird nach einer Umgebungsvariablen mit diesem Namen gesucht (normalerweise mit SET definiert) und entsprechend der Zuweisung erweitert. Wenn beispielsweise der Eintrag $(PATH)
in einer MAKE-Datei enthalten ist, ohne dass es ein solches Makro gibt, verwendet MAKE den Text, der in Ihrer Datei AUTOEXEC.BAT der Umgebungsvariablen PATH zugewiesen wurde. In der Dokumentation Ihres Betriebssystems finden Sie Details zu Umgebungsvariablen.
Inhaltsverzeichnis
Syntax
<MakroName> = <Erweiterungstext>
Element | Beschreibung |
---|---|
<MakroName> |
Berücksichtigt die Groß- und Kleinschreibung ( |
<Erweiterungstext> |
Ist begrenzt auf 4096 Zeichen. Dabei sind Buchstaben, Ziffern, Interpunktionszeichen und Leerzeichen erlaubt. |
Jedes Makro muss in einer eigenen Zeile der MAKE-Datei definiert werden und jede Makrodefinition muss mit dem ersten Zeichen der Zeile beginnen. Normalerweise setzt man die Makrodefinitionen an den Anfang der MAKE-Datei. Wenn MAKE mehr als eine Definition für MakroName findet, so ersetzt die neue Definition die alte.
Makros lassen sich auch mit Hilfe der Befehlszeilenoption -D
definieren. Vor oder nach dem Gleichheitszeichen (=
) darf kein Leerzeichen stehen. Es kann auch mehr als ein Makro definiert werden, die einzelnen Makros werden dabei durch Leerzeichen getrennt. Die folgenden Beispiele zeigen, wie Makros in der Befehlszeile definiert werden:
make -Dsourcedir=c:\projecta make -Dcommand="bcc32 -c" make -Dcommand=bcc32 option=-c
Hinweis: Makros, die in MAKE-Dateien definiert sind überschreiben solche, die in der Befehlszeile definiert werden.
String-Ersetzungen in MAKE-Makros
MAKE ermöglicht es, in einem zuvor definierten Makro einige Zeichen zeitweilig durch andere zu ersetzen. In dem Makro:
SOURCE = f1.cpp f2.cpp f3.cpp
können Sie beispielsweise die Zeichen .cpp durch die Zeichen .obj ersetzen. Der Befehl dazu lautet:
$(SOURCE:.cpp=.obj)
Diese Ersetzung definiert das Makro nicht neu.
Regeln für Ersetzungen in Makros:
- Syntax:
$(MakroName:Originaltext=Neuer_Text)
. - Keine Leerzeichen vor oder nach dem Doppelpunkt.
- Die Zeichen im Parameter
Originaltext
müssen exakt mit denen in der Makrodefinition übereinstimmen. Groß- und Kleinschreibung wird berücksichtigt.
Makros können auch innerhalb von Ersetzungsmakros verwendet werden. Zum Beispiel:
MYEXT=.C SOURCE=f1.cpp f2.cpp f3.cpp $(SOURCE:.cpp=$(MYEXT)) #ändert 'f1.cpp' in 'f1.C', etc.
Das Caret-Zeichen (^
) bewirkt, dass MAKE das nächste Zeichen buchstäblich interpretiert. Dies lässt sich zum Einfügen eines Wagenrücklaufzeichens verwenden. Zum Beispiel:
MYEXT=.C SOURCE=f1.cpp f2.cpp f3.cpp ($(SOURCE):.cpp=$(MYEXT)^ ) # ändert 'f1.cpp f2.cpp f3.cpp' in: # f1.C # f2.C # f3.C
Das Caret-Zeichen (^
) teilt MAKE hier mit, dass jedes Vorkommen von .cpp
in .C
gefolgt von einem Wagenrücklaufzeichen geändert werden soll.
Dies lässt sich zum Anlegen von expliziten Regeln verwenden, die Response-Dateien für TLIB.EXE erzeugen.
myfile.lib: file1.obj file2.obj file3.obj TLIB $@ @&&! +-$(**: = &^ +-) !
MAKE ersetzt hier alle Leerzeichen in der Liste der abhängigen Dateien durch ein Leerzeichen, gefolgt von einem Ampersand (&
), einem Wagenrücklaufzeichen und den Zeichen +-
. Die daraus resultierende Response-Datei sieht folgendermaßen aus:
+-file1.obj & +-file2.obj & +-file3.obj & +-
Vordefinierte MAKE-Makros
MAKE umfasst mehrere vordefinierte Makros, die Sie in Ihren MAKE-Dateien einsetzen können. Die folgende Tabelle enthält die Makrodefinitionen und das Ergebnis einer Erweiterung bei expliziten und impliziten Regeln.
Makro | Bei impliziter Regel | Bei expliziter Regel |
---|---|---|
$* |
Pfad\Quelldatei |
Pfad\Zieldatei |
$< |
Pfad\Quelldatei+Erw. |
Pfad\Zieldatei+Erw. |
$: |
Pfad für Quelldateien |
Pfad für Zieldateien |
$. |
Quelldatei+Erw. |
Zieldatei + Erw. |
$& |
Quelldatei |
Zieldatei |
$** |
Pfad\Quelldatei+Erw. |
Alle Quelldateien+Erw. |
$? |
Pfad\Quelldatei+Erw. |
Veraltete Quelldateien |
Makro | Erweitert zu | Bemerkung |
---|---|---|
_ _MSDOS_ _ |
1 |
Falls MAKE unter DOS läuft |
_ _MAKE_ _ |
0x0370 |
Hexadezimale MAKE-Versionsnummer |
MAKE |
make |
Name der ausführbaren Datei von MAKE |
MAKEFLAGS |
Optionen |
Optionen der Befehlszeile |
MAKEDIR |
Verzeichnis |
Verzeichnis, in dem MAKE.EXE gespeichert ist |
Vordefinierte MAKE-Makros verändern
Wenn kein vordefiniertes Makros genau den gewünschten String liefert, können Sie mit Makro-Modifizierern Teile eines Strings extrahieren. Diese Modifizierer werden normalerweise mit $<
oder $@
verwendet.
Die Syntax zum Ändern eines vordefinierten Makros lautet:
$(MakroName [Modifizierer])
Die folgende Tabelle enthält die Modifizierer und führt Verwendungsbeispiele dazu auf.
Modifizierer | Erweiterung enthält | Beispiel | Ergebnis |
---|---|---|---|
D |
Laufwerk und Verzeichnis |
$(<D) |
C:\PROJECTA\ |
F |
Dateiname und Erweiterung |
$(<F) |
MYSOURCE.C |
B |
Nur Dateiname |
$(<B) |
MYSOURCE |
R |
Laufwerk, Verzeichnis und Dateiname |
$(<R) |
C:\PROJA\SOURCE |