MAKE-Regeln (explizite und implizite) und -Befehle

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu MAKE.EXE


Mit expliziten und impliziten Regeln wird gesteuert, wie MAKE die Zieldateien erstellt, die in der MAKE-Datei angegeben sind. Grundsätzlich gelten folgende Definitionen:

  • Explizite Regeln sind Anweisungen für bestimmte Dateien.
  • Implizite Regeln sind allgemeine Anweisungen für Dateien, für die es keine expliziten Regeln gibt.

Die Regeln haben folgendes Format:

Abhängigkeitszeile
      Befehlszeile

In der Abhängigkeitszeile gibt es eine unterschiedliche Syntax für explizite und implizite Regeln. In der Befehlszeile gilt dieselbe Syntax für beide Typen.

MAKE unterstützt mehrere Zeilen mit Abhängigkeiten für eine bestimmte Zieldatei. Eine einzige Zieldatei kann wiederum mehrere Befehlszeilen besitzen. Allerdings darf nur eine Zeile Befehle enthalten. Zum Beispiel:

Ziel1: Abhängigkeit1 abh2 abh3 abh4 abh5
Ziel1: abh6 abh7 abh8
    bcc32 -c $**

Syntax für explizite Regeln

Explizite Regeln sind Anweisungen, nach denen MAKE bestimme Zieldateien erstellt. In expliziten Regeln werden ein oder mehrere Ziele mit nachgestellten Doppelpunkten versehen. Ein einziger Doppelpunkt bedeutet, dass für die Ziele eine Regeln existiert, zwei Doppelpunkte bedeuten, dass es zwei oder mehr Regeln gibt.

Explizite Regeln verwenden die folgende Syntax:

<Ziel> [<Ziel>...]:[:][{<Pfad>}] [<Abhängigkeit[en]>...]
    [<Befehle>}
Element Beschreibung
<Ziel>

Bezeichnet den Namen und die Erweiterung der Datei, die erstellt werden soll. Das Ziel muss in der MAKE-Datei ganz am Anfang einer Zeile stehen (vor dem Zielnamen darf sich kein Leerzeichen oder Tabulator befinden). Mehrere Ziele werden durch Leerzeichen oder Tabulatoren getrennt. Außerdem kann ein Zielname nur einmal als Ziel in einer expliziten Regel verwendet werden.

<Pfad>

Ist eine Liste von Verzeichnissen, in denen die Quelldateien gesucht werden. Mehrere Verzeichnisse werden durch Semikolon getrennt. Die gesamte Pfadangabe wird in geschweifte Klammern gesetzt.

<Abhängigkeit>

Bezeichnet die Datei(en), deren Datum und Uhrzeit MAKE daraufhin überprüft, ob sie jünger sind als die Zieldatei. Jeder Quelldatei muss ein Leerzeichen voranstehen. Wenn eine Quelldatei an anderer Stelle in der MAKE-Datei als Ziel erscheint, aktualisiert bzw. erzeugt MAKE das Ziel, bevor die Quelldatei im eigentlichen Ziel verwendet wird (verkettete Abhängigkeitsprüfung).

<Befehle>

Sind beliebige Befehle, auch solche des Betriebssystems. Die Befehlszeile muss mit mindestens einem Leerzeichen oder Tabulator eingerückt werden, da sonst eine Interpretation als Ziel erfolgt. Mehrere Befehle werden durch Leerzeichen getrennt.


Wenn ein Zeilenwechsel erforderlich ist, kann als Fortsetzungszeichen ein Backslash (\) verwendet werden. Zum Beispiel:

MYSOURCE.EXE: FILE1.OBJ\      #Zeile mit Abhängigkeiten
   FILE3.OBJ                  #Fortsetzung
   bcc32 file1.obj file3.obj  #Befehlszeile

Einzelne Ziele mit mehreren Regeln

Zu einer einzelnen Zieldatei kann es mehrere Regeln geben. Dazu wird nach dem Namen der Zieldatei ein zweifacher Doppelpunkt gesetzt (::).

