Set Malas
VARIABLE = value
Pengaturan normal suatu variabel, tetapi variabel lain apa pun yang disebutkan dengan value
bidang diperluas secara rekursif dengan nilainya pada titik di mana variabel digunakan, bukan yang ada saat dideklarasikan
Set Segera
VARIABLE := value
Pengaturan variabel dengan ekspansi sederhana dari nilai-nilai di dalamnya - nilai-nilai di dalamnya diperluas pada waktu deklarasi.
Set Malas Jika Tidak Ada
VARIABLE ?= value
Pengaturan variabel hanya jika tidak memiliki nilai. value
selalu dievaluasi saat VARIABLE
diakses. Ini setara dengan
ifeq ($(origin FOO), undefined)
FOO = bar
endif
Lihat dokumentasi untuk lebih jelasnya.
Menambahkan
VARIABLE += value
Menambahkan nilai yang disediakan ke nilai yang ada (atau mengatur ke nilai itu jika variabel tidak ada)
Menggunakan
=
menyebabkan variabel diberi nilai. Jika variabel sudah memiliki nilai, itu diganti. Nilai ini akan diperluas saat digunakan. Sebagai contoh:Menggunakan
:=
mirip dengan menggunakan=
. Namun, alih-alih nilai diperluas ketika digunakan, itu diperluas selama penugasan. Sebagai contoh:Menggunakan
?=
memberikan nilai variabel jika variabel sebelumnya tidak ditugaskan. Jika variabel sebelumnya diberi nilai kosong (VAR=
), itu masih dianggap set saya pikir . Kalau tidak, fungsinya persis seperti=
.Menggunakan
+=
seperti menggunakan=
, tetapi alih-alih mengganti nilai, nilai ditambahkan ke nilai saat ini, dengan spasi di antaranya. Jika variabel sebelumnya diatur dengan:=
, saya pikir diperluas . Nilai yang dihasilkan diperluas ketika digunakan saya pikir . Sebagai contoh:Jika sesuatu seperti
HELLO_WORLD = $(HELLO_WORLD) world!
digunakan, rekursi akan terjadi, yang kemungkinan besar akan mengakhiri eksekusi Makefile Anda. JikaA := $(A) $(B)
digunakan, hasilnya tidak akan sama persis dengan menggunakan+=
karenaB
diperluas dengan:=
sedangkan+=
tidak akan menyebabkanB
diperluas.sumber
VARIABLE = literal
danVARIABLE := literal
selalu setara. Apakah saya benar?Saya sarankan Anda melakukan beberapa percobaan menggunakan "make". Berikut ini adalah demo sederhana, menunjukkan perbedaan antara
=
dan:=
.make test
cetakan:Lihat penjelasan lebih rinci di sini
sumber
@
di depan setiap resep untuk menghindari pengulangan hasil yang membingungkan ini./* ... */
blok komentarKetika Anda menggunakan
VARIABLE = value
, jikavalue
sebenarnya referensi ke variabel lain, maka nilainya hanya ditentukan saatVARIABLE
digunakan. Ini digambarkan dengan contoh:Ketika Anda menggunakan
VARIABLE := value
, Anda mendapatkan nilaivalue
seperti sekarang . Sebagai contoh:Menggunakan
VARIABLE ?= val
berarti Anda hanya menetapkan nilaiVARIABLE
jikaVARIABLE
belum ditetapkan. Jika belum disetel, pengaturan nilai ditunda hinggaVARIABLE
digunakan (seperti pada contoh 1).VARIABLE += value
hanya ditambahkanvalue
keVARIABLE
. Nilai aktualvalue
ditentukan seperti ketika awalnya ditetapkan, menggunakan salah satu=
atau:=
.sumber
Dalam jawaban di atas, penting untuk memahami apa yang dimaksud dengan "nilai diperluas pada waktu deklarasi / penggunaan". Memberikan nilai seperti
*.c
tidak memerlukan ekspansi apa pun. Hanya ketika string ini digunakan oleh sebuah perintah maka mungkin akan memicu beberapa globbing. Demikian pula, nilai suka$(wildcard *.c)
atau$(shell ls *.c)
tidak memerlukan ekspansi apa pun dan sepenuhnya dievaluasi pada waktu definisi bahkan jika kita digunakan:=
dalam definisi variabel.Cobalah direktori Makefile berikut di mana Anda memiliki beberapa file C:
Menjalankan
make
akan memicu aturan yang membuat file C ekstra (kosong), dipanggilfoo.c
tetapi tidak ada dari 6 variabel yang memilikifoo.c
nilainya.sumber