Açıklama blokları
Açıklama blokları bir derleme dosyasının çekirdeğini oluşturur. Hedefleri veya oluşturulacak dosyaları ve bunların bağımlılıklarını, hedefleri oluşturmak için gereken dosyaları açıklar. Açıklama bloğu, bağımlılıklardan hedeflerin nasıl oluşturulacağını açıklayan komutlar içerebilir. Açıklama bloğu, isteğe bağlı olarak bir komut bloğunun ardından gelen bir bağımlılık satırıdır:
targets... : dependents...
commands...
Bağımlılık satırları
Bağımlılık satırı bir veya daha fazla hedefi ve sıfır veya daha fazla bağımlıyı belirtir. Bir hedef yoksa veya bağımlıdan daha eski bir zaman damgasına sahipse, NMAKE komutları komut bloğunda yürütür. NMAKE ayrıca hedef bir pseudotarget ise komut bloğunu yürütür. Aşağıda örnek bir bağımlılık satırı verilmişti:
hi_bye.exe : hello.obj goodbye.obj helper.lib
Bu bağımlılık satırında hi_bye.exe
hedeftir. Bağımlılıkları , goodbye.obj
ve helper.lib
şeklindedirhello.obj
. Bağımlılık satırı, NMAKE'ye hedefi hello.obj
her , goodbye.obj
veya helper.lib
değerinden daha yakın zamanda değiştiğinde oluşturmasını hi_bye.exe
söyler.
Hedefin satırın başında olması gerekir. Hiçbir boşluk veya sekmeyle girintilenemez. Hedefleri bağımlılardan ayırmak için iki nokta üst üste (:
) kullanın. Hedefler, iki nokta üst üste ayırıcısı ():
ve bağımlılar arasında boşluklara veya sekmelere izin verilir. Bağımlılık satırını bölmek için bir hedef veya bağımlıdan sonra ters eğik çizgi (\
) kullanın.
Komut bloklarını yürütmeden önce, NMAKE bağımlılık ağacı oluşturmak için tüm bağımlılıkları ve geçerli çıkarım kurallarını tarar. Bağımlılık ağacı, hedefi tam olarak güncelleştirmek için gereken adımları belirtir. NMAKE, bir bağımlının başka bir bağımlılık listesindeki bir hedef olup olmadığını yinelemeli olarak denetler. Bağımlılık ağacını derledikten sonra NMAKE zaman damgalarını denetler. Ağaçtaki bağımlılardan herhangi biri hedeften daha yeniyse, NMAKE hedefi oluşturur.
Hedefler
Bağımlılık satırının hedefler bölümü bir veya daha fazla hedefi belirtir. Hedef herhangi bir geçerli dosya adı, dizin adı veya pseudotarget olabilir. Bir veya daha fazla boşluk veya sekme kullanarak birden çok hedefi ayırın. Hedefler büyük/küçük harfe duyarlı değildir. Yollara dosya adlarıyla izin verilir. Hedef ve yolu 256 karakteri aşamaz. İki nokta üst üste işaretinden önceki hedef tek bir karakterse, ayırma alanı kullanın. Aksi takdirde, NMAKE harf-iki nokta birleşimini bir sürücü tanımlayıcısı olarak yorumlar.
Birden çok hedef
NMAKE, her biri ayrı bir açıklama bloğunda belirtilmiş gibi tek bir bağımlılıktaki birden çok hedefi değerlendirir.
Örneğin, bu kural:
bounce.exe leap.exe : jump.obj
echo Building...
şu şekilde değerlendirilir:
bounce.exe : jump.obj
echo Building...
leap.exe : jump.obj
echo Building...
Birikmeli bağımlılıklar
Bir hedef yinelenirse bağımlılıklar bir açıklama bloğunda birikmeli olur.
Örneğin, bu kurallar kümesi,
bounce.exe : jump.obj
bounce.exe : up.obj
echo Building bounce.exe...
şu şekilde değerlendirilir:
bounce.exe : jump.obj up.obj
echo Building bounce.exe...
Tek bir açıklama bloğunda birden çok bağımlılık satırına birden çok hedefiniz olduğunda, NMAKE bunları her biri ayrı bir açıklama bloğunda belirtilmiş gibi değerlendirir. Ancak yalnızca son bağımlılık satırındaki hedefler komut bloğunu kullanır. NMAKE, diğer hedefler için çıkarım kuralı kullanmayı dener.
Örneğin, bu kurallar kümesi,
leap.exe bounce.exe : jump.obj
bounce.exe climb.exe : up.obj
echo Building bounce.exe...
şu şekilde değerlendirilir:
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...
Birden çok açıklama bloğundaki hedefler
Farklı komutları kullanarak birden fazla açıklama bloğundaki bir hedefi güncelleştirmek için, hedefler ve bağımlılar arasında ardışık iki nokta üst üste (::) belirtin.
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
Bağımlılık yan etkileri
İki nokta üst üste (:) farklı konumlardaki iki bağımlılık satırına sahip bir hedef belirtebilirsiniz. Komutlar satırlardan yalnızca birinden sonra görünürse, NMAKE bağımlılıkları satırlar bitişik veya birleştirilmiş gibi yorumlar. Komutu olmayan bağımlılık için çıkarım kuralı çağırmaz. Bunun yerine, NMAKE bağımlılıkların bir açıklama bloğuna ait olduğunu varsayar ve diğer bağımlılıkla belirtilen komutları yürütür. Bu kural kümesini göz önünde bulundurun:
bounce.exe : jump.obj
echo Building bounce.exe...
bounce.exe : up.obj
şu şekilde değerlendirilir:
bounce.exe : jump.obj up.obj
echo Building bounce.exe...
Çift iki nokta üst üste (::
) kullanıldığında bu etki oluşmaz. Örneğin, bu kural kümesi:
bounce.exe :: jump.obj
echo Building bounce.exe...
bounce.exe :: up.obj
şu şekilde değerlendirilir:
bounce.exe : jump.obj
echo Building bounce.exe...
bounce.exe : up.obj
# invokes an inference rule
Sözde Hedefler
Pseudotarget, bağımlılık satırında dosya adı yerine kullanılan bir etikettir. Mevcut olmayan ve güncel olmayan bir dosya olarak yorumlanır. NMAKE, bir pseudotarget'in zaman damgasının tüm bağımlılarının en son sürümüyle aynı olduğunu varsayar. Bağımlı değilse geçerli saat varsayılır. Hedef olarak bir pseudotarget kullanılırsa, komutları her zaman yürütülür. Bağımlı olarak kullanılan bir pseudotarget de başka bir bağımlılıkta hedef olarak görünmelidir. Ancak bu bağımlılığın komut bloğuna sahip olması gerekmez.
Pseudotarget adları, hedefler için dosya adı söz dizimi kurallarını izler. Ancak, adın bir uzantısı yoksa, dosya adları için 8 karakterlik sınırı aşabilir ve en fazla 256 karakter uzunluğunda olabilir.
NMAKE'nin otomatik olarak birden fazla hedef oluşturmasını istediğinizde sahte hedefler kullanışlıdır. NMAKE yalnızca komut satırında belirtilen hedefleri oluşturur. Veya herhangi bir komut satırı hedefi belirtilmezse, derleme dosyasındaki ilk bağımlılıkta yalnızca ilk hedefi oluşturur. NMAKE'ye komut satırında tek tek listelemeden birden çok hedef oluşturmasını söyleyebilirsiniz. Sahte hedef içeren bir bağımlılığı olan bir açıklama bloğu yazın ve oluşturmak istediğiniz hedefleri bağımlı olarak listeleyin. Ardından, bu açıklama bloğunu ilk olarak makefile'a yerleştirin veya NMAKE komut satırında pseudotarget değerini belirtin.
Bu örnekte UPDATE bir sözde hedeftir.
UPDATE : *.*
COPY $** c:\product\release
UPDATE değerlendirildiğinde, NMAKE geçerli dizindeki tüm dosyaları belirtilen sürücüye ve dizine kopyalar.
Aşağıdaki makefile dosyasında, pseudotarget all
hem hem de project1.exe
project2.exe
komut satırında hedef belirtildiyse veya belirtilmemişse all
derleniyor. Pseudotarget setenv
, dosyalar güncelleştirilmeden önce LIB ortam değişkenini .exe
değiştirir:
all : setenv project1.exe project2.exe
project1.exe : project1.obj
LINK project1;
project2.exe : project2.obj
LINK project2;
setenv :
set LIB=\project\lib
Bağımlılıklar
Bağımlılık satırında, geçerli bir dosya adı veya sözde hedef kullanarak iki nokta üst üste (:
) veya çift iki nokta üst üste ()::
sonrasında sıfır veya daha fazla bağımlı belirtin. Bir veya daha fazla boşluk veya sekme kullanarak birden çok bağımlıyı ayırın. Bağımlılar büyük/küçük harfe duyarlı değildir. Yollara dosya adlarıyla izin verilir.
Çıkarsanan bağımlılıklar
Bağımlılık satırında açıkça listelediğiniz bağımlılarla birlikte, NMAKE çıkarım yapılan bir bağımlı olduğunu varsayabilir. Çıkarılmış bir bağımlı, çıkarım kuralından türetilir ve açık bağımlılardan önce değerlendirilir. Çıkarsanan bir bağımlı hedefle karşılaştırıldığında güncel olmadığında, NMAKE bağımlılık için komut bloğunu çağırır. Çıkarılan bir bağımlı yoksa veya kendi bağımlılarına kıyasla güncel değilse, NMAKE önce çıkarılan bağımlıyı güncelleştirir. Çıkarımı yapılan bağımlılar hakkında daha fazla bilgi için bkz . Çıkarım kuralları.
Bağımlılıklar için yollar ara
Her bağımlı için isteğe bağlı bir arama yolu belirtebilirsiniz. Aranacak dizin kümesini belirtmek için söz dizimi aşağıdadır:
{directory[;dizin...]}bağımlı
Dizin adlarını ayraç içine alın ({ }
). Birden çok dizini noktalı virgülle (;
) ayırın. Boşluk veya sekmeye izin verilmez. NMAKE, bağımlıyı önce geçerli dizinde, ardından dizin listesinde belirtilen sırada arar. Arama yolunun bir bölümünü veya tamamını belirtmek için makro kullanabilirsiniz. Bu arama yolunu yalnızca belirtilen bağımlı kullanır.
Dizin arama yolu örneği
Bu bağımlılık satırı, arama için dizin belirtimlerinin nasıl oluşturulacağını gösterir:
reverse.exe : {\src\omega;e:\repo\backwards}retro.obj
Hedefin reverse.exe
bağımlı bir tane vardır: retro.obj
. Ayraç içine alınmış liste iki dizin belirtir. NMAKE önce geçerli dizinde öğesini retro.obj
arar. Orada değilse, NMAKE dizininde \src\omega
, sonra da dizininde e:\repo\backwards
arama yapın.