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.


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


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.