19

GNU make 手册

多个模式规则可能会满足这些标准。在这种情况下,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,我希望选择特定的规则,但事实并非如此。

我错过了什么?

4

1 回答 1

19

您可能正在使用低于3.82.

在版本3.81及更低版本中,选择标准不同;make将选择与模式匹配的第一条规则。您所指的文档适用于 version 3.82。该版本确实会根据您的期望选择具有最具体词干的规则。

从源代码树NEWS中的文件:make

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.
于 2012-07-13T04:25:05.653 回答