Я пытаюсь выяснить, является ли следующее поведение ошибкой в Make или намеренно частью дизайна (если это так, я не могу найти его документально в любом месте). Это происходит как с старыми, так и с новыми версиями GNU Make, которые я пробовал.значение просто расширенной переменной через вычисленное имя отличается от рецепта и вне рецепта
Вкратце, поведение состоит в том, что оценка переменных вычисленных имен в рецептах происходит в точке вызова рецепта, а не в месте в файле, где рецепт определен, даже если переменная является просто- расширенный (": =", в отличие от рекурсивно-расширенного "=") (не то, что я ожидаю, что это имеет значение).
Репро код:
a_name := alpha
b_name := beta
AB := a
target1 : $($(AB)_name)
echo $^
echo $($(AB)_name)
alpha : ;
beta : ;
AB := b
target2 : target1 ;
после вызова make target2
выход я ожидаю:
альфа
альфа
фактический выход:
альфа
бета
Спасибо! Итак, если я правильно понимаю вас, моя гипотеза была неправильной: Это * не *, что вычисляемые переменные, расширенные в рецептах, вычисляются в точке вызова рецепта. Что действительно происходит: все переменные в рецептах принимают значение, которое у них есть в конце make-файла, независимо от того, где находится рецепт. Теперь я смотрю make-файлы по-другому! –