MAKE-Direktiven

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu MAKE.EXE

MAKE-Direktiven ähneln den Direktiven von Sprachen wie C und Pascal. Sie ermöglichen viele verschiedene Aktionen, wie zum Beispiel das Anzeigen von Befehlen vor der Ausführung auf dem Bildschirm. Eine MAKE-Direktive beginnt entweder mit einem Ausrufungszeichen oder mit einem Punkt. Direktiven haben Vorrang vor Befehlszeilenoptionen. Direktiven, die mit einem Ausrufungszeichen beginnen, müssen am Anfang einer neuen Zeile stehen.

MAKE-Direktiven und ihre Befehlszeilenoptionen

Die folgende Tabelle enthält alle MAKE-Direktiven und die korrespondierenden Befehlszeilenoptionen.

Direktive Option (sofern vorhanden) Beschreibung/Beispiel

.autodepend

-a

Aktiviert die automatische Abhängigkeitsprüfung.
Automatische Abhängigkeiten sind die Dateien, die automatisch in die zu erstellenden Ziele einbezogen werden (z.B. in Ihrem C++-Quelltext einbezogene Header-Dateien). Ist die Option .autodepend aktiviert, so prüft MAKE die Datums-/Uhrzeitangaben aller Dateien, die an der Erzeugung einer OBJ-Datei beteiligt sind, einschließlich der automatisch abhängigen Dateien. Wenn eine Datei auf neuerem Stand ist als die OBJ-Datei, so wird durch erneutes Compilieren eine aktuelle OBJ-Datei erzeugt. Sie können .autodepend (oder -a) anstelle der verketteten Abhängigkeitsprüfung verwenden.

.cacheautodepend

-c

Aktiviert die Zwischenspeicherung von Informationen zur Abhängigkeitsprüfung.

!cmdswitches

Verwendet die Zeichen + und -, um eine bestimmte Option zu aktivieren oder zu deaktivieren. Vor den Operatoren + und - müssen Leerzeichen oder Tabulatoren stehen. Zwischen den Operatoren und den Optionsbuchstaben darf dagegen nichts stehen.

!elif

Verhält sich wie else if in C.

!else

Verhält sich wie else in C.

!endif

Schließt eine !if, !ifdef oder !ifndef-Anweisung ab.

!error

Hält MAKE an und gibt eine Fehlermeldung aus. Die Syntax der Direktive !error lautet:
!error <Meldung>
Wenn MAKE auf diese Direktive trifft, wird die Ausführung angehalten und folgender String angezeigt:
Fatal makefile exit code: Error directive: <Meldung>
Die Direktive !error wird in bedingten Anweisungen eingesetzt, um die Verarbeitung abzubrechen und eine Meldung auszugeben. Ein Beispiel:

!if !$d(MYMACRO) #wenn MYMACRO nicht definiert ist 
!error MYMACRO ist nicht definiert
!endif

Wenn MYMACRO nicht definiert ist, beendet MAKE die Ausführung und erzeugt folgende Ausgabe:
Fatal makefile 4: Error directive: MYMACRO ist nicht definiert
Fehlerprüfung steuern:
MAKE bietet vier Optionen, um die Fehlerprüfung zu steuern:

  • Die Direktive .ignore deaktiviert die Fehlerprüfung für einen bestimmten Teil der MAKE-Datei.
  • Die Befehlszeilenoption -i deaktiviert die Fehlerprüfung für die gesamte Datei.
  • Das Präfix -num wird als Teil einer Regel eingegeben und beeinflusst die Fehlerprüfung für den zugehörigen Befehl so, dass nur ein Exit-Code zum Abbruch führt, der größer als die vorgegebene Zahl ist.
  • Das Befehlspräfix - deaktiviert die Fehlerprüfung für den zugehörigen Befehl unabhängig vom Exit-Code.

!if

Steht am Beginn einer Bedingungsanweisung.

!ifdef

Verhält sich wie #ifdef in C und prüft, ob ein Makro definiert ist.

!ifndef

Verhält sich wie #ifndef in C und prüft, ob ein Makro nicht definiert ist.

.ignore

-i

Ignoriert den Rückgabewert eines Befehls.

.keep

-K

Behält temporäre Dateien bei (normalerweise werden sie von MAKE gelöscht).

!include

