CC = gcc
SRC = $(wildcard *.c)
BIN = $(SRC:%.c=%)
all : ${BIN}
${BIN}:%:%.c
${CC} $^ -o $@
clean:
rm -rf ${BIN}
.PHONY: all clean
语法说明:
1. SRC = $(wildcard *.c)
wildcard搜索当前目录下所有以.c结尾的文件,生成一个以空格间隔的文件名列表,并赋值给SRC。
2. BIN= $(SRC:%.c=%)
将SRC变量中所有以.c结尾的文件名替换成没有后缀的文件名,然后赋回给OBJ。
[Note]: 这里用到makefile里的替换规则,即用您指定的变量替换另一个变量,标准格式为:
$(var:a=b) 或 ${var:a=b}
它的含义是把变量var中的每一个值结尾用b替换掉a
3. ${BIN}:%:%.c
这儿使用了makefile的静态模式规则 ( 规则存在多个目标,并且不同的目标文件可以根据目标的名字来自动构造出自己的依赖文件。
静态模式的语法如下:
< targets ....> : < target-pattern > : < prereq-patterns ...> <commands> .....
其中:
targets定义了一些列的目标文件,也就是多目标,可以有通配符,是目标的一个集合。
target-pattern 是targets的模式,也就是目标集模式
prereq-patterns 则是目标的“依赖”元素
以文章开头Makefile中的内容为例进行解释:
${BIN}:%:%.c
${CC} $^ -o $@
其中,${BIN}: 就是目标集合,内容为生成二进制的文件名集合
% : 表示${BIN}中文件名的格式,%为模式字符
%.c : 表示${BIN}集合的依赖文件的格式,文件名以目标名为基础构造的,并以.c结尾的。
当${BIN}中有多个目标时,该规则会自动扩展成多个独立的规则。