Makefile技巧总结
这里主要记录一些实用的Makefile编写技巧。
(1)wildcard、notdir与patsubst
wildcard : 扩展通配符
notdir : 去除路径
patsubst :替换通配符
例如:在test目录下建立a.c与b.c,在子目录sub下建立sa.c和sb.c
新建一个Makefile,内容如下:
运行结果如下:
第一行输出:a.c b.c ./sub/sa.c ./sub/sb.c
说明:wildcard将目录 ./ 和 ./sub/ 下的所有后缀是c的文件全部展开。
扩展:我们可以使用wildcard得到指定目录下所有的 C语言源程序文件名 ,避免手工指定需要编译的 .c文件 。方法:SRC = $(wildcard *.c),相当于指定编译当前目录下所有.c文件,处理子目录中的文件:SRC = $(wildcard *.c) $(wildcard inc/*.c),同理也可以指定汇编源程序:ASRC = $(wildcard *.S),这样可以方便定制通用Makefile。
第二行输出:a.c b.c sa.c sb.c
说明:notdir把展开的文件去除掉路径信息
第三行输出:a.o b.o sa.o sb.o
说明:在$(patsubst %.c,%.o,$(dir) )中,patsubst把$(dir)中的变量符合后缀是.c的全部替换成.o,
扩展:这里也可以使用obj=$(dir:%.c=%.o) ,效果相同。这是Makefile里的替换引用规则,即用指定的变量替换另一个变量。它的标准格式是$(var:a=b) 或 ${var:a=b} ,它的含义是将变量var中的每一个值的结尾a用b替换 。
(2)$$变量S(变量)与$变量的区别
$A或者$(A)是Makefile的变量,$$表示Shell中的$,用来区分shell下引用变量。
比如:
第一个可以正常输出,第二个不可以,因为第二个表示Shell变量,而这里A给一个Makefile自身的变量。再如:
第三个可以正常输出,前两个不行,for循环使用的是Shell编程实现,变量i是Shell中的。
注:本文作者neonlight <neonlight@live.cn>,Blog http://blog.csdn.net/neonlight ,转载请注明出处!2010-04-07