1:一个简单规则可以表述为
规则(rule)目标文件:依赖文件(不同文件以空格分隔)
<tab>得到目标文件需要的命令
规则的常见种类有:
a:Explicit Rule: 最简单的rule,明确指出了目标和依赖,以及如何有依赖得到目标。
Hello.o:hello.cpp
g++ -c hello.cp
b:Pattern Rule:使用了wildcard(通配符)的规则
makefile中的通配符是百分号%,相当于bash中的*,在描述规则的时候使用的都是%。makefile中也可以看到通配符*
prog:*.c
g++ -o prog $^
c: Suffix Rule 顾名思义,是只使用后缀来描述的rule,描述的时候不使用pattern。
这个suffix rule的作用和下面这个pattern rule的作用是完全一样的。区别仅在于描述依赖的时候,一个把目标放在后,一个把目标放在前面。
.c.o:
$(COMPILE.C) $(OUTPUT_OPTION) $<
上面代码等价于下面
%.o:%.c
$(COMPILE.C) $(OUTPUT_OPTION) $<
d: Implicit Rule : 就是看不到的rule,这些rule是make的内置rule。
makefile有众多的build-in rule,这些规则为我们编写makefile带来了很大的便利。它们可以通过make –p 来查看
2:Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的, 所以一定要让make知道你的最终目标是什么。
一般来说,定义在Makefile中的目标可能会有很多,但是第一条规则中的目标将被确立为最终的目标。
3:伪目标一定被执行。
“.PHONY”来显示地指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”。
4:自动变量
a: $@表示规则的当前目标文件名。
bigoutput littleoutput : text.g
generate text.g -$(subst output,,$@) > $@
上述规则等价于:
bigoutput : text.g
generate text.g -big > bigoutput
littleoutput : text.g
generate text.g -little > littleoutput
其中,-$(subst output,,$@)中的“$”表示执行一个Makefile的函数,函数名为subst,后面的为参数。
“$@”这里是表示目标的集合,就像一个数组,“$@”依次取出目标,并执于命令。
b:$ <表示所有的依赖目标集。
objects = foo.o bar.o
all: $(objects)
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $ < -o $@
其中,“$ <”表示所有的依赖目标集(也就是“foo.c bar.c”)