Blok deskripsi
Blok deskripsi membentuk inti makefile. Mereka menjelaskan target, atau file yang akan dibuat, dan dependensinya, file yang diperlukan untuk membuat target. Blok deskripsi mungkin menyertakan perintah, yang menjelaskan cara membuat target dari dependensi. Blok deskripsi adalah baris dependensi, secara opsional diikuti oleh blok perintah:
targets... : dependents...
commands...
Baris dependensi
Baris dependensi menentukan satu atau beberapa target, dan nol atau lebih dependen. Jika target tidak ada, atau memiliki tanda waktu sebelumnya daripada dependen, NMAKE menjalankan perintah di blok perintah. NMAKE juga menjalankan blok perintah jika target adalah pseudotarget. Berikut adalah contoh baris dependensi:
hi_bye.exe : hello.obj goodbye.obj helper.lib
Dalam baris dependensi ini, hi_bye.exe
adalah targetnya. Dependensinya adalah hello.obj
, , goodbye.obj
dan helper.lib
. Baris dependensi memberi tahu NMAKE untuk membangun target setiap kali hello.obj
, , goodbye.obj
atau helper.lib
telah berubah lebih baru daripada hi_bye.exe
.
Target harus berada di awal baris. Ini tidak dapat diindentasi dengan spasi atau tab apa pun. Gunakan titik dua (:
) untuk memisahkan target dari dependen. Spasi atau tab diizinkan antara target, pemisah titik dua (:
), dan dependen. Untuk memisahkan baris dependensi, gunakan garis miring terbalik (\
) setelah target atau dependen.
Sebelum menjalankan blok perintah, NMAKE memindai semua dependensi dan aturan inferensi yang berlaku untuk membangun pohon dependensi. Pohon dependensi menentukan langkah-langkah yang diperlukan untuk memperbarui target sepenuhnya. NMAKE memeriksa secara rekursif apakah dependen itu sendiri adalah target dalam daftar dependensi lain. Setelah membangun pohon dependensi, NMAKE memeriksa stempel waktu. Jika ada dependen di pohon yang lebih baru dari target, NMAKE membangun target.
Target
Bagian target dari baris dependensi menentukan satu atau beberapa target. Target dapat berupa nama file, nama direktori, atau pseudotarget yang valid. Pisahkan beberapa target dengan menggunakan satu atau beberapa spasi atau tab. Target tidak peka huruf besar/kecil. Jalur diizinkan dengan nama file. Target dan jalurnya tidak boleh melebihi 256 karakter. Jika target yang mendahului titik dua adalah karakter tunggal, gunakan ruang pemisahan. Jika tidak, NMAKE menginterpretasikan kombinasi titik dua huruf sebagai penentu drive.
Beberapa target
NMAKE mengevaluasi beberapa target dalam satu dependensi seolah-olah masing-masing ditentukan dalam blok deskripsi terpisah.
Misalnya, aturan ini:
bounce.exe leap.exe : jump.obj
echo Building...
dievaluasi sebagai:
bounce.exe : jump.obj
echo Building...
leap.exe : jump.obj
echo Building...
Dependensi kumulatif
Dependensi bersifat kumulatif dalam blok deskripsi, jika target diulang.
Misalnya, seperangkat aturan ini,
bounce.exe : jump.obj
bounce.exe : up.obj
echo Building bounce.exe...
dievaluasi sebagai:
bounce.exe : jump.obj up.obj
echo Building bounce.exe...
Ketika Anda memiliki beberapa target dalam beberapa baris dependensi dalam satu blok deskripsi, NMAKE mengevaluasinya seolah-olah masing-masing ditentukan dalam blok deskripsi terpisah. Namun, hanya target di baris dependensi terakhir yang menggunakan blok perintah. NMAKE mencoba menggunakan aturan inferensi untuk target lain.
Misalnya, seperangkat aturan ini,
leap.exe bounce.exe : jump.obj
bounce.exe climb.exe : up.obj
echo Building bounce.exe...
dievaluasi sebagai:
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...
Target dalam beberapa blok deskripsi
Untuk memperbarui target dalam lebih dari satu blok deskripsi menggunakan perintah yang berbeda, tentukan dua titik dua berturut-turut (::) antara target dan dependen.
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
Efek samping dependensi
Anda mungkin menentukan target dengan titik dua (:) dalam dua baris dependensi di lokasi yang berbeda. Jika perintah hanya muncul setelah salah satu baris, NMAKE menginterpretasikan dependensi seolah-olah baris berdekatan atau digabungkan. Ini tidak memanggil aturan inferensi untuk dependensi yang tidak memiliki perintah. Sebaliknya, NMAKE mengasumsikan dependensi milik satu blok deskripsi, dan menjalankan perintah yang ditentukan dengan dependensi lainnya. Pertimbangkan seperangkat aturan ini:
bounce.exe : jump.obj
echo Building bounce.exe...
bounce.exe : up.obj
dievaluasi sebagai:
bounce.exe : jump.obj up.obj
echo Building bounce.exe...
Efek ini tidak terjadi jika titik dua (::
) digunakan. Misalnya, seperangkat aturan ini:
bounce.exe :: jump.obj
echo Building bounce.exe...
bounce.exe :: up.obj
dievaluasi sebagai:
bounce.exe : jump.obj
echo Building bounce.exe...
bounce.exe : up.obj
# invokes an inference rule
Pseudotargets
Pseudotarget adalah label yang digunakan sebagai pengganti nama file di baris dependensi. Ini ditafsirkan sebagai file yang tidak ada, dan begitu juga yang sudah kedaluarsa. NMAKE mengasumsikan tanda waktu pseudotarget sama dengan yang terbaru dari semua dependennya. Jika tidak memiliki dependen, waktu saat ini diasumsikan. Jika pseudotarget digunakan sebagai target, perintahnya selalu dijalankan. Pseudotarget yang digunakan sebagai dependen juga harus muncul sebagai target dalam dependensi lain. Namun, dependensi tersebut tidak perlu memiliki blok perintah.
Nama Pseudotarget mengikuti aturan sintaks nama file untuk target. Namun, jika nama tidak memiliki ekstensi, nama tersebut dapat melebihi batas 8 karakter untuk nama file, dan panjangnya bisa hingga 256 karakter.
Pseudotargets berguna ketika Anda ingin NMAKE membangun lebih dari satu target secara otomatis. NMAKE hanya membangun target yang ditentukan pada baris perintah. Atau, jika tidak ada target baris perintah yang ditentukan, target hanya membangun target pertama dalam dependensi pertama dalam makefile. Anda dapat memberi tahu NMAKE untuk membangun beberapa target tanpa mencantumkannya satu per satu di baris perintah. Tulis blok deskripsi dengan dependensi yang berisi pseudotarget, dan cantumkan target yang ingin Anda buat sebagai dependennya. Kemudian, tempatkan blok deskripsi ini terlebih dahulu di makefile, atau tentukan pseudotarget pada baris perintah NMAKE.
Dalam contoh ini, UPDATE adalah pseudotarget.
UPDATE : *.*
COPY $** c:\product\release
Ketika UPDATE dievaluasi, NMAKE menyalin semua file di direktori saat ini ke drive dan direktori yang ditentukan.
Dalam makefile berikut, pseudotarget all
membangun dan project1.exe
project2.exe
jika salah satu all
atau tidak ada target ditentukan pada baris perintah. Pseudotarget setenv
mengubah variabel lingkungan LIB sebelum file diperbarui .exe
:
all : setenv project1.exe project2.exe
project1.exe : project1.obj
LINK project1;
project2.exe : project2.obj
LINK project2;
setenv :
set LIB=\project\lib
Dependen
Dalam baris dependensi, tentukan nol atau lebih dependen setelah titik dua (:
) atau titik dua (::
), menggunakan nama file atau pseudotarget yang valid. Pisahkan beberapa dependen dengan menggunakan satu atau beberapa spasi atau tab. Dependen tidak peka huruf besar/kecil. Jalur diizinkan dengan nama file.
Dependen yang disimpulkan
Bersama dengan dependen yang Anda cantumkan secara eksplisit di baris dependensi, NMAKE dapat mengasumsikan dependen yang disimpulkan. Dependen yang disimpulkan berasal dari aturan inferensi, dan dievaluasi sebelum dependen eksplisit. Ketika dependen yang disimpulkan sudah kedaluarsa dibandingkan dengan targetnya, NMAKE memanggil blok perintah untuk dependensi. Jika dependen yang disimpulkan tidak ada, atau sudah kedaluarsa dibandingkan dengan dependennya sendiri, NMAKE terlebih dahulu memperbarui dependen yang disimpulkan. Untuk informasi selengkapnya tentang dependen yang disimpulkan, lihat Aturan inferensi.
Jalur pencarian untuk dependen
Anda dapat menentukan jalur pencarian opsional untuk setiap dependen. Berikut adalah sintaks untuk menentukan sekumpulan direktori yang akan dicari:
{directory[;direktori...]}Tergantung
Sertakan nama direktori dalam tanda kurung kurawal ({ }
). Pisahkan beberapa direktori dengan titik koma (;
). Tidak ada spasi atau tab yang diizinkan. NMAKE mencari dependen terlebih dahulu di direktori saat ini, lalu dalam daftar direktori dalam urutan yang ditentukan. Anda dapat menggunakan makro untuk menentukan bagian atau semua jalur pencarian. Hanya dependen yang ditentukan yang menggunakan jalur pencarian ini.
Contoh jalur pencarian direktori
Baris dependensi ini menunjukkan cara membuat spesifikasi direktori untuk pencarian:
reverse.exe : {\src\omega;e:\repo\backwards}retro.obj
Target reverse.exe
memiliki satu dependen, retro.obj
. Daftar yang diapit kurung kurawal menentukan dua direktori. NMAKE mencari retro.obj
di direktori saat ini terlebih dahulu. Jika tidak ada, NMAKE mencari \src\omega
direktori, lalu e:\repo\backwards
direktori.