GNU Make поддерживает также и второй, новый способ задания переменной - с помощью оператора ':=': compile_flags := -O3 -funroll-loops -fomit-frame-pointer В этом случае переменная работает подобно "обычным" текстовым переменным в каком-нибудь из языков программирования. Вот приблизительный аналог этого выражения на языке C++: string compile_flags = "-O3 -funroll-loops -fomit-frame-pointer"; Значение переменной вычисляется в момент обработки оператора присваивания. Если, например, записать var1 := one var2 := $(var1) two var1 := three all: @echo $(var2) то при обработке такого make-файла на экран будет выдана строка "one two".
Переменная может "менять" свое поведение в зависимости от того, какой из операторов присваивания был к ней применен последним. Одна и та же переменная на протяжении своей жизни вполне может вести себя и как "макрос" и как "текстовая переменная".
Все свои make-файлы я пишу с применением оператора ':='. Этот способ кажется мне более удобным и надежным. Вдобавок это более эффективно, так как значение переменной не вычисляется заново каждый раз при ее использовании. Подробнее о двух способах задания переменных можно прочитать в документации на GNU Make в разделе
"The Two Flavors of Variables" .