Makefile определяет многострочную переменную, которая определяет правило, ссылается на него функцией eval, отлично работает:
define a
b:
echo b
endef
$(eval $(a))
точный результат:
$ make
echo b
b
, но не удалось, если ссылочная переменная напрямую:
define a :=
b:
echo b
endef
$(a)
выполнить make не удастся:
make: *** Нет правила для создания цели 'echo', необходимой для 'b'. Стоп.
но если я напишу правило в одну строку, это сработает:
define a :=
b: ; echo b
endef
$(a)
Марка в порядке:
$ make
echo b
b
почему многострочная переменная нам нужна функция eval, что делает GNU при непосредственном расширении переменной в make-файл.
Я не нашел материала об этом во всем руководстве по сборке GNU.