Эффективное использование GNU Make

       

Две разновидности переменных


GNU Make поддерживает два способа задания переменных, которые несколько различаются по смыслу. Первый способ - традиционный, с помощью оператора '=': compile_flags = -O3 -funroll-loops -fomit-frame-pointer Такой способ поддерживают все варианты утилиты make. Его можно сравнить, например, с заданием макроса в языке Си. #define compile_flags "-O3 -funroll-loops -fomit-frame-pointer" Значение переменной, заданной с помощью оператора '=', будет вычислено в момент ее использования. Например, при обработке make-файла: var1 = one var2 = $(var1) two var1 = three all: @echo $(var2) на экран будет выдана строка "three two". Значение переменной var2 будет вычислено непосредственно в момент выполнения команды echo, и будет представлять собой текущее значение переменной var1, к которому добавлена строка " two". Как следствие - одна и та же переменная не может одновременно фигурировать в левой и правой части выражения, так как это может привести к бесконечной рекурсии. GNU Make распознает подобные ситуации и прерывает обработку make-файла. Следующий пример вызовет ошибку: compile_flags = -pipe $(compile_flags)

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" .

Содержание раздела