makefile rules
1.target
Makefile basic grammar:
target: prerequisites
command
target
是编译目标,在编译的时候输入“make target”
就可以执行 target
的规则。target
既可以是目标文件,也可以是可执行文件,还可以使一个标签,如前面的 all
。
prerequisites
是依赖关系文件,即生产 target
所需要的文件或者目标。
command
是生成 target
所需执行的命令。
2.false-target
makefile
all:
gcc name.c
.PHONYL:all
.PHONY:all is false-target .
3.self define variable
make
支持在 Makefile
文件中定义变量。合理使用变量,能增强 Makefile
文件的通用性,
并简化 Makefile
文件编写。
一般的Makefile
文件编写中,通常会为源文件、可执行文件以及编译参数等分别定义
一个变量,并予以赋值,在编译规则中则直接引用这些变量。
变量的定义和赋值方法通常是:
VAR=value
4.makefile 变量
这个 Makefile 和前面看到过的相比,增加了几点内容:
(1) 增加了目标和依赖;
(2) 编译多个 c 文件,多个文件用空格隔开;
(3) 使用了自动变量。
5.隐式规则和显式规则
再回头看图 10.31 和图 10.33 的范例的 EXE:$(OBJ),EXE
依赖于 OBJ
,但是整个
Makefile
只定义了 EXE
的生成规则,并没有给出 OBJ
的生成规则。可是怎么编译却没有出
错呢?
这是因为 make
有一些既定的目标生成规则,称之为隐式规则。例如对于一个 file.o
文
件,make
会优先寻找同名的 file.c
文件,并按照 gcc -c file.c -o file.o
的编译规则生成 file.o
文件。对于不同语言,有不同的隐式规则,所以一般来说,不推荐用隐式规则。
显式规则是用户自定义的规则。在使用隐式规则有隐患的情况下,更应当使用显式规则,
明确指定生成规则。例如前面提到的隐式规则,用显式规则来定义可为:
OBJ:$(SRC)
$(CC) -o $(OBJ) -c $^
如果不用自定义变量,还可以这么写,也称为模式规则:
%.o:%.c
$(CC) -o $(OBJ) -c $@