GNU Make: предупреждение: игнорирование старых команд для цели "xxx"

Не могли бы вы помочь мне понять, как GNU Make (версия 3.81) обрабатывает простой Makefile? Вот файл:

.PHONY: a b c e f
a : b c
    @echo "> a(b,c)"
e : a
    @echo "> e(a)"
e : f
    @echo "> e(f)"
f :
    @echo "> f()"
b :
    @echo "> b()"
c :
    @echo "> c()"

Теперь я запускаю команду

make e

для создания цели "e". Сделать вывод выглядит следующим образом:

Makefile:7: warning: overriding commands for target 'e'
Makefile:5: warning: ignoring old commands for target 'e'
> f()
> b()
> c()
> a(b,c)
> e(f)

http://www.gnu.org/software/make/manual/html_node/Error-Messages.html дает следующее объяснение:

'предупреждение: переопределение рецепта для цели' xxx '

Предупреждение: игнорирование старого рецепта для цели "xxx"

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

Но из вывода мы видим, что также выполняются команды для сборки 'a'. Я думал, что согласно описанию на странице "Сообщения об ошибках", при обработке этого Makefile и попытке построить цель "e" (make e), сначала следует определить, что "e" зависит от "a", а затем перезаписать это to 'e' зависит от 'f'. Результат должен выглядеть так:

Makefile:7: warning: overriding commands for target 'e'
Makefile:5: warning: ignoring old commands for target 'e'
> f()
> e(f)

Но похоже, что все еще помните, что "e" зависит от "a" и вообще не переписывает рецепт.

Пожалуйста, помогите мне понять это поведение. Почему команды для создания цели "еще" выполняются даже после перезаписи рецептов?

Ответ 1

Зависимости отличаются от команд. Зависимость от a не забыта, но есть команды.