make命令需要通过描述文件来描述文件之间的相互关系并且自动维护编译工作。
描述文件是一个文本形式的数据库文件,其中包含一些规则来告诉make命令处理哪些文件以及如何处理这些文件。
描述文件的基本结构:
一个描述文件包含一系列规则,但是每一条规则都包含的一些内容,如下:
一个target:即make 命令最终要创建的文件,如可执行文件和目标文件,目标也可以是要执行的的动作,例如clean
一个或多个依赖文件(dependency)列表,通常是编译目标文件所需要的其他文件
一系列命令(command)是make命令执行的动作,通常是把指定的相关文件编译成目标文件的编译命令,每个命令占一行,且每个命令行的起始字符必须为Tab
形如:
target:dependency dependency
(Tab)<command>
描述文件里还可以使用变量,变量一般在文件的头部定义,变量分为以下几种:
(1)用户自定义变量:
变量名=文本串 eg:OBJS=prog.o code.o
引用变量(3中变量都适用):
${变量名}
make命令解释规则时,“${变量名}”展开为变量名的值,即定义该变量的字符串
(2)描述文件常用的自动变量:
$@:代表规则中的目标文件名
$<:代表规则中的第一个依赖文件名
$?:代表所有比目标文件更新依赖文件列表,以空格为分隔符
$^:代表规则中所有依赖文件列表,以空格为分隔符
$*:代表规则中已经删除了后缀的目标名
$(@D):代表目标文件的目录部分(去掉目录部分的最后一个斜杠)
$(@F):代表目标文件的完整文件名中出目录部分以外的部分
(3)描述文件常用的预定义变量如下:
AR:归档维护程序,默认值为ar;
AS:汇编程序,默认值为as;
CC:C编译程序,默认值为cc;
CPP:C预处理程序,默认值为cpp;
RM:文件删除程序,默认值为rm -f
【实例】
OBJS=code1.o code2.o
test: ${OBJS}
${CC} -o test ${OBJS}
code1.o:code1.c
${CC} -c code1.c -o code1.o
code2.o:code2.c
${CC} -c code2.c -o code2.o
clean:
${RM} -f *.o
(1)make命令等价于“make test" ,make命令首先将target读入,从第一行开始执行,第一个test目标当成总计目标,后面目标的更新都会影响到test的更新
(2)第二行规则说明只要文件test的时间戳比code1.o或者code2.o的任何一个旧,下一行的编译命令就会执行;
(3)在检查code1.o和code2.o的时间戳之前,make命令会在下面的行中寻找以他们为目标的规则;
(4)第四行找到了以code1.o为目标的规则,该文件的依赖文件是code1.c,同样,make命令会接下来查找这些依赖文件的规则;
(5)如果找不到,则开始检查这些依赖文件的时间戳,如果其中任何一个比code1.o新,make就会执行”gcc -c code1.c -o code1.o"命令,更新code1.o文件
(6)循环往复,执行完所有的嵌套规则,只要code1.o或者code2.o之间有一个更新就可以链接成目标test