Bloki opisów
Bloki opisu tworzą rdzeń pliku make. Opisują obiekty docelowe lub pliki do utworzenia oraz ich zależności, pliki potrzebne do utworzenia obiektów docelowych. Blok opisu może zawierać polecenia opisujące sposób tworzenia obiektów docelowych na podstawie zależności. Blok opisu jest wierszem zależności, po którym opcjonalnie następuje blok poleceń:
targets... : dependents...
commands...
Linie zależności
Wiersz zależności określa co najmniej jeden element docelowy i zero lub więcej zależności. Jeśli obiekt docelowy nie istnieje lub ma wcześniejszy znacznik czasu niż zależny, NMAKE wykonuje polecenia w bloku poleceń. NMAKE wykonuje również blok poleceń, jeśli element docelowy jest pseudotarget. Oto przykładowa linia zależności:
hi_bye.exe : hello.obj goodbye.obj helper.lib
W tym wierszu hi_bye.exe
zależności jest elementem docelowym. Jego zależności to hello.obj
, goodbye.obj
i helper.lib
. Wiersz zależności informuje NMAKE o utworzeniu obiektu docelowego za każdym razem, gdy hello.obj
wartość , goodbye.obj
lub helper.lib
została ostatnio zmieniona niż hi_bye.exe
.
Element docelowy musi znajdować się na początku wiersza. Nie można go wciąć z żadnymi spacjami ani tabulatorami. Użyj dwukropka (:
), aby oddzielić elementy docelowe od zależności. Spacje lub karty są dozwolone między miejscami docelowymi, separatorem dwukropka (:
) i zależnościami. Aby podzielić linię zależności, użyj ukośnika odwrotnego (\
) po obiekcie docelowym lub zależnym.
Przed wykonaniem bloków poleceń narzędzie NMAKE skanuje wszystkie zależności i wszelkie odpowiednie reguły wnioskowania w celu utworzenia drzewa zależności. Drzewo zależności określa kroki wymagane do pełnej aktualizacji obiektu docelowego. NMAKE sprawdza rekursywnie, czy obiekt zależny jest obiektem docelowym na innej liście zależności. Po utworzeniu drzewa zależności NMAKE sprawdza sygnatury czasowe. Jeśli jakiekolwiek zależności w drzewie są nowsze niż obiekt docelowy, NMAKE kompiluje obiekt docelowy.
Elementy docelowe
Sekcja obiektów docelowych w wierszu zależności określa co najmniej jeden element docelowy. Elementem docelowym może być dowolna prawidłowa nazwa pliku, nazwa katalogu lub pseudotarget. Rozdziel wiele obiektów docelowych przy użyciu co najmniej jednej spacji lub karty. Obiekty docelowe nie są uwzględniane wielkości liter. Ścieżki są dozwolone z nazwami plików. Obiekt docelowy i jego ścieżka nie mogą przekraczać 256 znaków. Jeśli element docelowy poprzedzający dwukropek jest pojedynczym znakiem, użyj spacji oddzielającej. W przeciwnym razie NMAKE interpretuje kombinację dwukropka liter jako specyfikator dysku.
Wiele obiektów docelowych
NMAKE ocenia wiele obiektów docelowych w jednej zależności tak, jakby każda została określona w osobnym bloku opisu.
Na przykład ta reguła:
bounce.exe leap.exe : jump.obj
echo Building...
wartość jest oceniana jako:
bounce.exe : jump.obj
echo Building...
leap.exe : jump.obj
echo Building...
Zależności zbiorcze
Zależności są skumulowane w bloku opisu, jeśli obiekt docelowy jest powtarzany.
Na przykład ten zestaw reguł,
bounce.exe : jump.obj
bounce.exe : up.obj
echo Building bounce.exe...
wartość jest oceniana jako:
bounce.exe : jump.obj up.obj
echo Building bounce.exe...
Jeśli masz wiele obiektów docelowych w wielu wierszach zależności w jednym bloku opisu, NMAKE ocenia je tak, jakby zostały określone w osobnym bloku opisu. Jednak tylko obiekty docelowe w ostatnim wierszu zależności używają bloku poleceń. Narzędzie NMAKE próbuje użyć reguły wnioskowania dla innych obiektów docelowych.
Na przykład ten zestaw reguł,
leap.exe bounce.exe : jump.obj
bounce.exe climb.exe : up.obj
echo Building bounce.exe...
wartość jest oceniana jako:
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...
Obiekty docelowe w wielu blokach opisów
Aby zaktualizować obiekt docelowy w więcej niż jednym bloku opisu przy użyciu różnych poleceń, określ dwa kolejne dwukropki (::) między obiektami docelowymi i zależnymi.
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
Skutki uboczne zależności
Element docelowy można określić dwukropkiem (:) w dwóch wierszach zależności w różnych lokalizacjach. Jeśli polecenia są wyświetlane tylko po jednym wierszu, NMAKE interpretuje zależności tak, jakby wiersze były sąsiadujące lub połączone. Nie wywołuje reguły wnioskowania dla zależności, która nie ma poleceń. Zamiast tego NMAKE zakłada, że zależności należą do jednego bloku opisu i wykonuje polecenia określone z drugą zależnością. Rozważmy ten zestaw reguł:
bounce.exe : jump.obj
echo Building bounce.exe...
bounce.exe : up.obj
wartość jest oceniana jako:
bounce.exe : jump.obj up.obj
echo Building bounce.exe...
Ten efekt nie występuje, jeśli jest używany dwukropek (::
). Na przykład ten zestaw reguł:
bounce.exe :: jump.obj
echo Building bounce.exe...
bounce.exe :: up.obj
wartość jest oceniana jako:
bounce.exe : jump.obj
echo Building bounce.exe...
bounce.exe : up.obj
# invokes an inference rule
Pseudo cele
Pseudotarget to etykieta używana zamiast nazwy pliku w wierszu zależności. Jest interpretowany jako plik, który nie istnieje, a więc jest nieaktualny. NMAKE zakłada, że sygnatura czasowa pseudotargetu jest taka sama jak najnowsza ze wszystkich jego zależności. Jeśli nie ma żadnych zależności, przyjmuje się bieżący czas. Jeśli pseudotarget jest używany jako element docelowy, jego polecenia są zawsze wykonywane. Pseudotarget używany jako zależny musi również być obiektem docelowym w innej zależności. Jednak ta zależność nie musi mieć bloku poleceń.
Nazwy pseudotarget są zgodne z regułami składni nazwy pliku dla obiektów docelowych. Jeśli jednak nazwa nie ma rozszerzenia, może przekroczyć limit 8 znaków dla nazw plików i może mieć maksymalnie 256 znaków.
Pseudotargety są przydatne, gdy chcesz, aby NMAKE automatycznie skompilować więcej niż jeden element docelowy. NMAKE kompiluje tylko obiekty docelowe określone w wierszu polecenia. Jeśli nie określono żadnego elementu docelowego wiersza polecenia, kompiluje tylko pierwszy element docelowy w pierwszej zależności w pliku make. Możesz poinformować NMAKE o tworzeniu wielu obiektów docelowych bez wyświetlania ich indywidualnie w wierszu polecenia. Napisz blok opisu z zależnością zawierającą pseudotarget i wyświetl listę obiektów docelowych, które chcesz utworzyć jako jego zależności. Następnie umieść ten blok opisu najpierw w pliku make lub określ pseudotarget w wierszu polecenia NMAKE.
W tym przykładzie funkcja UPDATE jest pseudotargetem.
UPDATE : *.*
COPY $** c:\product\release
Po ocenie aktualizacji narzędzie NMAKE kopiuje wszystkie pliki w bieżącym katalogu do określonego dysku i katalogu.
W poniższym pliku make pseudotarget all
kompiluje się zarówno, project1.exe
jak i project2.exe
jeśli all
w wierszu polecenia nie określono elementu docelowego lub żadnego elementu docelowego. Pseudotarget setenv
zmienia zmienną środowiskową LIB przed zaktualizowanymi .exe
plikami:
all : setenv project1.exe project2.exe
project1.exe : project1.obj
LINK project1;
project2.exe : project2.obj
LINK project2;
setenv :
set LIB=\project\lib
Zależności
W wierszu zależności określ zero lub więcej zależności po dwukropku (:
) lub dwukropku (::
), używając dowolnej prawidłowej nazwy pliku lub pseudotargetu. Rozdziel wiele zależności przy użyciu co najmniej jednej spacji lub kart. Zależności nie są uwzględniane wielkości liter. Ścieżki są dozwolone z nazwami plików.
Zależności wywnioskowane
Oprócz zależności jawnie wyświetlasz listę w wierszu zależności, narzędzie NMAKE może przyjąć wnioskowaną zależność. Zależność wnioskowana pochodzi z reguły wnioskowania i jest obliczana przed jawnymi zależnościami. Gdy wnioskowana zależność jest nieaktualna w porównaniu z jej elementem docelowym, narzędzie NMAKE wywołuje blok poleceń dla zależności. Jeśli wnioskowana zależność nie istnieje lub jest nieaktualna w porównaniu z własnymi zależnościami, NMAKE najpierw aktualizuje wnioskowane zależne. Aby uzyskać więcej informacji na temat wnioskowanych zależności, zobacz Reguły wnioskowania.
Przeszukiwanie ścieżek pod kątem zależności
Możesz określić opcjonalną ścieżkę wyszukiwania dla każdego zależnego. Oto składnia określająca zestaw katalogów do wyszukania:
{directory[;katalog...]}zależny
Ujęć nazwy katalogów w nawiasach klamrowych ({ }
). Rozdziel wiele katalogów średnikami (;
). Spacje ani karty nie są dozwolone. NMAKE najpierw szuka zależności w bieżącym katalogu, a następnie na liście katalogów w określonej kolejności. Możesz użyć makra, aby określić część lub całą ścieżkę wyszukiwania. Tylko określona zależna używa tej ścieżki wyszukiwania.
Przykład ścieżki wyszukiwania katalogu
W tym wierszu zależności pokazano, jak utworzyć specyfikację katalogu dla wyszukiwania:
reverse.exe : {\src\omega;e:\repo\backwards}retro.obj
Obiekt docelowy reverse.exe
ma jedną zależną wartość retro.obj
. Lista ujęta w nawiasy klamrowe określa dwa katalogi. NMAKE najpierw wyszukuje retro.obj
w bieżącym katalogu. Jeśli go tam nie ma, NMAKE przeszukuje \src\omega
katalog, a następnie e:\repo\backwards
katalog.