首先书写时,可以将一个较长行使用反斜线(\)来分解为多行,这样可以使我们的Makefile书写清晰、容易阅读理解。但需要注意:反斜线之后不能有空格(这也是大家最容易犯的错误,错误比较隐蔽) 。我们推荐将一个长行分解为使用反斜线连接得多个行的方式。在完成了这个Maekfile以后;需要创建可执行程序“edit”,所要做的就是在包含此Makefile的目录(当然也在代码所在的目录)下输入命令“make”。删除已经此目录下之前使用“make”生成的文件(包括那些中间过程的.o文件),也只需要输入命令“make clean”就可以了。
在这个Makefile中,我们的目标(target)就是可执行文件“edit”和那些.o文件
(main.o,kbd.o….) ;依赖(prerequisites)就是冒号后面的那些 .c 文件和 .h文件。
所有的.o文件既是依赖(相对于可执行程序edit)又是目标(相对于.c和.h文件)。命令包括 “cc –c maic.c”、“cc –c kbd.c”……
当规则的目标是一个文件,在它的任何一个依赖文件被修改以后,在执行“make”时这个目标文件将会被重新编译或者重新连接。当然,此目标的任何一个依赖文件如果有必要则首先会被重新编译。在这个例子中,“edit”的依赖为8个.o文件;而“main.o”的依赖文件为“main.c”和“defs.h” 。当“main.c”或者“defs.h”被修改以后,再次执行“make”,“main.o”就会被更新(其它的.o文件不会被更新) ,同时“main.o” 的更新将会导致“edit”被更新。
在描述依赖关系行之下通常就是规则的命令行(存在一些些规则没有命令行) ,命令行定义了规则的动作(如何根据依赖文件来更新目标文件) 。
命令行必需以[Tab]键开始,以和Makefile其他行区别。就是说所有的命令行必需以[Tab] 字符开始,但并不是所有的以[Tab]键出现行都是命令行。 但make程序会把出现在第一条规则之后的所有以[Tab]字符开始的行都作为命令行来处理。 (记住:make程序本身并不关心命令是如何工作的,对目标文件的更新需要你在规则描述中提供正确的命令。“make”程序所做的就是当目标程序需要更新时执行规则所定义的命令)。
目标“clean”不是一个文件,它仅仅代表执行一个动作的标识。正常情况下,不需要执行这个规则所定义的动作,因此目标“clean”没有出现在其它任何规则的依赖列表中。因此在执行make时,它所指定的动作不会被执行。除非在执行make时明确地指定它。而且目标“clean”没有任何依赖文件,它只有一个目的,就是通过这个目标名来执行它所定义的命令。Makefile中把那些没有任何依赖只有执行动作的目标称为“伪目标” (phony targets) 。参考4.6 Makefile伪目标 一节。需要执行“clean”目标所定义的命令,可在shell下输入:make clean。