Verhält sich wie #include in C, gibt eine Datei an, die in die MAKE-Datei einbezogen werden soll. Diese Direktive verhält sich wie die Präprozessor-Direktive für die C- oder C++-Sprache. Sie ermöglicht Ihnen den Text einer anderen Datei in der MAKE-Datei einzuschließen:
!include <Dateiname>
Sie können den Dateinamen zwischen Anführungszeichen (" ") oder spitze Klammern (< >) einschließen und Direktiven beliebig tief geschachteln, aber das Schreiben von doppelten !include-Direktiven in einer MAKE-Datei wird nicht erlaubt (Sie werden den Zyklus von Fehlermeldungen in der Include-Datei erhalten).
Die Regeln, Befehle oder Direktiven müssen innerhalb einer einzigen Quelltextdatei abgeschloßen werden. Es ist nicht möglich einen Befehl in einer !include-Datei zu starten und ihn in der MAKE-Datei zu beenden. MAKE sucht nach !include-Datein im aktuellen Verzeichnis falls Sie einen anderen Verzeichnis mit der -I-Befehlszeilenoption nicht angegeben haben.

.keep

-K

Beibehält die temporären Dateien, die von MAKE erzeugt wurden (sie werden normalerweise von MAKE gelöscht.)

!message

Gibt eine Meldung an stdout aus, während die MAKE-Datei verarbeitet wird.
Die Direktive !message dient dazu, während der Abarbeitung einer MAKE-Datei Meldungen auf dem Bildschirm auszugeben. Solche Meldungen können hilfreich sein, wenn eine MAKE-Datei nicht wie gewünscht arbeitet und Sie den Fehler suchen müssen. Wenn Sie zum Beispiel Probleme mit einer Makrodefinition haben, nehmen Sie folgende Zeile in Ihre MAKE-Datei auf:

!message Das Makro ist hier definiert als: $(MakroName)

Wenn MAKE diese Zeile abarbeitet, erscheint auf dem Bildschirm folgende Meldung (wenn die Makroerweiterung den String .CPP ergibt):
Das Makro ist hier definiert als: CPP

.noautodepend

-a-

Deaktiviert die automatische Abhängigkeitsprüfung.

.nocacheautodepend

-c-

Deaktiviert die Zwischenspeicherung von Informationen zur Abhängigkeitsprüfung.

.noIgnore

-i-

Deaktiviert .Ignore.

.nokeep

-K-

Löscht die temporären Dateien, die von MAKE erzeugt wurden.

.nosilent

-s-

Zeigt Befehle vor der Ausführung durch MAKE an.

.noswap

-S-

Lagert MAKE nicht aus dem Speicher aus, bevor ein Befehl ausgeführt wird.

.path.ext

Teilt MAKE mit, nach Dateien mit der Erweiterung .ext in den Verzeichnissen des Suchpfades zu suchen. Im folgenden Beispiel wird MAKE angewiesen, nach Dateien mit der Erweiterung .c in den Verzeichnissen C:\SOURCE und C:\CFILES und nach Dateien mit der Erweiterung .obj im Verzeichnis C:\OBJS zu suchen.
.path.c = C:\CSOURCE;C:\CFILES
.path.obj = C:\OBJS

.precious

Speichert die Zieldatei(en) auch dann, wenn der Build-Vorgang fehlschlägt.
Wenn MAKE eine Datei nicht korrekt und vollständig erstellen kann, wird sie gelöscht. Die Direktive .precious verhindert das Löschen. Erforderlich ist diese Möglichkeit für bestimmte Arten von Zieldateien (z.B. Bibliotheken). Wenn beispielsweise ein Modul nicht zur Bibliothek hinzugefügt werden kann, möchten Sie wahrscheinlich nicht, dass die gesamte Bibliothek gelöscht wird. Die Syntax für .precious lautet:
.precious: <Ziel> [<Ziel>...]

.silent

-s

Führt Befehle aus, ohne Sie zuerst auszugeben.

.suffixes

Legt die implizite Regel für mehrdeutige Abhängigkeiten fest.
Die Direktive .suffixes bestimmt die Reihenfolge (nach Dateinamenserweiterungen), in der MAKE implizite Regeln erstellt. Die Syntax von .suffixes lautet folgendermaßen:
.suffixes: .<Erw> [.<Erw> ...]
<Erw> steht für die Namenserweiterung der Quelldateien, die Sie in Ihren impliziten Regeln angegeben haben.
So weist beispielsweise die Direktive
.suffixes: .asm .c .cpp
MAKE an, bei der Auswertung von impliziten Regeln nicht zu berücksichtigen, in welcher Reihenfolge sie in der MAKE-Datei stehen. Stattdessen soll MAKE mit denjenigen Regeln beginnen, die eine Abhängigkeit von ASM-Dateien beschreiben, dann von C-Dateien und schließlich von CPP-Dateien. Das folgende Beispiel zeigt eine MAKE-Datei mit einer .suffixes-Direktive, die MAKE veranlasst, zuerst nach einer Quelltextdatei mit der Erweiterung ASM, dann nach einer solchen mit der Erweiterung C und schließlich mit der Erweiterung CPP zu suchen. Falls MAKE die Datei MYPROG.ASM findet, so erzeugt es durch einen Aufruf von TASM die Datei MYPROG.OBJ. MAKE ruft dann ILINK auf. Andernfalls sucht MAKE nach der Datei MYPROG.C, um daraus MYPROG.OBJ zu erzeugen usw.

