3.6.4 make处理Makefile文件的方式
默认情况下,make会从Makefile文件中第一个目标开始执行(不包括以"."开始的目标)。该目标被称为Makefile的默认最终目标(default goal)。最终目标就是make努力尝试更新的目标。
在上面的例子中,默认最终目标就是更新或创建执行程序"edit",因此我们把相应的规则放在了Makefile的最前面。当我们在命令行上键入命令make时,make就会读取Makefile并开始处理这第一个规则。在例子中,首条规则虽然是重新链接生成"edit",但在make可以完全处理这条规则之前,它必须首先处理"edit"所依赖文件的规则。在例子中就是需要首先创建或更新那些.o目标文件。每一个.o文件都会根据其自身的规则进行处理,即通过编译各自的源文件生成各自的.o目标文件。如果作为目标先决条件的任何源文件或头文件比.o目标文件要新。或者.o目标文件不存在,就需要进行重新编译以更新或创建相应的.o目标文件。
对于Makefile中其他的一些规则,若其目标(文件)出现在最终目标的先决条件中,则也会被处理。若最终目标(或任何目标)并不依赖于某些其他规则,则make并不会处理这些规则,除非我们主动要求make去处理。例如当运行make时,我们可以在命令行上给出Makefile中某个特定规则的目标名称,以执行该目标指定的更新操作,例如使用命令 make clean。
在重新编译一个.o目标文件之前,make会首先考虑更新其先决条件、源文件和头文件。但该Makefile文件没有为源文件和头文件指定任何操作,即源文件和头文件不是任何规则的目标,因此make不会对这些源文件进行任何处理。
在重新编译好所需要的.o目标文件之后,make会决定是否执行重新链接以生成更新过的编辑程序"edit"。这只有当"edit"不存在或者任何.o目标文件比"edit"新时才会进行。如果一个.o目标文件刚被重新编译过,那么它就会比"edit"新,此时make就会重新链接生成新的"edit"。
因此,如果我们修改了文件"insert.c"并运行make,make就会编译该源文件以更新相应的"insert.o",然后链接"edit"。若我们修改了头文件"command.h"并运行make,make就会重新编译目标文件"kbd.o"、"command.o"和"files.o",然后链接生成新的执行文件"edit"。
总体来说,Make程序会使用Makefile文件内容来判断哪些.o目标文件需要被更新,然后确定其中哪些目标确实需要被更新。如果.o目标文件要比其所有相关文件都要新,则说明该.o目标文件已经是最新的而无需再作更新处理。当然,作为第一个最终目标的输入条件(先决条件)中的所有必需目标都会先期执行更新处理。