当多个模式规则与目标匹配时

时间:2012-07-12 15:24:43

标签: makefile gnu-make

GNU make manual

  

多个模式规则可能符合这些标准。在这种情况下,make将选择具有最短词干的规则(即,最具体匹配的模式)。

因此让我感到惊讶:

$ touch make_specific.cpp

$ cat Makefile.general_first
%.o: %.cpp
@echo using general rule
$(CXX) -c $< -o $@

%_specific.o: %_specific.cpp
@echo using specific rule
$(CXX) -c $< -o $@

$ make -B -f Makefile.general_first make_specific.o
using general rule
g++44 -c make_specific.cpp -o make_specific.o

多个模式规则与目标匹配,并且由于%_specific.o : %_specific.cpp规则的主干(本例中为'make')比%.o : %.cpp规则的主干短,我预计特定规则为被选中,但事实并非如此。

我错过了什么?

1 个答案:

答案 0 :(得分:17)

您可能正在使用低于3.82的制作版本。

在版本3.81及更低版本中,选择标准不同; make会选择与模式匹配的第一条规则。您引用的文档适用于版本3.82。该版本确实选择具有最特定词干的规则,这符合您的期望。

来自make来源树中的文件NEWS

Version 3.82
...
* WARNING: Backward-incompatibility!
  The pattern-specific variables and pattern rules are now applied in the
  shortest stem first order instead of the definition order (variables
  and rules with the same stem length are still applied in the definition
  order). This produces the usually-desired behavior where more specific
  patterns are preferred. To detect this feature search for 'shortest-stem'
  in the .FEATURES special variable.