Apa perbedaan antara: = dan = di Makefile?

Jawaban:

80

Ini dijelaskan dalam dokumentasi GNU Make, di bagian berjudul 6.2 Dua Rasa Variabel .

Singkatnya, variabel yang ditentukan dengan :=diperluas satu kali, tetapi variabel yang ditentukan dengan =diperluas setiap kali variabel tersebut digunakan.

Greg Hewgill
sumber
4
Jadi, apakah benar untuk mengatakan bahwa: = lebih efisien? Atau apakah efisiensi sebenarnya bukan merupakan faktor dengan Makefiles?
Ungeheuer
3
@Ungeheuer Itu bukan masalah karena panggilan proses ( maketugas utama) memiliki overhead yang jauh lebih besar daripada penyelesaian variabel internal tersebut.
Kirill Bulygin
68

Tugas sederhana :=

Ekspresi tugas sederhana dievaluasi hanya sekali, pada kejadian pertama. Misalnya, jika CC :=${GCC} ${FLAGS}selama pertemuan pertama dievaluasi gcc -Wmaka setiap kali ${CC}terjadi akan diganti dengan gcc -W.

Penugasan rekursif =

Ekspresi tugas rekursif dievaluasi setiap kali variabel ditemukan dalam kode. Misalnya, pernyataan suka hanya CC = ${GCC} {FLAGS}akan dievaluasi ketika tindakan suka ${CC} file.cdijalankan. Namun, jika variabel GCCtersebut ditetapkan ulang yaitu GCC=c++maka variabel tersebut ${CC}akan diubah menjadi c++ -Wsetelah penugasan ulang.

Penugasan bersyarat ?=

Penetapan bersyarat memberikan nilai ke variabel hanya jika tidak memiliki nilai

Menambahkan +=

Asumsikan bahwa CC = gccmaka operator menambahkan digunakan seperti CC += -w
itu CCsekarang memiliki nilaigcc -W

Untuk lebih lanjut, lihat tutorial ini

Amjad
sumber
"Ekspresi tugas sederhana dievaluasi hanya sekali, pada kejadian pertama": agar jelas, perluasan / evaluasi dilakukan saat variabel ditentukan, bukan pertama kali digunakan.
Michael Burr