静态模式可以灵活定义多目标的规则。
语法:
<targets...><targets-pattern>:<prereq-patterns...>
<commands>
...
- targets表示目标集合。
- target-parrtern表示目标的模式选择。
- prereq-parrterns表示目标的依赖模式。
例子:
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
- 目标来自于$objects。
- <targets-pattern>为%.o,意思是targets也就是例子中的objects都是以.o结尾的,<prereq-patterns>为%.c,意思是去掉<targets-pattern>的结尾.o,保持%,并加上.c,形成新的%.c结尾的新集合。
- %.o表示所有以.o结尾的模板,例子中的foo.o和bar.o,依赖模式%.c取自模式中的%,本例中是foo和bar,加上.c后缀,形成foo.c和bar.c。
- $<是自动化变量,表示所有的依赖目标集合。
例子:
files = foo.elc bar.o lose.o
$(filter %.o $(files)):%.o:%.c
$(CC) -c $(CFLAGS) $< -o $@
$(filter %.o,$(files))表示调用 Makefile 的 filter 函数,过滤“$filter”集,只保留其中模式为“%.o”的内容。