【Makefile】通配符、隐晦规则 、静态模式
makefile通配符:
$@ 表示规则目标文件
$^ 表示规则所有的依赖文件
$< 表示规则第一个依赖文件
$? 表示比目标还要新的依赖文件
通配符使用场合:
1.规则的目标和依赖中
2.规则的命令中
在规则中使用通配符:
*.c (表示所有后缀为.c的文件)
objects = .c (.c并不会被展开)
objects := $(wildcard .c) (.c才会被展开)
注:wildcard (扩展通配符)
objects :=
(
p
a
t
s
u
b
s
t
(patsubst %.c,%.o,
(patsubst(wildcard *.c))
首先使用“wildcard”函数获取工作目录下的所有.c文件列表,
将列表中的所有.c文件替换为.o文件,
这样就可以得到在当前目录下的.o文件列表,
注:patsubst (替换通配符)
eg:
建立一个测试目录,在测试目录下建立一个名为sub的子目录
$ mkdir test
$ cd test
$ mkdir sub
#在test下,建立a.c和b.c 两个文件,
#在sub下,建立sa.c和sb.c 两个文件
#建立一个简单的Makefile
src=$(wildcard *.c ./sub/*.c)
dir=$(notdir $(src))
obj=$(patsubst %.c,%.o,$(dir) )
# 结果:
$(src) = a.c b.c ./sub/sa.c ./sub/sb.c
$(dir) = a.c b.c sa.c sb.c
$(obj) = a.o b.o sa.o sb.o
make自动推导(隐晦规则):
只要make看到一个.o文件,就会自动的将同名的.c文件加在依赖关系中,
并且 cc -c .c 也会被推导出来。
清空文件规则:
clean:
rm target $( )
.PHONY : clean
clean:
-rm target $( )
注: .PHONY表示clean是一个伪目标
注 :makefile中的命令,必须要以tab键开始
静态模式:
静态模式可以更加容易的定义多目标的规则,
可以让我们的规则变得更加的有弹性和灵活。
语法:
targets : target-pattern : prereq-pattern
目标文件 :目标集模式 %.o : 目标的依赖模式 %.c
eg:
objects = foo.o bar.o
all: $(objects)
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
#等价于:
foo.o : foo.c
$(CC) -c $(CFLAGS) foo.c -o foo.o
bar.o : bar.c
$(CC) -c $(CFLAGS) bar.c -o bar.o