- 论坛徽章:
- 0
|
恩。把涉及的资料罗列一下,方便大家查找。
%:: FORCE是模式规则(万用模式规则,Match-Anything pattern rule),而非双冒号规则。我一度是考虑、实验这两种情况的。
接下来,是从徐海兵兄翻译的GNU make中文手册,ver - 3.8上拷贝的。系统上有make文档也可以参考make的html文档。
10.5.5 万用规则
当模式规则的目标只是一个模式字符“%”(它可以匹配任何文件名)时,我们称这个规则为万用规则。万用规则在书写Makefile时非常有用,但它会影响make的执行效率,因为make在执行时将会使用万用规则来试图重建其它规则的目标和依赖文件。
假如在一个存在万用规则的Makefile中提及了文件“foo.c”。为了创建这个目标,make会试图使用以下规则来创建这个目标:1.对一个.o文件“foo.c.o”进行链接并产生文件“foo.c”;2.使用c编译和连接程器由文件“foo.c.c”来创建这个文件;3. 编译并链接Pascal程序“foo.c.p”来创建;等等。总之make会试图使用所有可能的隐含规则来完成对这个文件的创建。
当然,我们很清楚以上这样的过程是没有必要的,我们知道“foo.c”是一个.c原文件,而不是一个可执行程序。make在执行时都会试图根据可能的隐含规则来创建这个文件,但由于其依赖的文件(“foo.c.o”、“foo.c.c”等)不存在,最终这些可能的隐含规则都会被否定。但是如果在Makefile中存在一个万用规则,那么make执行时所要考虑的情况就比较复杂,也很多(它会试图功过隐含规则来创建那些依赖文件,虽然最终这些文件不可能被创建,也无从创建),从而导致make的执行效率会很低。
为了避免万用规则带来的效率问题,我们可以对万用规则的使用加以限制。通常有两种方式,需要在定义一个万用规则时对其进行限制。
1. 将万用规则设置为最终规则,定义时使用双冒号规则。作为最终规则,此规则只有在它的依赖文件存在时才能被应用,即使它的依赖可以由隐含规则创建也不行。就是说,最终规则中没有进一步的“链”。
例如,从RCS和SCCS文件中提取源文件的内嵌隐含规则就是一个最终规则。因此如果文件“foo.c,v”不存在,make就不会试图从一个中间文件“foo.c,v.o”或“RCS/SCCS/s.foo.c,v”来创建它。 RCS 和 SCCS 文件一般都是最终的源文件,它不能由其它任何文件重建;make可以记录它的时间戳,但不会寻找重建它们的方式。
如果万用规则没有定义为最终规则,那么它就是一个非最终规则。非最终的万用规则不会被用来创建那些符合某一个明确模式规则的目标和依赖文件。就是说如果在Makefile中存在匹配此文件的模式规则(非万用规则),那么对于这个文件来说其重建规则只会是它所匹配的这个模式,而不是这个非最终的万用规则。例如,文件“foo.c”,如果在Makefile中同时存在一个万用规则和模式规则“%.c : %.y”(该规则运行Yacc)。无论该规则是否会被使用(如果存在文件“foo.y”,那么规则将被执行)。那么make试图重建“foo.c”的规则都是“%.c : %.y”,而不是万用规则。这样做是为了避免make执行时试图使用非最终的万用规则来重建文件“foo.c”的情况发生。
2. 定义一个特殊的内嵌哑模式规则给出如何重建某一类文件,避免使用非最终万用规则。哑模式规则没有依赖,也没有命令行,在make的其它场合被忽略。例如,内嵌的哑模式规则:“%.p :”为Pascal源程序如“foo.p”指定了重建规则(规则不存在依赖文件、也不存在任何命令),这样就避免了make试图“foo.p”而去寻找“foo.p.o”或“foo.p.c”的过程。
我们可以为所有的make可识别的后缀创建一个形如“%.p :”的哑模式规则。
[ 本帖最后由 白丁布衣 于 2009-3-4 16:41 编辑 ] |
|