這次的試驗,只有一個Makefile,別的沒有任何文件,通過一個僞目標show來演示變量的使用,好奇葩啊。
cc=gcc
src=a.c b.c
.PHONY:show
show:
@echo $(cc)
@echo $(src)
執行make show,將會顯示
gcc
a.c b.c
so easy。。。
echo前面爲什麼要加上@呢?
.PHONY:reason
reason:
@echo "with @"
echo "without @"
我們執行make reason,將會輸出:
with @
echo "without @"
without @
原來如此,不加@的話,會把本條命令完整的顯示出來,然後再顯示輸出的內容。加上@之後,就只會顯示真正要被輸出的內容。
還有,Makefile中的變量類似於C語言中的宏,只是簡單的文本替換。
city=henan
school=zzti
info=$(city)-$(school)
.PHONY:show
show:
@echo $(info)
執行makeshow的話,將會輸出:
henan-zzti
但是,有一種情況給人這種感覺“難道真的是簡單的文本替換???”
我們在目錄內添加兩個文件a.c和b.c,不用寫任何內容。
src=*.c
.PHONY:show
show:
@echo $(src)
執行make show,反正我第一感覺是輸出*.c,但是實際輸出令我shit。
a.c b.c
這個問題令小弟想了好久,搞不明白。知道膝蓋中了一劍。
其實,Makefile中的變量還真的是文本替換,因爲@echo $(src)=====@echo *.c
但是,恰好是echo犯病了,把*當做通配符,把本目錄內所有以.c結尾的文件都輸出了。
可以試一下,直接在終端執行echo *.c,輸出的就是a.c和b.c。
下面的例子也是證據:
src=*.c
realsrc=a.c b.c
.PHONY:show
show:
echo $(src)
@echo "-------------"
echo $(realsrc)
注意只有中間的一個echo加了@,輸出結果爲:
echo *.c
a.c b.c
-------------
echo a.c b.c
a.c b.c
echo $(src)===echo *.c
所以先輸出echo *.c,然後輸出a.c b.c
echo $(realsrc)===echo a.c b.c
試驗證明:Makefile中的宏還真的是簡單的文本替換。