GNU make не соответствует самой короткой основе - PullRequest
0 голосов
/ 21 июня 2020

Почему самый короткий стержень не соответствует в этом 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, вместо этого приводит к совпадению с общим правилом.

1 Ответ

0 голосов
/ 22 июня 2020

Извините, когда я предложил вам сообщить об ошибке, я недостаточно внимательно прочитал ваш вопрос и был сбит с толку тем, что это было предварительное условие, которое должно было быть выполнено, но вам было интересно, почему исходное правило не было сопоставлено.

Это не ошибка: это связано с этим выражением в документации:

Обратите внимание, однако, что правило, предварительные условия которого действительно существуют или упоминаются, всегда принимает приоритет над правилом с предпосылками, которые должны быть созданы путем объединения других неявных правил.

Я действительно извиняюсь, это было совсем плохо, что я не прочитал внимательно: (.

...