Makefile 这些规则有什么区别?
如果我使用以下示例进行测试,那么(1)和(2)的行为非常相似,因此我无法区分它们之间的区别 在使用Makefile 这些规则有什么区别?,makefile,gnu-make,Makefile,Gnu Make,如果我使用以下示例进行测试,那么(1)和(2)的行为非常相似,因此我无法区分它们之间的区别 在使用%:规则的情况下,它似乎有一些与%:不同的行为,但我无法确定 % : ------ (1) @echo % : $@ ---------------------- .DEFAULT : ------ (2) @echo default : $@ ---------------------- % ::
%:
规则的情况下,它似乎有一些与%:
不同的行为,但我无法确定
% : ------ (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:
作为默认配方,而%:
仅与一些先决条件一起使用(例如,请参见内置规则)
我承认,当我发现这一点时,我也感到惊讶。但事实证明,当:
如果所有先决条件都存在或应该存在,或者没有先决条件,则此规则适用
它的意思是“尽可能地延迟并缩短递归”