Das folgende Beispiel zeigt Ziele mit mehreren Regeln und Befehlen:

.cpp.obj:
   bcc32 -c -ncobj $<

.asm.obj:
   tasm /mx $<, asmobj\

mylib.lib :: f1.obj f2.obj #zweifacher Doppelpunkt für mehrere Regeln
   echo Adding C files
   tlib mylib -+cobjf1 -+cobjf2

mylib.lib :: f3.obj f4.obj
   echo Adding ASM files
   tlib mylib -+asmobjf3 -+asmobjf4

Syntax für implizite Regeln

Eine implizite Regel beinhaltet eine allgemeingültige Anweisung, wie MAKE bestimmte Dateien erstellen soll, die eine bestimmte Dateinamenserweiterung besitzen. Implizite Regeln beginnen entweder mit einem Pfad oder einem Punkt. Die Kernelemente sind Dateinamenserweiterungen, die durch Punkte getrennt sind. Die erste Erweiterung gehört zur Quelldatei, die zweite zum Ziel.

Wenn implizit festgelegte Quelldateien im Vergleich zur Zieldatei veraltet sind oder die Quelldateien nicht existieren, führt MAKE die Befehle aus, die der Regel zugeordnet sind. MAKE aktualisiert erst explizit definierte Quelldateien und dann implizit definierte.

Die Basis-Syntax für implizite Regeln lautet folgendermaßen:

[{<Quellverzeichnis>}].<Quellerweiterung>[{<Zielverzeichnis>}].<Zielerweiterung>:
    [<Befehle>]
Element Beschreibung
<Quellverzeichnis>

Legt das oder die Verzeichnisse fest, die die Quelldateien enthalten. Mehrere Verzeichnisse werden durch Semikolon getrennt.

.<Quellerweiterung>

Legt die Namenserweiterung der Quelldateien fest.

<Zielverzeichnis>

Legt das Verzeichnis fest, in dem MAKE die Zieldateien ablegt. Die implizite Regel wird nur für Zieldateien in diesem Verzeichnis verwendet. Wenn kein Zielverzeichnis angegeben ist, gilt diese Regel für Zieldateien aus beliebigen Verzeichnissen.

.<Zielerweiterung>

Legt die Namenserweiterung der Zieldateien fest. Makros sind hier zulässig.

: (Doppelpunkt)

Kennzeichnet das Ende der Zeile mit den Abhängigkeiten (Quelldateien).

<Befehle>

Sind beliebige Befehle, auch solche des Betriebssystems. Die Befehlszeile muss mit mindestens einem Leerzeichen oder Tabulator eingerückt werden, da sonst eine Interpretation als Ziel erfolgt.


Wenn zwei implizite Regeln für eine Zieldateinamenserweiterung vorhanden sind, aber keine Quelldatei existiert, verwendet MAKE die implizite Regel, die zuerst in der Liste .SUFFIXES steht.

Explizite Regeln mit impliziten Befehlen

Ein Ziel in einer expliziten Regel kann seine Befehlszeile von einer impliziten Regel übernehmen. Das nachstehende Beispiel zeigt eine implizite Regel, auf die eine explizite Regel ohne Befehlszeile folgt:

.c.obj:
    bcc32 -c $<    #Das Makro $< wird später beschrieben
myprog.obj:           #Diese explizite Regel verwendet den Befehl: bcc32 -c   
    myprog.c

Der Befehl der impliziten Regel weist MAKE an, MYPROG.C zu compilieren (das Makro $< ersetzt den Namen myprog.obj durch myprog.c).

MAKE-Befehlssyntax

Befehle stehen unmittelbar nach einer expliziten oder impliziten Regel und müssen in einer neuen Zeile mit einem Leerzeichen oder einem Tabulator beginnen. Es kann sich hier um beliebige Betriebssystembefehle aber auch um MAKE-Makros, Direktiven und spezielle Operatoren handeln, die das Betriebssystem nicht erkennt (das Zeichen | kann in Befehlen allerdings nicht verwendet werden).

