Aturan Inferensi
Aturan inferensi dalam perintah pasokan NMAKE untuk memperbarui target dan menyimpulkan dependen untuk target. Ekstensi dalam aturan inferensi cocok dengan satu target dan dependen yang memiliki nama dasar yang sama. Aturan inferensi ditentukan pengguna atau telah ditentukan sebelumnya; Aturan yang telah ditentukan sebelumnya dapat didefinisikan ulang.
Jika dependensi kedaluarsa tidak memiliki perintah, dan jika .SUFFIXES
berisi ekstensi dependen, NMAKE menggunakan aturan yang ekstensinya cocok dengan target dan file yang ada di direktori saat ini atau yang ditentukan. Jika lebih dari satu aturan cocok dengan file yang ada, .SUFFIXES
daftar menentukan mana yang akan digunakan; prioritas daftar turun dari kiri ke kanan. Jika file dependen tidak ada dan tidak terdaftar sebagai target di blok deskripsi lain, aturan inferensi dapat membuat dependen yang hilang dari file lain yang memiliki nama dasar yang sama. Jika target blok deskripsi tidak memiliki dependen atau perintah, aturan inferensi dapat memperbarui target. Aturan inferensi dapat membangun target baris perintah meskipun tidak ada blok deskripsi. NMAKE dapat memanggil aturan untuk dependen yang disimpulkan meskipun dependen eksplisit ditentukan.
Menentukan aturan
from_ext mewakili ekstensi file dependen, dan to_ext mewakili ekstensi file target.
.from_ext.to_ext:
commands
Ekstensi tidak peka huruf besar/kecil. Makro dapat dipanggil untuk mewakili from_ext dan to_ext; makro diperluas selama praproses. Titik (.
) yang mendahului from_ext harus muncul di awal baris. Titik dua (:
) didahului oleh nol atau lebih spasi atau tab. Ini hanya dapat diikuti oleh spasi atau tab, titik koma (;
) untuk menentukan perintah, tanda angka (#
) untuk menentukan komentar, atau karakter baris baru. Tidak ada ruang lain yang diizinkan. Perintah ditentukan sebagai dalam blok deskripsi.
Jalur pencarian dalam aturan
{from_path}.from_ext{to_path}.to_ext:
commands
Aturan inferensi berlaku untuk dependensi hanya jika jalur yang ditentukan dalam dependensi sama persis dengan jalur aturan inferensi. Tentukan direktori dependen di from_path dan direktori target di to_path; tidak ada spasi yang diizinkan. Tentukan hanya satu jalur untuk setiap ekstensi. Jalur pada satu ekstensi memerlukan jalur di ekstensi lainnya. Untuk menentukan direktori saat ini, gunakan tanda titik (.
) atau kurung kurawal kosong ({ }
). Makro dapat mewakili from_path dan to_path; makro dipanggil selama praproses.
Contoh jalur pencarian
{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) $<
Aturan mode batch
{from_path}.from_ext{to_path}.to_ext::
commands
Aturan inferensi mode batch hanya menyediakan satu pemanggilan aturan inferensi ketika perintah N melalui aturan inferensi ini. Tanpa aturan inferensi mode batch, diperlukan perintah N untuk dipanggil. N adalah jumlah dependen yang memicu aturan inferensi.
Satu-satunya perbedaan sinonis dari aturan inferensi standar adalah bahwa aturan inferensi mode batch berakhir dengan titik dua (::
).
Catatan
Alat yang dipanggil harus dapat menangani beberapa file. Aturan inferensi mode batch harus digunakan $<
sebagai makro untuk mengakses file dependen.
Aturan inferensi mode batch dapat mempercepat proses build. Lebih cepat untuk menyediakan file ke pengkompilasi dalam mode batch, karena driver kompilator hanya dipanggil sekali. Misalnya, pengkompilasi C dan C++ berjalan lebih cepat saat menangani sekumpulan file, karena dapat tetap menjadi penghuni memori selama seluruh proses.
Contoh berikut menunjukkan cara menggunakan aturan inferensi mode batch:
#
# 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 menghasilkan output berikut tanpa aturan inferensi mode 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
NMAKE menghasilkan hasil berikut dengan aturan inferensi mode batch:
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...
Aturan yang sudah ditentukan sebelumnya
Aturan inferensi yang telah ditentukan sebelumnya menggunakan makro perintah dan opsi yang disediakan NMAKE.
Aturan | Perintah | Tindakan default | Aturan batch | Platform |
---|---|---|---|---|
.asm.exe |
$(AS) $(AFLAGS) $< |
ml $< |
no | x86 |
.asm.obj |
$(AS) $(AFLAGS) /c $< |
ml /c $< |
yes | x86 |
.asm.exe |
$(AS) $(AFLAGS) $< |
ml64 $< |
no | x64 |
.asm.obj |
$(AS) $(AFLAGS) /c $< |
ml64 /c $< |
yes | x64 |
.c.exe |
$(CC) $(CFLAGS) $< |
cl $< |
no | all |
.c.obj |
$(CC) $(CFLAGS) /c $< |
cl /c $< |
yes | all |
.cc.exe |
$(CC) $(CFLAGS) $< |
cl $< |
no | all |
.cc.obj |
$(CC) $(CFLAGS) /c $< |
cl /c $< |
yes | all |
.cpp.exe |
$(CPP) $(CPPFLAGS) $< |
cl $< |
no | all |
.cpp.obj |
$(CPP) $(CPPFLAGS) /c $< |
cl /c $< |
yes | all |
.cxx.exe |
$(CXX) $(CXXFLAGS) $< |
cl $< |
no | all |
.cxx.obj |
$(CXX) $(CXXFLAGS) /c $< |
cl /c $< |
yes | all |
.rc.res |
$(RC) $(RFLAGS) /r $< |
rc /r $< |
no | all |
Dependen dan aturan yang disimpulkan
NMAKE mengasumsikan dependen yang disimpulkan untuk target jika ada aturan inferensi yang berlaku. Aturan berlaku jika:
to_ext cocok dengan ekstensi target.
from_ext cocok dengan ekstensi file yang memiliki nama dasar target dan yang ada di direktori saat ini atau yang ditentukan.
from_ext berada di
.SUFFIXES
; tidak ada from_ext lain dalam aturan yang cocok memiliki prioritas yang lebih tinggi.SUFFIXES
.Tidak ada dependen eksplisit yang memiliki prioritas yang lebih tinggi
.SUFFIXES
.
Dependen yang disimpulkan dapat menyebabkan efek samping yang tidak terduga. Jika blok deskripsi target berisi perintah, NMAKE menjalankan perintah tersebut alih-alih perintah dalam aturan.
Prioritas dalam aturan inferensi
Jika aturan inferensi didefinisikan lebih dari sekali, NMAKE menggunakan definisi prioritas tertinggi. Daftar berikut menunjukkan urutan prioritas dari tertinggi ke terendah:
Aturan inferensi yang ditentukan dalam makefile; definisi selanjutnya lebih diutamakan.
Aturan inferensi yang ditentukan dalam
Tools.ini
; definisi selanjutnya memiliki prioritas.Aturan inferensi yang telah ditentukan sebelumnya.