多个模式规则可能符合这些标准。在这种情况下,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
规则的主干短,我预计特定规则为被选中,但事实并非如此。
我错过了什么?
答案 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.