Zasady wnioskowania
Reguły wnioskowania w narzędziu NMAKE dostarczają polecenia w celu zaktualizowania obiektów docelowych i wnioskowania zależności dla obiektów docelowych. Rozszerzenia w regule wnioskowania są zgodne z pojedynczym elementem docelowym i zależnym, które mają taką samą nazwę bazową. Reguły wnioskowania są definiowane przez użytkownika lub wstępnie zdefiniowane; wstępnie zdefiniowane reguły można ponownie zdefiniować.
Jeśli nieaktualna zależność nie ma poleceń, a jeśli .SUFFIXES
zawiera rozszerzenie zależne, narzędzie NMAKE używa reguły, której rozszerzenia są zgodne z obiektem docelowym i istniejącym plikiem w bieżącym lub określonym katalogu. Jeśli więcej niż jedna reguła jest zgodna z istniejącymi plikami, lista określa, .SUFFIXES
które z nich mają być używane; priorytet listy maleją od lewej do prawej. Jeśli plik zależny nie istnieje i nie jest wymieniony jako obiekt docelowy w innym bloku opisu, reguła wnioskowania może utworzyć brakujące zależne od innego pliku, który ma taką samą nazwę podstawową. Jeśli obiekt docelowy bloku opisu nie ma żadnych zależności ani poleceń, reguła wnioskowania może zaktualizować obiekt docelowy. Reguły wnioskowania mogą tworzyć element docelowy wiersza polecenia, nawet jeśli żaden blok opisu nie istnieje. Narzędzie NMAKE może wywołać regułę dla zależności wnioskowanej, nawet jeśli określono jawną zależność.
Definiowanie zasady
From_ext reprezentuje rozszerzenie pliku zależnego, a to_ext reprezentuje rozszerzenie pliku docelowego.
.from_ext.to_ext:
commands
Rozszerzenia nie są uwzględniane wielkości liter. Makra mogą być wywoływane w celu reprezentowania from_ext i to_ext. Makra są rozszerzane podczas wstępnego przetwarzania. Kropka (.
), która poprzedza from_ext musi pojawić się na początku wiersza. Dwukropek (:
) jest poprzedzony zerem lub większą większa większa liczba spacji lub kart. Po nim mogą znajdować się tylko spacje lub karty, średnik (;
), aby określić polecenie, znak numeru (#
) w celu określenia komentarza lub znaku nowego wiersza. Żadne inne spacje nie są dozwolone. Polecenia są określane jako w blokach opisu.
Ścieżki wyszukiwania w zasadach
{from_path}.from_ext{to_path}.to_ext:
commands
Reguła wnioskowania ma zastosowanie do zależności tylko wtedy, gdy ścieżki określone w zależności są dokładnie zgodne ze ścieżkami reguł wnioskowania. Określ katalog zależny w from_path i katalog docelowy w to_path; spacje nie są dozwolone. Określ tylko jedną ścieżkę dla każdego rozszerzenia. Ścieżka w jednym rozszerzeniu wymaga ścieżki w drugiej. Aby określić bieżący katalog, użyj kropki (.
) lub pustych nawiasów klamrowych ({ }
). Makra mogą reprezentować from_path i to_path; są one wywoływane podczas przetwarzania wstępnego.
Przykład ścieżek wyszukiwania
{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) $<
Zasady dotyczące trybu partii
{from_path}.from_ext{to_path}.to_ext::
commands
Reguły wnioskowania w trybie wsadowym zapewniają tylko jedno wywołanie reguły wnioskowania, gdy polecenia N przechodzą przez tę regułę wnioskowania. Bez reguł wnioskowania w trybie wsadowym wymagałoby wywołania N poleceń. N to liczba zależności, które wyzwalają regułę wnioskowania.
Jedyną różnicą syntactyczną od standardowej reguły wnioskowania jest to, że reguła wnioskowania w trybie wsadowym kończy się dwukropkiem (::
).
Uwaga
Wywoływane narzędzie musi być w stanie obsłużyć wiele plików. Reguła wnioskowania w trybie wsadowym musi być używana $<
jako makro w celu uzyskania dostępu do plików zależnych.
Reguły wnioskowania w trybie wsadowym mogą przyspieszyć proces kompilacji. Szybsze dostarczanie plików do kompilatora w trybie wsadowym, ponieważ sterownik kompilatora jest wywoływany tylko raz. Na przykład kompilator C i C++ działa szybciej podczas obsługi zestawu plików, ponieważ może pozostać rezydentem pamięci podczas całego procesu.
W poniższym przykładzie pokazano, jak używać reguł wnioskowania w trybie wsadowym:
#
# 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
Narzędzie NMAKE generuje następujące dane wyjściowe bez reguł wnioskowania w trybie wsadowym:
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
Narzędzie NMAKE generuje następujący wynik przy użyciu reguł wnioskowania w trybie wsadowym:
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...
Wstępnie zdefiniowane zasady
Wstępnie zdefiniowane reguły wnioskowania używają makr poleceń i opcji dostarczanych przez narzędzie NMAKE.
Reguła | Polecenie | Akcja domyślna | Reguła usługi Batch | Platforma |
---|---|---|---|---|
.asm.exe |
$(AS) $(AFLAGS) $< |
ml $< |
nie | x86 |
.asm.obj |
$(AS) $(AFLAGS) /c $< |
ml /c $< |
tak | x86 |
.asm.exe |
$(AS) $(AFLAGS) $< |
ml64 $< |
nie | x64 |
.asm.obj |
$(AS) $(AFLAGS) /c $< |
ml64 /c $< |
tak | x64 |
.c.exe |
$(CC) $(CFLAGS) $< |
cl $< |
nie | wszystkie |
.c.obj |
$(CC) $(CFLAGS) /c $< |
cl /c $< |
tak | wszystkie |
.cc.exe |
$(CC) $(CFLAGS) $< |
cl $< |
nie | wszystkie |
.cc.obj |
$(CC) $(CFLAGS) /c $< |
cl /c $< |
tak | wszystkie |
.cpp.exe |
$(CPP) $(CPPFLAGS) $< |
cl $< |
nie | wszystkie |
.cpp.obj |
$(CPP) $(CPPFLAGS) /c $< |
cl /c $< |
tak | wszystkie |
.cxx.exe |
$(CXX) $(CXXFLAGS) $< |
cl $< |
nie | wszystkie |
.cxx.obj |
$(CXX) $(CXXFLAGS) /c $< |
cl /c $< |
tak | wszystkie |
.rc.res |
$(RC) $(RFLAGS) /r $< |
rc /r $< |
nie | wszystkie |
Zależności wywnioskowane oraz zasady
NMAKE zakłada, że wnioskowane zależne od obiektu docelowego, jeśli istnieje odpowiednia reguła wnioskowania. Reguła ma zastosowanie w następujących przypadkach:
to_ext pasuje do rozszerzenia obiektu docelowego.
from_ext pasuje do rozszerzenia pliku, który ma nazwę podstawową obiektu docelowego i który istnieje w bieżącym lub określonym katalogu.
from_ext jest w
.SUFFIXES
systemie ; żadna inna from_ext w regule dopasowania ma wyższy.SUFFIXES
priorytet.Nie ma jawnego zależnego priorytetu
.SUFFIXES
.
Wnioskowane zależności mogą powodować nieoczekiwane skutki uboczne. Jeśli blok opisu obiektu docelowego zawiera polecenia, NMAKE wykonuje te polecenia zamiast poleceń w regule.
Pierwszeństwo w zasadach wnioskowania
Jeśli reguła wnioskowania jest zdefiniowana więcej niż raz, narzędzie NMAKE używa definicji najwyższego pierwszeństwa. Na poniższej liście przedstawiono kolejność pierwszeństwa od najwyższego do najniższego:
Reguła wnioskowania zdefiniowana w pliku make; późniejsze definicje mają pierwszeństwo.
Pierwszeństwo ma reguła wnioskowania zdefiniowana w
Tools.ini
elemencie ; późniejsze definicje mają pierwszeństwo.Wstępnie zdefiniowana reguła wnioskowania.