Bootstrap

Makefile的规则 .mk文件

第四章:Makefile的规则(一)
2008年03月12日 02:50 来源:ChinaUnix博客 作者:新华网 编辑:周荣茂

    第四章:Makefile的规则

    本章我们将讨论Makefile的一个重要内容,规则。熟悉规则对于书写Makefile至关重要。Makefile中,规则描述了在何种情况下使用什么命令来重建一个特定的文件,此文件被称为规则“目标”(通常规则中的目标只有一个)。规则中出目标之外的罗列的其它文件称为“目标”的依赖,而规则的命令是用来更新或者创建此规则的目标。

    除了makefile的“终极目标”所在的规则以外,其它规则的顺序在makefile文件中没有意义。“终极目标”就是当没有使用make 命令行指定具体目标时,make默认的更新的哪一个目标,它是makefile文件中第一个规则的目标。如果在makefile中第一个规则有多个目标的话,那么多个目标中的第一个将会被作为make的“终极目标”。有两种情况的例外:1. 目标名以点号“.”开始的并且其后不存在斜线“/”(“./”被认为是当前目录;“../”被认为是上一级目录) (.o.c) ;

    2. 模式规则的目标(%.o:%.c)。当这两种目标所在的规则是Makefile的第一个规则时,它们并不会被作为“终极目标”。

    “终极目标”是执行make的唯一目的,其所在的规则作为第一个被执行的规则。而其它的规则是在完成重建“终极目标”的过程中被连带出来的。所以这些目标所在规则在Makefile中的顺序无关紧要。

    因此,我们书写的makefile的第一个规则应该就是重建整个程序或者多个程序的依赖关系和执行命令的描述。

    4.1 一个例子

    我们来看一个规则的例子:

    

    foo.o : foo.c defs.h # module for twiddling the frobs

    cc -c -g foo.c

    

    这是一个典型的规则。看到这个例子,大家应该能够说出这个规则的各个部分之间的关系。不过我们还是要把这个例子拿出来讨论。目的是让我们更加明确地理解Makefile的规则。本例第一行中,文件“foo.o”是规则需要重建的文件,而“foo.c”和“defs.h”是重建“foo.o”所要使用的文件。我们把规则所需要重建的文件称为规则的“目标”(foo.o),而把重新目标所需要的文件称为规则的“依赖”(或者目标的依赖)。规则中的第二行“cc -c -g foo.c”是规则的“命令”。它描述了如何使用规则中的依赖文件重建目标。

    而且,上面的规则告诉我们了两件事:

    1. 如何确定目标文件是否过期(需要重建目标),过期是指目标文件不存在或者目标文件“foo.o”在时间戳上比依赖文件中的任何一个(“foo.c”或者“defs.h”)“老”。

    2. 如何重建目标文件“foo.o”。这个规则中使用cc编译器。规则的命令中没有明确的使用到依赖文件“defs.h”我们假设在源文件“foo.c”中已经包含了此头文件。这也是为什么它作为目标依赖出现的原因。

;