Подтвердить что ты не робот

Когда несколько правил шаблона соответствуют цели

GNU make manual говорит

Возможно, что более чем одно правило шаблона будет соответствовать этим критериям. В этом случае make выберет правило с самым коротким стеблем (т.е. Шаблон, который наиболее точно соответствует).

Так меня удивило, что:

$ touch make_specific.cpp

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

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

$ 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, я ожидал, что определенное правило будет выбрано, но это не так.

Что мне не хватает?

4b9b3361

Ответ 1

Вероятно, вы используете версию make ниже 3.82.

В версии 3.81 и ниже критерий выбора был другим; make будет выбирать первое правило, которое соответствует шаблону. Документация, на которую вы ссылаетесь, предназначена для версии 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.