.suffixes: .asm .c .cpp
myprog.exe: myprog.obj
bcc32 myprog.obj
.cpp.obj:
bcc32 -P -c $<
.asm.obj:
tasm /mx $
.c.obj:
bcc32 -P- -c $<

.swap

-S

Lagert MAKE aus dem Speicher aus, bevor ein Befehl ausgeführt wird.

!undef

Löscht die Definition eines Makros. Das Makro ist dann nicht definiert.
!undef (undefiniert) bewirkt, dass ein Test von
!ifdef MacroName fehlschlägt.
Die Syntax der Direktive !undef lautet:
!undef MacroName


Makros in Direktiven

Das Makro $d kann zusammen mit der Bedingungsdirektive !if verwendet werden, um gewisse Aktionen nur dann durchzuführen, falls ein bestimmtes Makro definiert ist. Hinter $d muss ein in runde oder geschweifte Klammern gesetzter Makroname stehen. Dazu folgendes Beispiel:

!if $d(DEBUG)            #Wenn DEBUG definiert ist,
bcc32 -v f1.cpp f2.cpp   #mit Debug-Informationen compilieren
!else                    #Ansonsten
bcc32 -v- f1.cpp f2.cpp   #keine Debug-Informationen einbeziehen.
!endif

Leere Makros

Während ein undefinierter Makroname bewirkt, dass ein Test von
!ifdef MacroName false zurückgibt, wird ein als leer definierter MacroName true zurückgeben. Ein leeres Makro kann definiert werden, indem das Geliechheitszeichen (=) in der Definition des Makros entweder von Leerzeichen oder von ein Rückgabezeichen gefolgt wird. Das folgende Beispiel definiert ein leeres Makro in einer MAKE-Datei:

NULLMACRO =

Ein leeres Makro kann auch in der MAKE-Befehlszeile definiert werden, und zwar mit einer der folgenden Angaben:

NULLMACRO ="" 
-DNULLMACRO

!if und andere Bedingungsdirektiven

Die Direktive !if arbeitet ähnlich wie die if-Anweisungen der Sprache C. Die Syntax aller Bedingungsdirektiven ist ähnlich aufgebaut:

!if Bedingung

!if Bedingung

!if Bedingung

!ifdef Makro

!endif

!else

!elif Bedingung

!endif

!endif

!endif


Die folgenden Ausdrücke sind gleichbedeutend:

!ifdef Makro und !if $d(Makro) 
ifndef Makro und !if !$d(Makro) 

Es gelten folgende Regeln:

  • Zwischen den Direktiven !if, !ifdef oder !ifndef einerseits und der zugehörigen Direktive !endif andererseits darf nur maximal eine !else-Direktive stehen.
  • Zwischen den Direktiven !if, !ifdef, !ifndef oder !else einerseits und der zugehörigen Direktive !endif andererseits dürfen beliebige viele !elif-Direktiven stehen.
  • Eine Regel darf nicht über Zweige von Bedingungsdirektiven hinweg aufgespalten werden.
  • Bedingungsdirektiven dürfen verschachtelt werden.
  • Die zu der Direktive !if, !ifdef oder !ifndef gehörende !endif-Direktive muss in derselben Datei stehen.

Zwischen den Direktiven !if und !endif darf Folgendes stehen:

  • Makrodefinitionen
  • Explizite Regeln
  • Implizite Regeln
  • Include-Direktive
  •  !error-Direktive
  •  !undef-Direktive

In einer if-Anweisung besteht ein Bedingungsausdruck aus dezimalen, oktalen oder hexadezimalen Konstanten sowie den Operatoren der folgenden Tabelle.

Operator Beschreibung Operator Beschreibung

-

Negation

?:

Bedingungsausdruck

~

Bit-Komplement

!

Logisches NICHT

+

Addition

>>

Rechtsschieben

-

Subtraktion

<<

Linksschieben

*

Multiplikation

&

Bitweises UND

/

Division

|

Bitweises ODER

%

Rest

^

Bitweises EXKLUSIVES ODER

&&

Logisches UND

>+

Größer oder gleich *

||

Logisches ODER

<+

Kleiner oder gleich *

>

Größer als

==

Gleichheit *

<

Kleiner als

!=

Ungleichheit *

Der Operator * ist auch auf String-Ausdrücke anwendbar.

MAKE wertet jeden Bedingungsausdruck so aus, dass das Ergebnis entweder eine einfache, vorzeichenbehaftete 32-Bit-Ganzzahl oder ein String ist.

Siehe auch