这次的试验,只有一个Makefile,别的没有任何文件,通过一个伪目标show来演示变量的使用,好奇葩啊。
- cc=gcc
- src=a.c b.c
- .PHONY:show
- show:
- @echo $(cc)
- @echo $(src)
- gcc
- a.c b.c
echo前面为什么要加上@呢?
- .PHONY:reason
- reason:
- @echo "with @"
- echo "without @"
- with @
- echo "without @"
- without @
还有,Makefile中的变量类似于C语言中的宏,只是简单的文本替换。
- city=henan
- school=zzti
- info=$(city)-$(school)
- .PHONY:show
- show:
- @echo $(info)
- henan-zzti
但是,有一种情况给人这种感觉“难道真的是简单的文本替换???”
我们在目录内添加两个文件a.c和b.c,不用写任何内容。
- src=*.c
- .PHONY:show
- show:
- @echo $(src)
- 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中的宏还真的是简单的文本替换。