静态模式可以更加容易地定义多目标的规则,可以让我们的规则变得更加的有弹性和灵
活
。我们还是先来看一下语法:
<targets …>: : <prereq-patterns …>
…
targets 定义了一系列的目标文件,可以有通配符。是目标的一个集合。
target-parrtern 是指明了 targets 的模式,也就是的目标集模式。
prereq-parrterns 是目标的依赖模式,它对 target-parrtern 形成的模式再进行一次依赖
目标的定义。
看一个例子:
objects = foo.o bar.o
all: $(objects)
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o @上面的例子中,指明了我们的目标从@
上面的例子中,指明了我们的目标从@上面的例子中,指明了我们的目标从object 中获取,“%.o”表明要所有以“.o”结
尾的目标,也就是“foo.o bar.o”,也就是变量object集合的模式,而依赖模式“则取模式“依赖目标就是“foo.cbar.c”。而命令中的“object 集合的模式,而依赖模式“%.c”
则取模式“%.o”的“%”,也就是“foo bar”,并为其加下“.c”的后缀,于是,我们的
依赖目标就是“foo.c bar.c”。而命令中的“object集合的模式,而依赖模式“则取模式“依赖目标就是“foo.cbar.c”。而命令中的“<”和“@”则是自动化变量,“@”则是自动化变量,“@”则是自动化变量,“<”表示
所有的依赖目标集(也就是“foo.c bar.c”), “$@”表示目标集(也就是“foo.o bar.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
试想,如果我们的“%.o”有几百个,那种我们只要用这种很简单的“静态模式规则”
就可以写完一堆规则,实在是太有效率了。“静态模式规则”的用法很灵活,如果用得好,
那会一个很强大的功能。再看一个例子
files = foo.elc bar.o lose.o
(filter(filter %.o,(filter(files)): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
(filter(filter %.elc,(filter(files)): %.elc: %.el
emacs -f batch-byte-compile $<
(filter(filter %.o,(filter(files))表示调用 Makefile 的 filter 函数,过滤“$filter”集,只要其
中模式为“%.o”的内容。其的它内容,我就不用多说了吧。这个例字展示了 Makefile 中更
大的弹性
makefile 静态模式
最新推荐文章于 2023-03-10 14:45:18 发布