Когда несколько правил шаблона соответствуют цели
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
, я ожидал, что определенное правило будет выбрано, но это не так.
Что мне не хватает?
Ответы
Ответ 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.