Yanıtlar:
VARIABLE = value
Bir değişkenin normal ayarı, ancak value
alanla belirtilen diğer değişkenler , bildirildiği sırada sahip olduğu değişkenin değil, değişkenin kullanıldığı noktadaki değerleriyle özyinelemeli olarak genişletilir.
VARIABLE := value
İçindeki değerlerin basit genişlemesine sahip bir değişkenin ayarlanması - içindeki değerler, bildirim zamanında genişletilir.
VARIABLE ?= value
Değişkenin yalnızca değeri yoksa ayarlanması. value
her zaman VARIABLE
erişildiğinde değerlendirilir . Eşdeğerdir
ifeq ($(origin FOO), undefined)
FOO = bar
endif
Daha fazla ayrıntı için belgelere bakın.
VARIABLE += value
Sağlanan değeri mevcut değere ekleme (veya değişken yoksa bu değere ayarlama)
Kullanılması =
değişkene bir değer atanmasına neden olur. Değişkenin zaten bir değeri varsa değiştirilir. Bu değer kullanıldığında genişletilecektir. Örneğin:
HELLO = world
HELLO_WORLD = $(HELLO) world!
# This echoes "world world!"
echo $(HELLO_WORLD)
HELLO = hello
# This echoes "hello world!"
echo $(HELLO_WORLD)
Kullanmak :=
, kullanmaya benzer =
. Ancak, kullanıldığında genişletilen değer yerine, atama sırasında genişletilir. Örneğin:
HELLO = world
HELLO_WORLD := $(HELLO) world!
# This echoes "world world!"
echo $(HELLO_WORLD)
HELLO = hello
# Still echoes "world world!"
echo $(HELLO_WORLD)
HELLO_WORLD := $(HELLO) world!
# This echoes "hello world!"
echo $(HELLO_WORLD)
Kullanılması ?=
atar değişken bir değeri iff değişken önceden atanmış değildi. Değişken daha önce boş bir değer ( VAR=
) atandıysa , yine de bence ayarlanmış sayılır . Aksi takdirde, işlevler tam olarak benzer =
.
Kullanmak kullanmak +=
gibidir =
, ancak değeri değiştirmek yerine değer, aradaki boşlukla geçerli değere eklenir. Değişken önceden ayarlanmışsa :=
, bence genişletilir . Elde edilen değer kullanıldığında genişletilir bence . Örneğin:
HELLO_WORLD = hello
HELLO_WORLD += world!
# This echoes "hello world!"
echo $(HELLO_WORLD)
Böyle bir şey HELLO_WORLD = $(HELLO_WORLD) world!
kullanılmış olsaydı, büyük olasılıkla Makefile'nizin yürütülmesine son verecekti. Eğer A := $(A) $(B)
kullanıldı, sonuç kullanarak tamamen aynı olmaz +=
çünkü B
ile genişletilir :=
oysa +=
neden olmaz B
genişletilecek.
VARIABLE = literal
ve VARIABLE := literal
her zaman eşdeğerdir. Bunu doğru anladım mı?
"Make" kullanarak bazı deneyler yapmanızı öneririm. İşte =
ve arasındaki farkı gösteren basit bir demo :=
.
/* Filename: Makefile*/
x := foo
y := $(x) bar
x := later
a = foo
b = $(a) bar
a = later
test:
@echo x - $(x)
@echo y - $(y)
@echo a - $(a)
@echo b - $(b)
make test
baskılar:
x - later
y - foo bar
a - later
b - later bar
@
Sonuçların bu kafa karıştırıcı tekrarını önlemek için her bir tarifin önünde bir kullanmak daha iyi olur .
/* ... */
blok yorumu desteklemiyor
Eğer kullandığınız zaman VARIABLE = value
bile, value
aslında başka değişkenin başvurusu olduğunda, o değer yalnızca belirlenir VARIABLE
kullanılır. Bu en iyi şekilde bir örnekle gösterilmiştir:
VAL = foo
VARIABLE = $(VAL)
VAL = bar
# VARIABLE and VAL will both evaluate to "bar"
Kullandığınızda VARIABLE := value
, value
şu anda olduğu gibi değerini alırsınız . Örneğin:
VAL = foo
VARIABLE := $(VAL)
VAL = bar
# VAL will evaluate to "bar", but VARIABLE will evaluate to "foo"
Kullanımı VARIABLE ?= val
yalnızca değerini ayarlamak olduğunu araçlarını VARIABLE
eğer VARIABLE
zaten ayarlı değil. Önceden ayarlanmamışsa, değerin ayarı VARIABLE
kullanılana kadar ertelenir (örnek 1'deki gibi).
VARIABLE += value
Sadece ekler value
için VARIABLE
. Öğesinin gerçek değeri, veya value
öğelerinden biri kullanılarak ilk ayarlandığı zamanki gibi belirlenir .=
:=
Yukarıdaki cevaplarda, "beyan / kullanım zamanında değerler genişletildi" nin ne anlama geldiğini anlamak önemlidir . Gibi bir değer vermek, *.c
herhangi bir genişleme gerektirmez. Sadece bu dize bir komut tarafından kullanıldığında, belki de bazı globbing tetikleyecektir. Benzer şekilde, herhangi bir genişleme gerektiren $(wildcard *.c)
veya $(shell ls *.c)
içermeyen bir değer :=
ve değişken tanımında kullansak bile tanım zamanında tamamen değerlendirilir .
Bazı C dosyalarınızın bulunduğu dizinde aşağıdaki Makefile dosyasını deneyin:
VAR1 = *.c
VAR2 := *.c
VAR3 = $(wildcard *.c)
VAR4 := $(wildcard *.c)
VAR5 = $(shell ls *.c)
VAR6 := $(shell ls *.c)
all :
touch foo.c
@echo "now VAR1 = \"$(VAR1)\"" ; ls $(VAR1)
@echo "now VAR2 = \"$(VAR2)\"" ; ls $(VAR2)
@echo "now VAR3 = \"$(VAR3)\"" ; ls $(VAR3)
@echo "now VAR4 = \"$(VAR4)\"" ; ls $(VAR4)
@echo "now VAR5 = \"$(VAR5)\"" ; ls $(VAR5)
@echo "now VAR6 = \"$(VAR6)\"" ; ls $(VAR6)
rm -v foo.c
Çalıştırıldığında make
, çağrılan fazladan (boş) bir C dosyası oluşturan bir kural tetikler, foo.c
ancak 6 değişkenden hiçbirinin foo.c
değeri yoktur.