Beschreibungsblöcke

Beschreibungsblöcke bilden den Kern einer Makefile. Sie beschreiben die Ziele oder Dateien, die erstellt werden sollen, und deren Abhängigkeiten die Dateien, die zum Erstellen der Ziele erforderlich sind. Ein Beschreibungsblock kann Befehle enthalten, die beschreiben, wie die Ziele aus den Abhängigkeiten erstellt werden. Ein Beschreibungsblock ist eine Abhängigkeitslinie, optional gefolgt von einem Befehlsblock:

targets... : dependents...
    commands...

Abhängigkeitslinien

Eine Abhängigkeitslinie gibt ein oder mehrere Ziele und null oder mehr abhängige Ziele an. Wenn ein Ziel nicht vorhanden ist oder einen früheren Zeitstempel als ein abhängiger Zeitstempel aufweist, führt NMAKE die Befehle im Befehlsblock aus. NMAKE führt auch den Befehlsblock aus, wenn das Ziel ein Pseudotarget ist. Hier ist eine Beispielabhängigkeitslinie:

hi_bye.exe : hello.obj goodbye.obj helper.lib

In dieser Abhängigkeitslinie hi_bye.exe ist das Ziel. Seine Abhängigkeiten sind hello.obj, goodbye.objund helper.lib. Die Abhängigkeitslinie weist NMAKE an, das Ziel immer dann zu erstellen, wenn hello.obj, goodbye.objoder helper.lib hat sich kürzlich geändert als hi_bye.exe.

Ein Ziel muss am Anfang der Zeile stehen. Er kann nicht mit Leerzeichen oder Registerkarten eingezogen werden. Verwenden Sie einen Doppelpunkt (:), um Ziele von Abhängigen zu trennen. Leerzeichen oder Tabstopps sind zwischen Zielen, dem Doppelpunkttrennzeichen (:) und nachfolgern zulässig. Um die Abhängigkeitslinie aufzuteilen, verwenden Sie einen umgekehrten Schrägstrich (\) nach einem Ziel oder abhängigen.

Bevor Befehlsblöcke ausgeführt werden, überprüft NMAKE alle Abhängigkeiten und alle anwendbaren Ableitungsregeln, um eine Abhängigkeitsstruktur zu erstellen. Eine Abhängigkeitsstruktur gibt die Schritte an, die erforderlich sind, um das Ziel vollständig zu aktualisieren. NMAKE überprüft rekursiv, ob ein abhängiges Element selbst ein Ziel in einer anderen Abhängigkeitsliste ist. Nachdem die Abhängigkeitsstruktur erstellt wurde, überprüft NMAKE Zeitstempel. Wenn abhängige Elemente in der Struktur neuer als das Ziel sind, erstellt NMAKE das Ziel.

Targets

Der Zielabschnitt einer Abhängigkeitslinie gibt mindestens ein Ziel an. Ein Ziel kann ein beliebiger gültiger Dateiname, Verzeichnisname oder Pseudotarget sein. Trennen Sie mehrere Ziele mithilfe eines oder mehrerer Leerzeichen oder Registerkarten. Bei Zielen wird die Groß-/Kleinschreibung nicht beachtet. Pfade sind mit Dateinamen zulässig. Ein Ziel und sein Pfad dürfen 256 Zeichen nicht überschreiten. Wenn das vor dem Doppelpunkt vorangehende Ziel ein einzelnes Zeichen ist, verwenden Sie ein getrenntes Leerzeichen. Andernfalls interpretiert NMAKE die Kombination aus Buchstaben-Doppelpunkt als Laufwerksbezeichner.

Mehrere Ziele

NMAKE wertet mehrere Ziele in einer einzelnen Abhängigkeit aus, als ob jede in einem separaten Beschreibungsblock angegeben wurde.

Beispiel: Diese Regel:

bounce.exe leap.exe : jump.obj
   echo Building...

wird ausgewertet als:

bounce.exe : jump.obj
   echo Building...

leap.exe : jump.obj
   echo Building...

Kumulative Abhängigkeiten

Abhängigkeiten sind in einem Beschreibungsblock kumulativ, wenn ein Ziel wiederholt wird.

Beispielsweise diese Regelsatz,

