Makefile变量---简单的文本替换

来源:互联网 发布:sql的链接服务器 编辑:程序博客网 时间:2024/05/16 01:36

这次的试验,只有一个Makefile,别的没有任何文件,通过一个伪目标show来演示变量的使用,好奇葩啊。

[plain] view plaincopy
  1. cc=gcc  
  2. src=a.c b.c  
  3.   
  4. .PHONY:show  
  5. show:  
  6.     @echo $(cc)  
  7.     @echo $(src)  
执行make show,将会显示

[plain] view plaincopy
  1. gcc  
  2. a.c b.c  
so easy。。。

echo前面为什么要加上@呢?

[plain] view plaincopy
  1. .PHONY:reason  
  2. reason:  
  3.     @echo "with @"  
  4.     echo "without @"  
我们执行make reason,将会输出:

[plain] view plaincopy
  1. with @  
  2. echo "without @"  
  3. without @  
原来如此,不加@的话,会把本条命令完整的显示出来,然后再显示输出的内容。加上@之后,就只会显示真正要被输出的内容。


还有,Makefile中的变量类似于C语言中的宏,只是简单的文本替换。

[plain] view plaincopy
  1. city=henan  
  2. school=zzti  
  3. info=$(city)-$(school)  
  4.   
  5. .PHONY:show  
  6. show:  
  7.     @echo $(info)  
执行makeshow的话,将会输出:

[plain] view plaincopy
  1. henan-zzti  

但是,有一种情况给人这种感觉“难道真的是简单的文本替换???”

我们在目录内添加两个文件a.c和b.c,不用写任何内容。

[plain] view plaincopy
  1. src=*.c  
  2. .PHONY:show  
  3. show:  
  4.     @echo $(src)  
执行make show,反正我第一感觉是输出*.c,但是实际输出令我shit。

[plain] view plaincopy
  1. a.c b.c  
这个问题令小弟想了好久,搞不明白。知道膝盖中了一剑。

其实,Makefile中的变量还真的是文本替换,因为@echo $(src)=====@echo *.c

但是,恰好是echo犯病了,把*当做通配符,把本目录内所有以.c结尾的文件都输出了。

可以试一下,直接在终端执行echo *.c,输出的就是a.c和b.c。

下面的例子也是证据:

[plain] view plaincopy
  1. src=*.c  
  2. realsrc=a.c b.c  
  3. .PHONY:show  
  4. show:  
  5.     echo $(src)  
  6.     @echo "-------------"  
  7.     echo $(realsrc)  

注意只有中间的一个echo加了@,输出结果为:

[plain] view plaincopy
  1. echo *.c  
  2. a.c b.c  
  3. -------------  
  4. echo a.c b.c  
  5. a.c b.c  

echo  $(src)===echo *.c

 所以先输出echo *.c,然后输出a.c b.c

echo $(realsrc)===echo a.c b.c


 试验证明:Makefile中的宏还真的是简单的文本替换。

0 0
原创粉丝点击