这次的试验,只有一个Makefile,别的没有任何文件,通过一个伪目标show来演示变量的使用,好奇葩啊。
cc=gcc src=a.c b.c .PHONY:show show: @echo $(cc) @echo $(src)执行make show,将会显示
gcc a.c b.cso 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 *.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中的宏还真的是简单的文本替换。