bounce.exe : jump.obj
bounce.exe : up.obj
   echo Building bounce.exe...

wird ausgewertet als:

bounce.exe : jump.obj up.obj
   echo Building bounce.exe...

Wenn Mehrere Ziele in mehreren Abhängigkeitszeilen in einem einzelnen Beschreibungsblock vorhanden sind, wertet NMAKE diese aus, als ob sie in einem separaten Beschreibungsblock angegeben wurden. Allerdings verwenden nur Ziele in der letzten Abhängigkeitszeile den Befehlsblock. NMAKE versucht, eine Ableitungsregel für die anderen Ziele zu verwenden.

Beispielsweise diese Regelsatz,

leap.exe bounce.exe : jump.obj
bounce.exe climb.exe : up.obj
   echo Building bounce.exe...

wird ausgewertet als:

leap.exe : jump.obj
# invokes an inference rule

bounce.exe : jump.obj up.obj
   echo Building bounce.exe...

climb.exe : up.obj
   echo Building bounce.exe...

Ziele in mehreren Beschreibungsblöcken

Wenn Sie ein Ziel in mehreren Beschreibungsblocks mithilfe verschiedener Befehle aktualisieren möchten, geben Sie zwei aufeinander folgende Doppelpunkte (::) zwischen Zielen und Nachfolgern an.

target.lib :: one.asm two.asm three.asm
    ml one.asm two.asm three.asm
    lib target one.obj two.obj three.obj
target.lib :: four.c five.c
    cl /c four.c five.c
    lib target four.obj five.obj

Nebenwirkungen bei Abhängigkeiten

Sie können ein Ziel mit einem Doppelpunkt (:) in zwei Abhängigkeitszeilen an unterschiedlichen Positionen angeben. Wenn Befehle nur nach einer der Zeilen angezeigt werden, interpretiert NMAKE die Abhängigkeiten so, als ob die Zeilen nebeneinander oder kombiniert waren. Es wird keine Ableitungsregel für die Abhängigkeit aufgerufen, die keine Befehle enthält. Stattdessen geht NMAKE davon aus, dass die Abhängigkeiten zu einem Beschreibungsblock gehören, und führt die mit der anderen Abhängigkeit angegebenen Befehle aus. Berücksichtigen Sie diesen Satz von Regeln:

bounce.exe : jump.obj
   echo Building bounce.exe...

bounce.exe : up.obj

wird ausgewertet als:

bounce.exe : jump.obj up.obj
   echo Building bounce.exe...

Dieser Effekt tritt nicht auf, wenn ein Doppelpunkt (::) verwendet wird. Beispielsweise diese Regelsatz:

bounce.exe :: jump.obj
   echo Building bounce.exe...

bounce.exe :: up.obj

wird ausgewertet als:

bounce.exe : jump.obj
   echo Building bounce.exe...

bounce.exe : up.obj
# invokes an inference rule

Pseudoziele

Ein Pseudotarget ist eine Bezeichnung, die anstelle eines Dateinamens in einer Abhängigkeitszeile verwendet wird. Es wird als datei interpretiert, die nicht vorhanden ist und daher veraltet ist. NMAKE geht davon aus, dass der Zeitstempel eines Pseudotargets mit dem neuesten seiner Nachfolger übereinstimmt. Wenn sie keine Abhängigen hat, wird die aktuelle Zeit angenommen. Wenn ein Pseudotarget als Ziel verwendet wird, werden seine Befehle immer ausgeführt. Ein pseudotarget, das als abhängiges Element verwendet wird, muss auch als Ziel in einer anderen Abhängigkeit angezeigt werden. Diese Abhängigkeit muss jedoch nicht über einen Befehlsblock verfügen.

Pseudotargetnamen folgen den Syntaxregeln für Dateinamen für Ziele. Wenn der Name jedoch keine Erweiterung hat, kann er den Grenzwert von 8 Zeichen für Dateinamen überschreiten und kann bis zu 256 Zeichen lang sein.

