- 隐含规则链
隐含规则链
有些时候,一个目标可能被一系列的隐含规则所作用。例如,一个 .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
),于是优化过的规则就不会生成中间文件。