Share via


Çıkarsama kuralları

NMAKE'deki çıkarım kuralları, hedefleri güncelleştirmek ve hedeflerin bağımlılarını çıkarsamak için komutlar sağlar. Çıkarım kuralındaki uzantılar, aynı temel ada sahip tek bir hedefle ve bağımlıyla eşleşmektedir. Çıkarım kuralları kullanıcı tanımlı veya önceden tanımlanmıştır; önceden tanımlanmış kurallar yeniden tanımlanabilir.

Güncel olmayan bir bağımlılığın komutu yoksa .SUFFIXES ve bağımlının uzantısını içeriyorsa, NMAKE uzantıları hedefle eşleşen bir kural ve geçerli veya belirtilen dizindeki mevcut bir dosyayı kullanır. Varolan dosyalarla birden fazla kural eşleşiyorsa, .SUFFIXES liste hangisinin kullanılacağını belirler; liste önceliği soldan sağa doğru iner. Bağımlı bir dosya yoksa ve başka bir açıklama bloğunda hedef olarak listelenmiyorsa, çıkarım kuralı aynı temel ada sahip başka bir dosyadan bağımlı eksik oluşturabilir. Açıklama bloğunun hedefinin bağımlıları veya komutları yoksa, çıkarım kuralı hedefi güncelleştirebilir. Çıkarım kuralları, açıklama bloğu olmasa bile bir komut satırı hedefi oluşturabilir. NMAKE, açık bir bağımlı belirtilmiş olsa bile çıkarım yapılan bir bağımlı için bir kural çağırabilir.

Kural tanımlama

from_ext bağımlı bir dosyanın uzantısını, to_ext ise hedef dosyanın uzantısını temsil eder.

.from_ext.to_ext:
   commands

