Sdílet prostřednictvím


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žší:

  1. Pravidlo odvození definované v souboru pravidel; pozdější definice mají přednost.

  2. Pravidlo odvození definované v Tools.ini; pozdější definice mají přednost.

  3. Předdefinované pravidlo odvození

Viz také

Referenční informace k NMAKE