Makefile 这些规则有什么区别?

Makefile 这些规则有什么区别?,makefile,gnu-make,Makefile,Gnu Make,如果我使用以下示例进行测试,那么(1)和(2)的行为非常相似,因此我无法区分它们之间的区别 在使用%:规则的情况下,它似乎有一些与%:不同的行为,但我无法确定 % : ------ (1) @echo % : $@ ---------------------- .DEFAULT : ------ (2) @echo default : $@ ---------------------- % ::

如果我使用以下示例进行测试,那么(1)和(2)的行为非常相似,因此我无法区分它们之间的区别

在使用
%:
规则的情况下,它似乎有一些与
%:
不同的行为,但我无法确定

% :                        ------ (1)
    @echo % : $@

----------------------

.DEFAULT :                 ------ (2)
    @echo default : $@

----------------------

% ::                       ------ (3)
    @echo % :: $@
在下面的示例中,
%.foo:%.bar
是一个非终端 并且还有一个与必备项
%匹配的规则。bar
因此,我认为提示符中的
make a.foo
命令必须与
%.foo:%.bar
规则相匹配 但它最终与更长的茎的规则相匹配

%.foo : %.bar
    @echo target : $@

%.bar :
    @echo target : $@

% ::
    @echo % :: $@

------------------------

sh$ make a.foo 
% :: a.foo
我认为prompt中的make a.foo命令必须与%.foo:%.bar规则匹配,但它最终与更长的stem的%::规则匹配

%.foo : %.bar
    @echo target : $@

%.bar :
    @echo target : $@

% ::
    @echo % :: $@

------------------------

sh$ make a.foo 
% :: a.foo
现在试试这个:

$ touch a.bar
$ make a.foo
target : a.foo
也就是说,如果make已经保证了一步链,那么它拒绝递归到更深层的隐式规则中(否则链长度无关紧要)。因此,通常您应该使用
.DEFAULT:
作为默认配方,而
%:
仅与一些先决条件一起使用(例如,请参见内置规则)

我承认,当我发现这一点时,我也感到惊讶。但事实证明,当:

如果所有先决条件都存在或应该存在,或者没有先决条件,则此规则适用

它的意思是“尽可能地延迟并缩短递归”