Odvozená pravidla
Pravidla odvozování v NMAKE poskytují příkazy pro aktualizaci cílů a odvození závislých položek pro cíle. Rozšíření v pravidle odvození odpovídají jednomu cíli a závislému, který má stejný základní název. Pravidla odvozování jsou uživatelsky definovaná nebo předdefinovaná; předdefinovaná pravidla lze předdefinovat.
Pokud zadaná závislost nemá žádné příkazy a pokud .SUFFIXES
obsahuje rozšíření závislého objektu, nástroj NMAKE použije pravidlo, jehož rozšíření odpovídají cíli a existujícímu souboru v aktuálním nebo zadaném adresáři. Pokud více než jedno pravidlo odpovídá existujícím souborům, určuje seznam, .SUFFIXES
který se má použít. Priorita seznamu sestupně zleva doprava. Pokud závislý soubor neexistuje a není uvedený jako cíl v jiném bloku popisu, pravidlo odvození může vytvořit chybějící závislost z jiného souboru, který má stejný základní název. Pokud cíl bloku popisu neobsahuje žádné závislé prvky nebo příkazy, pravidlo odvozování může cíl aktualizovat. Pravidla odvození můžou vytvořit cíl příkazového řádku i v případě, že neexistuje žádný blok popisu. Nástroj NMAKE může vyvolat pravidlo pro odvozenou závislost, i když je zadán explicitní závislý objekt.
Definice pravidla
From_ext představuje příponu závislého souboru a to_ext představuje příponu cílového souboru.
.from_ext.to_ext:
commands
U rozšíření se nerozlišuje malá a velká písmena. Makra lze vyvolat, aby představovala from_ext a to_ext; makra se během předběžného zpracování rozbalí. Tečka (.
), která předchází from_ext musí být uvedena na začátku řádku. Dvojtečka (:
) předchází nula nebo více mezer nebo tabulátoru. Za ním můžou následovat jenom mezery nebo tabulátory, středník (;
) k zadání příkazu, znak čísla (#
) k zadání komentáře nebo znaku nového řádku. Nejsou povoleny žádné další mezery. Příkazy se zadají jako v blocích popisu.
Cesty hledání v pravidlech
{from_path}.from_ext{to_path}.to_ext:
commands
Pravidlo odvození se vztahuje na závislost pouze v případě, že cesty zadané v závislosti přesně odpovídají cestám odvození-pravidlo. Zadejte v from_path závislý adresář a adresář cíle v to_path; nejsou povoleny žádné mezery. Zadejte pouze jednu cestu pro každé rozšíření. Cesta v jednom rozšíření vyžaduje cestu na druhé. Pokud chcete zadat aktuální adresář, použijte tečku (.
) nebo prázdné složené závorky ({ }
). Makra mohou představovat from_path a to_path; jsou vyvolána během předběžného zpracování.
Příklad cest hledání
{dbi\}.cpp{$(ODIR)}.obj::
$(CC) $(CFLAGS) $(YUDBI) $<
{ilstore\}.cpp{$(ODIR)}.obj::
$(CC) $(CFLAGS) $<
{misc\}.cpp{$(ODIR)}.obj::
$(CC) $(CFLAGS) $(YUPDB) $<
{misc\}.c{$(ODIR)}.obj::
$(CC) $(CFLAGS) $<
{msf\}.cpp{$(ODIR)}.obj::
$(CC) $(CFLAGS) $<
{bsc\}.cpp{$(ODIR)}.obj::
$(CC) $(CFLAGS) $(YUPDB) $<
{mre\}.cpp{$(ODIR)}.obj::
$(CC) $(CFLAGS) $(YUPDB) $<
{namesrvr\}.cpp{$(ODIR)}.obj::
$(CC) $(CFLAGS) $(YUPDB) $<
{src\cvr\}.cpp{$(ODIR)}.obj::
$(CC) $(CFLAGS) $<
Pravidla dávkového režimu
{from_path}.from_ext{to_path}.to_ext::
commands
Pravidla odvozování v dávkovém režimu poskytují pouze jedno vyvolání pravidla odvozování, když příkazy N procházejí tímto pravidlem odvozování. Bez pravidel odvozování v dávkovém režimu by bylo nutné vyvolat příkazy N. N je počet závislých položek, které aktivují pravidlo odvozování.
Jediný syntaktický rozdíl od standardního pravidla odvozování spočívá v tom, že pravidlo odvozování v dávkovém režimu končí dvojitou dvojtečku (::
).
Poznámka:
Vyvolaný nástroj musí být schopen zpracovat více souborů. Pravidlo odvozování v dávkovém režimu musí být používáno $<
jako makro pro přístup k závislým souborům.
Pravidla odvozování v dávkovém režimu můžou urychlit proces sestavení. V dávkovém režimu je rychlejší dodávat soubory kompilátoru, protože ovladač kompilátoru se vyvolá pouze jednou. Například kompilátor C a C++ běží rychleji při zpracování sady souborů, protože během celého procesu může zůstat v paměti.
Následující příklad ukazuje, jak používat pravidla odvozování dávkového režimu:
#
# sample makefile to illustrate batch-mode inference rules
#
O = .
S = .
Objs = $O/foo1.obj $O/foo2.obj $O/foo2.obj $O/foo3.obj $O/foo4.obj
CFLAGS = -nologo
all : $(Objs)
!ifdef NOBatch
{$S}.cpp{$O}.obj:
!else
{$S}.cpp{$O}.obj::
!endif
$(CC) $(CFLAGS) -Fd$O\ -c $<
$(Objs) :
#end of makefile
Nástroj NMAKE vytvoří následující výstup bez pravidel odvozování v režimu batch:
E:\tmp> nmake -f test.mak -a NOBatch=1
Microsoft (R) Program Maintenance Utility Version 7.00.0000
Copyright (C) Microsoft Corp 1988-2001. All rights reserved.
cl -nologo -Fd.\ -c .\foo1.cpp
foo1.cpp
cl -nologo -Fd.\ -c .\foo2.cpp
foo2.cpp
cl -nologo -Fd.\ -c .\foo3.cpp
foo3.cpp
cl -nologo -Fd.\ -c .\foo4.cpp
foo4.cpp
Nástroj NMAKE vytvoří následující výsledek s pravidly odvozování v dávkovém režimu:
E:\tmp> nmake -f test.mak -a
Microsoft (R) Program Maintenance Utility Version 7.00.0000
Copyright (C) Microsoft Corp 1988-2001. All rights reserved.
cl -nologo -Fd.\ -c .\foo1.cpp .\foo2.cpp .\foo3.cpp .\foo4.cpp
foo1.cpp
foo2.cpp
foo3.cpp
foo4.cpp
Generating Code...
Předdefinovaná pravidla
Předdefinovaná pravidla odvození používají makra příkazů a možností zadaných pomocí nástroje NMAKE.
Pravidlo | Příkaz | Výchozí akce | Pravidlo dávky | Platforma |
---|---|---|---|---|
.asm.exe |
$(AS) $(AFLAGS) $< |
ml $< |
ne | x86 |
.asm.obj |
$(AS) $(AFLAGS) /c $< |
ml /c $< |
ano | x86 |
.asm.exe |
$(AS) $(AFLAGS) $< |
ml64 $< |
ne | x64 |
.asm.obj |
$(AS) $(AFLAGS) /c $< |
ml64 /c $< |
ano | x64 |
.c.exe |
$(CC) $(CFLAGS) $< |
cl $< |
ne | vše |
.c.obj |
$(CC) $(CFLAGS) /c $< |
cl /c $< |
ano | vše |
.cc.exe |
$(CC) $(CFLAGS) $< |
cl $< |
ne | vše |
.cc.obj |
$(CC) $(CFLAGS) /c $< |
cl /c $< |
ano | vše |
.cpp.exe |
$(CPP) $(CPPFLAGS) $< |
cl $< |
ne | vše |
.cpp.obj |
$(CPP) $(CPPFLAGS) /c $< |
cl /c $< |
ano | vše |
.cxx.exe |
$(CXX) $(CXXFLAGS) $< |
cl $< |
ne | vše |
.cxx.obj |
$(CXX) $(CXXFLAGS) /c $< |
cl /c $< |
ano | vše |
.rc.res |
$(RC) $(RFLAGS) /r $< |
rc /r $< |
ne | vše |
Odvozené závislé objekty a pravidla
Nástroj NMAKE předpokládá odvozenou závislost pro cíl, pokud existuje příslušné pravidlo odvozování. Pravidlo platí, pokud:
to_ext odpovídá rozšíření cíle.
from_ext odpovídá příponě souboru, který má základní název cíle a který existuje v aktuálním nebo zadaném adresáři.
from_ext je v
.SUFFIXES
; žádné jiné from_ext v odpovídajícím pravidle nemá vyšší.SUFFIXES
prioritu.Žádná explicitní závislost nemá vyšší
.SUFFIXES
prioritu.
Odvozené závislé osoby mohou způsobit neočekávané vedlejší účinky. Pokud blok popisu cíle obsahuje příkazy, nástroj NMAKE tyto příkazy spustí místo příkazů v pravidle.
Priorita odvozených pravidel
Pokud je pravidlo odvození definováno více než jednou, NMAKE použije definici nejvyšší priority. Následující seznam zobrazuje pořadí priorit od nejvyšších po nejnižší:
Pravidlo odvození definované v souboru pravidel; pozdější definice mají přednost.
Pravidlo odvození definované v
Tools.ini
; pozdější definice mají přednost.Předdefinované pravidlo odvození