Uzantılar büyük/küçük harfe duyarlı değildir. Makrolar from_ext ve to_ext temsil etmek için çağrılabilir; makrolar ön işleme sırasında genişletilir. from_ext önce gelen nokta (.) satırın başında görünmelidir. İki nokta üst üste (:) önünde sıfır veya daha fazla boşluk veya sekme bulunur. Bunu yalnızca boşluklar veya sekmeler, komut belirtmek için noktalı virgül (;), açıklama belirtmek için sayı işareti (#) veya yeni satır karakteri takip edebilir. Başka boşluklara izin verilmez. Komutlar açıklama bloklarında olarak belirtilir.

Kurallarda arama yolları

{from_path}.from_ext{to_path}.to_ext:
   commands

Çıkarım kuralı bir bağımlılık için yalnızca bağımlılıkta belirtilen yollar çıkarım kuralı yollarıyla tam olarak eşleşiyorsa geçerlidir. bağımlının dizinini from_path ve hedefin dizinini to_path belirtin; boşluklara izin verilmez. Her uzantı için yalnızca bir yol belirtin. Bir uzantıdaki yol, diğerinde bir yol gerektirir. Geçerli dizini belirtmek için nokta (.) veya boş ayraç ({ }) kullanın. Makrolar from_path ve to_path temsil edebilir; bunlar ön işleme sırasında çağrılır.

Arama yolları örneği

{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) $<

Toplu iş modu kuralları

{from_path}.from_ext{to_path}.to_ext::
   commands

Toplu işlem modu çıkarım kuralları, N komutları bu çıkarım kuralından geçtiğinde çıkarım kuralının yalnızca bir çağrısını sağlar. Toplu iş modu çıkarım kuralları olmadan N komutlarının çağrılması gerekir. N, çıkarım kuralını tetikleyen bağımlıların sayısıdır.

Standart çıkarım kuralından tek söz dizimsel fark, toplu iş modu çıkarım kuralının iki nokta üst üste (::) ile bitmesidir.

Dekont

Çağrılan aracın birden çok dosyayı işleyebilmesi gerekir. Toplu iş modu çıkarım kuralı, bağımlı dosyalara erişmek için makro olarak kullanılmalıdır $< .

Toplu iş modu çıkarım kuralları derleme işlemini hızlandırabilir. Derleyici sürücüsü yalnızca bir kez çağrıldığından, dosyaları derleyiciye toplu iş modunda sağlamak daha hızlıdır. Örneğin, C ve C++ derleyicisi bir dosya kümesini işlerken daha hızlı çalışır, çünkü tüm işlem sırasında bellekte yerleşik olarak kalabilir.

Aşağıdaki örnekte toplu iş modu çıkarım kurallarının nasıl kullanılacağı gösterilmektedir:

#
# 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

NMAKE, toplu iş modu çıkarım kuralları olmadan aşağıdaki çıkışı üretir:

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

NMAKE, toplu iş modu çıkarım kurallarıyla aşağıdaki sonucu verir:

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...

Önceden tanımlanmış kurallar

Önceden tanımlanmış çıkarım kuralları NMAKE tarafından sağlanan komut ve seçenekler makrolarını kullanır.

Kural Command Varsayılan eylem Toplu iş kuralı Platform
.asm.exe $(AS) $(AFLAGS) $< ml $< hayır x86
.asm.obj $(AS) $(AFLAGS) /c $< ml /c $< evet x86
.asm.exe $(AS) $(AFLAGS) $< ml64 $< hayır x64
.asm.obj $(AS) $(AFLAGS) /c $< ml64 /c $< evet x64
.c.exe $(CC) $(CFLAGS) $< cl $< hayır tümü
.c.obj $(CC) $(CFLAGS) /c $< cl /c $< evet tümü
.cc.exe $(CC) $(CFLAGS) $< cl $< hayır tümü
.cc.obj $(CC) $(CFLAGS) /c $< cl /c $< evet tümü
.cpp.exe $(CPP) $(CPPFLAGS) $< cl $< hayır tümü
.cpp.obj $(CPP) $(CPPFLAGS) /c $< cl /c $< evet tümü
.cxx.exe $(CXX) $(CXXFLAGS) $< cl $< hayır tümü
.cxx.obj $(CXX) $(CXXFLAGS) /c $< cl /c $< evet tümü
.rc.res $(RC) $(RFLAGS) /r $< rc /r $< hayır tümü

Çıkarsanan bağımlılar ve kurallar

NMAKE, geçerli bir çıkarım kuralı varsa bir hedef için çıkarım yapılan bir bağımlı olduğunu varsayar. Aşağıdaki durumlar için bir kural uygulanır:

  • to_ext hedefin uzantısıyla eşleşir.

  • from_ext, hedefin temel adına sahip olan ve geçerli veya belirtilen dizinde bulunan bir dosyanın uzantısıyla eşleşir.

  • from_ext içindedir.SUFFIXES; eşleşen bir kuraldaki başka hiçbir from_ext daha yüksek .SUFFIXES önceliğe sahip değildir.

  • Hiçbir açık bağımlının önceliği daha yüksek .SUFFIXES değildir.

Çıkarım yapılan bağımlılar beklenmeyen yan etkilere neden olabilir. Hedefin açıklama bloğu komutları içeriyorsa, NMAKE kuraldaki komutlar yerine bu komutları yürütür.

Çıkarım kurallarında öncelik

Çıkarım kuralı birden çok kez tanımlanmışsa, NMAKE en yüksek öncelik tanımını kullanır. Aşağıdaki listede en yüksekten en düşüğe öncelik sırası gösterilmektedir:

  1. Bir derleme dosyasında tanımlanan çıkarım kuralı; sonraki tanımların önceliği vardır.

  2. içinde Tools.initanımlanan bir çıkarım kuralı; sonraki tanımların önceliği vardır.

  3. Önceden tanımlanmış çıkarım kuralı.

Ayrıca bkz.

NMAKE başvurusu