参考》《GNU makefile 中文手册》
Makefile规则介绍
一个简单的 Makefile 描述规则组成:
TARGET... : PREREQUISITES...
COMMAND
...
...
target:规则的目标。通常是最后需要生成的文件名或者为了实现这个目的而必需的中间过程文件名。可以是.o文件、也可以是最后的可执行程序的文件名等。另外,目标也可以是一个make执行的动作的名称,如目标“clean” ,我们称这样的目标是“伪目标”。参考4.6 Makefile伪目标 一节 prerequisites:规则的依赖。生成规则目标所需要的文件名列表。通常一个目标依赖于一个或者多个文件。
command:规则的命令行。是规则所要执行的动作(任意的 shell 命令或者是可在shell下执行的程序) 。它限定了 make执行这条规则时所需要的动作。
一个规则可以有多个命令行,每一条命令占一行。
注意: 每一个命令行必须以[Tab]字符开始,[Tab]字符告诉 make 此行是一个命令行。make按照命令完成相应的动作。
这也是书写 Makefile 中容易产生,而且比较隐蔽的错误。
命令就是在任何一个目标的依赖文件发生变化后重建目标的动作描述。一个目标可以没有依赖而只有动作(指定的命令) 。比如Makefile 中的目标“clean” ,此目标没有依赖,只有命令。它所定义的命令用来删除 make过程产生的中间文件(进行清理工作)。
什么是规则?
在 Makefile 中“规则”就是描述在什么情况下、如何重建规则的目标文件,通常规则中包括了目标的依赖关系(目标的依赖文件)和重建目标的命令。
make执行重建目标的命令,来创建或者重建规则的目标(此目标文件也可以是触发这个规则的上一个规则中的依赖文件)。 规则包含了文件之间的依赖关系和更新此规则目标所需要的命令。
一个 Makefile 文件中通常还包含了除规则以外的很多东西(后续我们会一步一步的展开)。一个最简单的Makefile 可能只包含规则。规则在有些 Makefile 中可能看起来非常复杂,但是无论规则的书写是多么的复杂,它都符合规则的基本格式。
make程序根据规则的依赖关系,决定是否执行规则所定义的命令的过程我们称之为执行规则。
=============================================
2.2 2.3 简单的示例
本小节开始我们在第一小节中提到的例子。此例子由3个头文件和8个C文件组成。
我们将书写一个简单的Makefile,来描述如何创建最终的可执行文件“edit”,此可执行文件依赖于8个C源文件和3个头文件。Makefile文件的内容如下:
所有的.o文件既是依赖(相对于可执行程序edit)又是目标(相对于.c和.h文件)。
edit是第一个目标,也就是终极目标。
#sample Makefile
##############################
#规则描述了“edit”的依赖关系,并定义了链接.o文件生成目标“edit”的命令;
edit : main.o kbd.o command.o display.o \ #edit是我们最后所需要的可执行程序,.o文件也是所要得到的目标。
insert.o search.o files.o utils.o #规则的 目标:依赖文件
cc -o edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o #这一行是命令
#############################
main.o : main.c defs.h #规则的 目标:依赖文件
cc -c main.c #这一行是命令
kbd.o : kbd.c defs.h command.h #规则的 目标:依赖文件
cc -c kbd.c #这一行是命令
command.o : command.c defs.h command.h #规则的 目标:依赖文件
cc -c command.c #这一行是命令
display.o : display.c defs.h buffer.h #规则的 目标:依赖文件
cc -c display.c #这一行是命令
insert.o : insert.c defs.h buffer.h #规则的 目标:依赖文件
cc -c insert.c #这一行是命令
search.o : search.c defs.h buffer.h #规则的 目标:依赖文件
cc -c search.c #这一行是命令
files.o : files.c defs.h buffer.h command.h #规则的 目标:依赖文件
cc -c files.c #这一行是命令
utils.o : utils.c defs.h #规则的 目标:依赖文件
cc -c utils.c #这一行是命令
clean : #目标clean
rm edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o #这是命令。