Почему самый короткий стержень не соответствует в этом make-файле?
foo/%/baz:
@echo "Prereq - stem $*"
foo/%/baz/thing.txt: foo/%/baz
@echo "Good match - stem $*"
foo/%:
@echo "Bad match - stem $*"
Вот результат:
> make foo/bar/baz/thing.txt
Bad match - stem bar/baz/thing.txt
Я бы ожидал, что make
будет соответствовать более конкретному c (более короткий стержень) foo/%/baz/thing.txt
вместо foo/%
.
Это не проблема версии 3.81
(как было в этих двух других подобных вопросах SO).
> make --version
GNU Make 4.2.1
Я могу добиться ожидаемого поведения одним из следующих способов:
Удалив более общее правило
foo/%/baz:
@echo "Prereq - stem $*"
foo/%/baz/thing.txt: foo/%/baz
@echo "Good match - stem $*"
> make foo/bar/baz/thing.txt
Prereq - stem bar
Good match - stem bar
Удалив предварительный элемент из более конкретного c rule
foo/%/baz:
@echo "Prereq - stem $*"
foo/%/baz/thing.txt:
@echo "Good match - stem $*"
foo/%:
@echo "Bad match - stem $*"
> make foo/bar/baz/thing.txt
Good match - stem bar
Я не понимаю, почему пререквезит, добавленный к определенному правилу c, вместо этого приводит к совпадению с общим правилом.