这次的试验,只有一个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中的宏还真的是简单的文本替换。