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