Dazu einige Beispiele:

cd..
bcc32 -c mysource.c
COPY *.OBJ C:\PROJECTA
bcc32 -c $(SOURCE) #Makros werden unter "Makros" erklärt.

Für Befehle gilt folgende allgemeine Syntax:

[<Präfix>...] <Befehle>

Befehlspräfixe

Befehle in impliziten und expliziten Regeln können Präfixe besitzen, die steuern, wie MAKE die Befehle verarbeitet. Die folgende Tabelle enthält die möglichen Präfixe:

Präfix Beschreibung
@

Zeigt den Befehl während der Ausführung nicht an.

-<num>

Bricht die Befehlsverarbeitung ab, sobald der zurückgegebene Exit-Code den Wert des Integers num überschreitet. Normalerweise bricht MAKE ab, wenn der Exit-Code ungleich Null ist. Zwischen - und <num> ist kein Leerzeichen zulässig.

-

Setzt die Befehlsverarbeitung ohne Berücksichtigung des Exit-Codes fort.

&

Erweitert entweder das Makro $** (alle Quelldateien) oder das Makro $? (alle Quelldateien, die jünger als die Zieldatei sind). Führt den Befehl einmal für jede Quelldatei im erweiterten Makro aus.

!

Entspricht dem Präfix &.


Das Präfix @

Im folgenden Befehl wird das Präfix @ verwendet, das verhindert, dass MAKE den Befehl auf dem Bildschirm anzeigt.

diff.exe : diff.obj 
   @bcc32 diff.obj

Die Präfixe -<num> und -

Die Präfixe -<num> und - steuern das Vorgehen bei einem Fehler. Der MAKE-Prozess kann entweder fortgesetzt oder nach Erreichen einer bestimmten Fehleranzahl abgebrochen werden.

Im folgenden Beispiel wird die Verarbeitung fortgesetzt, wenn BCC32 einen Fehler zurückgibt:

target.exe : target.obj
target.obj : target.cpp
      -bcc32 -c target.cpp

Das Präfix &

Das Präfix & bewirkt die Ausführung eines Befehls für jede Quelldatei. Dies ist besonders praktisch bei Befehlen, die keine Dateiliste als Parameter akzeptieren. Zum Beispiel:

copyall : file1.cpp file2.cpp
    &copy $** c:\temp

COPY wird dann zweimal in folgender Form aufgerufen:

copy file1.cpp c:\temp
copy file2.cpp c:\temp

Ohne das Präfix & würde MAKE den Befehl COPY nur einmal aufrufen.

Hinweis: & funktioniert nur mit den Makros $** und $!.

MAKE-Befehlsoperatoren

Mit MAKE können beliebige Betriebssystembefehle und zusätzlich die folgenden Operatoren eingesetzt werden:

Operator Beschreibung
<

Liest die Eingabedaten für den Befehl aus einer Datei statt von der Standardeingabeeinheit.

>

Schreibt die Ausgabedaten des Befehls in eine Datei.

>>

Fügt die Ausgabedaten des Befehls am Ende einer Datei an.

<

Erzeugt eine temporäre Datei und benutzt deren Inhalt als Standardeingabe für den Befehl. Wenn -N angegeben ist, wird eine temporäre Response-Datei erzeugt. Hinweis: Dies gilt nur in Verbindung mit NMAKE von Microsoft.

&&

Erzeugt eine temporäre Response-Datei und fügt deren Namen in die MAKE-Datei ein.

<Begrenzer>

Verwenden Sie Begrenzungszeichen für temporäre Response-Dateien. Sie können ein beliebiges Zeichen außer # verwenden, das zusammen mit << und && als Beginn- und Endezeichen für eine temporäre Datei benutzt wird. Alle Zeichen in derselben Zeile, die dem Beginnzeichen unmittelbar folgen, werden ignoriert. Das Endezeichen muss allein in einer Zeile stehen.

Siehe auch