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中的宏还真的是简单的文本替换。


你可能感兴趣的:(Makefile变量---简单的文本替换)