Makefile變量---簡單的文本替換

這次的試驗,只有一個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中的宏還真的是簡單的文本替換。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章