Pseudotargets sind nützlich, wenn NMAKE mehrere Ziel automatisch erstellen soll. NMAKE erstellt nur Ziele, die in der Befehlszeile angegeben sind. Wenn kein Befehlszeilenziel angegeben wird, wird nur das erste Ziel in der ersten Abhängigkeit in der Makefile erstellt. Sie können NMAKE anweisen, mehrere Ziele zu erstellen, ohne sie einzeln in der Befehlszeile aufzulisten. Schreiben Sie einen Beschreibungsblock mit einer Abhängigkeit, die einen Pseudotarget enthält, und listen Sie die Ziele auf, die Sie als abhängige Ziele erstellen möchten. Platzieren Sie dann diesen Beschreibungsblock zuerst in der Makefile-Datei, oder geben Sie das Pseudotarget in der NMAKE-Befehlszeile an.

In diesem Beispiel ist UPDATE ein Pseudotarget.

UPDATE : *.*
COPY $** c:\product\release

Wenn UPDATE ausgewertet wird, kopiert NMAKE alle Dateien im aktuellen Verzeichnis in das angegebene Laufwerk und Verzeichnis.

In der folgenden Makefile erstellt das Pseudotarget all sowohl und project1.exeproject2.exe wenn ein all oder kein Ziel in der Befehlszeile angegeben ist. Die Pseudotarget setenv ändert die LIB-Umgebungsvariable, bevor die .exe Dateien aktualisiert werden:

all : setenv project1.exe project2.exe

project1.exe : project1.obj
    LINK project1;

project2.exe : project2.obj
    LINK project2;

setenv :
    set LIB=\project\lib

Dependents

Geben Sie in einer Abhängigkeitslinie null oder mehr abhängige Elemente nach dem Doppelpunkt (:) oder Doppelpunkt (::) mithilfe eines gültigen Dateinamens oder Pseudotargets an. Trennen Sie mehrere abhängige Daten mithilfe eines oder mehrerer Leerzeichen oder Registerkarten. Bei Abhängigen wird die Groß-/Kleinschreibung nicht beachtet. Pfade sind mit Dateinamen zulässig.

Hergeleitete abhängige Dateien

Zusammen mit Abhängigen, die Sie explizit in der Abhängigkeitszeile auflisten, kann NMAKE von einem abgeleiteten Abhängigen ausgehen. Eine abgeleitete abhängige Wird von einer Rückschlussregel abgeleitet und wird vor expliziten Nachfolgern ausgewertet. Wenn ein abgeleiteter Nachfolger im Vergleich zum Ziel veraltet ist, ruft NMAKE den Befehlsblock für die Abhängigkeit auf. Wenn ein abgeleiteter Abhängiger nicht vorhanden ist oder im Vergleich zu seinen eigenen Nachfolgern veraltet ist, aktualisiert NMAKE zunächst den abgeleiteten Nachfolger. Weitere Informationen zu abgeleiteten Nachfolgern finden Sie unter Inference-Regeln.

Suchpfade für abhängige Dateien

Sie können einen optionalen Suchpfad für jede abhängige Person angeben. Dies ist die Syntax zum Angeben einer Reihe von Verzeichnissen, die durchsucht werden sollen:

{directory[;directory...]}Abhängigen

Schließen Sie Verzeichnisnamen in geschweifte Klammern ({ }) ein. Trennen Sie mehrere Verzeichnisse durch ein Semikolon (;). Es sind keine Leerzeichen oder Registerkarten zulässig. NMAKE sucht zuerst im aktuellen Verzeichnis und dann in der Liste der Verzeichnisse in der angegebenen Reihenfolge nach dem abhängigen Verzeichnis. Sie können ein Makro verwenden, um einen Teil oder alle Suchpfade anzugeben. Nur der angegebene abhängige Verwendet diesen Suchpfad.

Beispiel für verzeichnissuchpfad

Diese Abhängigkeitszeile zeigt, wie Sie eine Verzeichnisspezifikation für eine Suche erstellen:

reverse.exe : {\src\omega;e:\repo\backwards}retro.obj

Das Ziel reverse.exe hat eine abhängige. retro.obj Die geschweifte Liste gibt zwei Verzeichnisse an. NMAKE sucht retro.obj zuerst im aktuellen Verzeichnis. Wenn sie nicht vorhanden ist, durchsucht NMAKE das \src\omega Verzeichnis und dann das e:\repo\backwards Verzeichnis.

Siehe auch

NMAKE Reference (NMAKE-Referenz)