Rules
基本形式:
targets : prerequisites
recipe
...
targets
要生成的目标文件,或者定义的命令prerequisites
targets所需要的输入文件,如果是target是命令的话可以为空recipe
从prerequisites得到target,所执行的动作
参考资料:https://www.gnu.org/software/make/manual/make.html#Rules
Variable
变量的定义有几种方式:’=’,’:=’, ‘?=’.
变量名:=变量值
‘=’是递归展开,’:=’是简单展开
通过$(变量名)
使用变量
参考资料:https://www.gnu.org/software/make/manual/make.html#Using-Variables
Wildcast
make使用的通配符(wildcard characters)有:‘*’, ‘?’ , ‘[…]’.
注意 变量定义的时候,通配符不展开,例如
### objects的值是字符串'*.o'
objects = *.o
在target或者prerequisites中使用以上变量object
时,会在所在处展开。在recipe中使用时,会在recipe执行的时候展开。要让变量直接在赋值时的话,使用Wildcard 函数
objects := $(wildcard *.o)
参考资料:https://www.gnu.org/software/make/manual/make.html#Wildcards
String substitution
$(patsubst pattern,replacement,text)
对text
进行操作,把符合pattern
的替换成replacement
。在pattern
中使用%
作为通配符,若replacement
中也有%
,那么%
表示pattern
的对应文字。
例子:
$(patsubst %.c,%.o,x.c.c bar.c)
得到x.c.o bar.o
参考资料:https://www.gnu.org/software/make/manual/make.html#Text-Functions
Pattern Rules
%.o : %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
表示对所有x.c操作,得到x.o
$<
和$@
是自动变量(automatic variable):
$<
第一个prerequisite的文件名$@
target的文件名
参考资料:https://www.gnu.org/software/make/manual/make.html#Pattern-Rules
同时编译多个可执行文件
默认情况下只会编译链接第一个可执行文件,如果要同时make多个可执行文件,需要定义phony target(伪目标,虚目标),令所要生成的几个可执行文件作为prerequisites. 例如
all : prog1 prog2 prog3
.PHONY : all
prog1 : prog1.o utils.o
cc -o prog1 prog1.o utils.o
prog2 : prog2.o
cc -o prog2 prog2.o
prog3 : prog3.o sort.o utils.o
cc -o prog3 prog3.o sort.o utils.o
参考:https://www.gnu.org/software/make/manual/make.html#Phony-Targets