语法规则
在Makefile中,规则的顺序是很重要的,因为,Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的,所以一定要让make知道你的最终目标是什么。一般来说,定义在Makefile中的目标可能会有很多,但是第一条规则中的目标将被确立为最终的目标。如果第一条规则中的目标有很多个,那么,第一个目标会成为最终的目标。make所完成的也就是这个目标。
targets : prerequisites
command
...
或是这样:
targets : prerequisites ; command
command
...
- targets是文件名,以空格分开,可以使用通配符。一般来说,我们的目标基本上是一个文件,但也有可能是多个文件。
- command是命令行,如果其不与“targets:prerequisites”在一行,那么,必须以[Tab键]开头,如果和prerequisites在一行,那么可以用分号做为分隔。(见上)
- prerequisites(可选部分)也就是目标所依赖的文件(或依赖目标)。如果其中的某个文件要比目标文件要新,那么,目标就被认为是“过时的”,被认为是需要重生成的。
如果命令太长,你可以使用反斜框(‘\’)作为换行符。make对一行上有多少个字符没有限制。规则告诉make两件事,文件的依赖关系和如何生成目标文件。
一般来说,make会以UNIX的标准Shell,也就是/bin/sh来执行命令。
文件通配符
make支持三个通配符:“*”,“?”和“~”。这是和Unix的B-Shell是相同的。
换行符
反斜杠(\)是换行符的意思,在需要换行的地方使用\ 再换行既可。在后面的声明变量小结你会看到。
变量
Makefile的变量都是字符串:
声明变量
objects = main.o kbd.o command.o display.o \
insert.osearch.o files.o utils.o
使用变量
edit : $(objects)
cc -oedit $(objects)
注释
用#表示。
Shell命令
命令符号前缀
Item | Description |
@ | Causes the command not to be echoed before it is executed. |
- | 命令行执行有误,只要返回的状态不是0,则可以不要管,继续做后面的事情。 |
+ | 在某些特殊flag下命令行是不执行的,比如: -n, -q, or –t。但只要在命令行前面添加了+则必须执行。 |
退出状态
有 -q flag的时候:
选项 | 描述 |
0 | 成功完成 |
1 | 目标已经最新 |
>1 | 发生错误 |
否则:
选项 | 描述 |
0 | 成功完成 |
>1 | 发生错误 |
引用其它的Makefile
include foo.make a.mk b.mk c.mk e.mk f.mk
或
-include <filename>;
小减号的意思就是,也许某些文件出现问题,但不要管,继续 做后面的事。
工作方式
1. 读入所有的Makefile。
2. 读入被include的其它Makefile。
3. 初始化文件中的变量。
4. 推导隐晦规则,并分析所有规则。
5. 为所有的目标文件创建依赖关系链。
6. 根据依赖关系,决定哪些目标要重新生成。
7. 执行生成命令。
Make Flags
选项 | 描述 |
-DVariable | 是指变量的值为1。 |
-dOption | 显示make执行的详细信息,-d默认显示所有调试信息(等同于A): A 显示所有的debug信息。 a 显示所有关于文档搜索和缓冲的调试信息。 d 显示目录搜索的调试信息。 g1 在创建任何东西之前显示输入图表调试信息。 g2 在创建所有东西之后(错误退出之前)显示输入图表调试信息。 m 显示创建目标的调试信息,包括modification日期。 s 显示后缀搜索调试信息。 v 显示变量赋值调试信息。 |
-e | 表示环境变量覆盖makefile中的宏赋值。 |
-f MakeFile | 指定makefile文件名;可以指定多个makefiles,按顺序执行。 |
-i | 忽略非零状态,等同于在每一个命令行前添加了-符号。 |
-j[Jobs] | 建立独立目标的Job时刻以平行执行的,这个选型的作用是指定平行Job的数量。如果没有指定,等于没有限制。 |
-k | 遇错继续执行,但只针对于所依赖的目标本身被创建时没有导致错误。 |
-n | 显示命令,但不执行,除非该命令行有+前缀。 |
-p | 执行命令的时候,显示完整的宏定义集和目标描述。 |
-q | 如果目标文件是最新的,返回0;如果不是最新的,返回1;使用这个选项,目标不会被更新,除非命令行前面有+号。 |
-r | 不使用默认的规则。 |
-S | 如果发生错误,终止make命令。这也是默认行为,和-k相反。 |
-s | 命令行执行的时候不现实在屏幕中,相当于对所有命令不执行echo。 |
-t | 创建目标,或更新目标的modification时间,使它成为最新的。 |
Target | 指定目标名字 |
清空目标文件
每个Makefile中都应该写一个清空目标文件(.o和执行文件)的规则,这不仅便于重编译,也很利于保持文件的清洁。一般的风格都是:
clean:
rmedit $(objects)
更为稳健的做法是:
.PHONY : clean
clean :
-rmedit $(objects)
.PHONY意思表示clean是一个“伪目标”。当然,clean的规则不要放在文件的开头,不然,这就会变成make的默认目标,相信谁也不愿意这样。不成文的规矩是——“clean从来都是放在文件的最后”。