空显式规则和隐式规则的优先级

时间:2014-07-30 01:43:50

标签: makefile gnu-make

我对隐式规则的理解是隐式规则只会被使用 如果没有与目标匹配的明确规则。 如果存在与目标匹配的显式规则和隐式规则, 如果使用显式规则,隐式规则将被忽略。

但运行以下示例表明使用了隐式规则,并且未使用空显式规则。

生成文件

all:

%:
      #match-anything implicit rule

make的输出是     #matta-anything隐含规则

生成文件

all:
      #explicit rule

%:
      #match-anything implicit rule

make的输出是        #explicit rule

2 个答案:

答案 0 :(得分:1)

Multiple Rules for One Target部分的GNU make手册中记录了此行为。

  

如果目标的任何显式规则都没有配方,那么make   搜索适用的隐式规则以查找一个请参阅使用   隐含规则)。

Rule SyntaxWhat Makefiles Contain部分提供了其他信息(与了解各种相互关联的行为相关)。

答案 1 :(得分:0)

来自GNU make manual中的Using Empty Rules

  

定义不做任何事情的食谱有时很有用。这只是通过给出一个只包含空格的食谱来完成的。例如:

     

目标:;

     

为目标定义一个空配方。您还可以使用以食谱前缀字符开头的行来定义空配方,但这会让人感到困惑,因为这样的行看起来是空的。

     

您可能想知道为什么要定义不执行任何操作的配方。这是有用的唯一原因是防止目标获得隐式配方(来自隐式规则或.DEFAULT特殊目标;请参阅隐式规则并参阅定义最后阶段默认规则)。