隐含规则链

有些时候,一个目标可能被一系列的隐含规则所作用。例如,一个 .o 的文件生成,可能会是先被Yacc的[.y]文件先成 .c ,然后再被C的编译器生成。我们把这一系列的隐含规则叫做“隐含规则链”。

在上面的例子中,如果文件 .c 存在,那么就直接调用C的编译器的隐含规则,如果没有 .c 文件,但有一个 .y 文件,那么Yacc的隐含规则会被调用,生成 .c 文件,然后,再调用C编译的隐含规则最终由 .c 生成 .o 文件,达到目标。

我们把这种 .c 的文件(或是目标),叫做中间目标。不管怎么样,make会努力自动推导生成目标的一切方法,不管中间目标有多少,其都会执着地把所有的隐含规则和你书写的规则全部合起来分析,努力达到目标,所以,有些时候,可能会让你觉得奇怪,怎么我的目标会这样生成?怎么我的 makefile发疯了?

在默认情况下,对于中间目标,它和一般的目标有两个地方所不同:第一个不同是除非中间的目标不存在,才会引发中间规则。第二个不同的是,只要目标成功产生,那么,产生最终目标过程中,所产生的中间目标文件会被以 rm -f 删除。

通常,一个被makefile指定成目标或是依赖目标的文件不能被当作中介。然而,你可以明显地说明一个文件或是目标是中介目标,你可以使用伪目标 .INTERMEDIATE 来强制声明。(如: .INTERMEDIATE : mid

你也可以阻止make自动删除中间目标,要做到这一点,你可以使用伪目标 .SECONDARY 来强制声明(如: .SECONDARY : sec )。你还可以把你的目标,以模式的方式来指定(如: %.o )成伪目标 .PRECIOUS 的依赖目标,以保存被隐含规则所生成的中间文件。

在“隐含规则链”中,禁止同一个目标出现两次或两次以上,这样一来,就可防止在make自动推导时出现无限递归的情况。

Make会优化一些特殊的隐含规则,而不生成中间文件。如,从文件 foo.c 生成目标程序 foo ,按道理,make会编译生成中间文件 foo.o ,然后链接成 foo ,但在实际情况下,这一动作可以被一条 cc 的命令完成( cc –o foo foo.c ),于是优化过的规则就不会生成中间文件。