Файлы Makefile обладают необычным свойством: в одном файле фактически и действует два совершенно разных синтаксиса. По большей части это синтаксис make (см. "3 Writing Makefiles" [1]). Однако команды цели (recipe) предназначены для интерпретации шеллом, и они пишутся в синтаксисе скриптов shell (bash или sh). Утилита make не пытается парсить синтаксис shell: она выполняет только очень специфические трансляции содержимого recipe перед передачей этого в shell.
Важное правило: каждая строка recipe обязательно должна начинаться с символа табуляции (либо значение первого символа должно совпадать со значением переменной .RECIPEPREFIX; см. "6.14 Other Special Variables" [1]), за исключением того, что первая строка recipe может быть присоединена к строке цели и и предварительных условий (target-and-prerequisites) с точкой с запятой между ними. Любая строка в makefile, которая начинается с табуляции и появляется в "контексте правила" (то есть после того, как правило было запущено до другого определения правила или переменной), будет считаться частью recipe для этого правила. Пустые строки и строки только комментариев могут появиться среди строк recipe; они игнорируются.
Некоторые последствия этих правил включают в себя:
• Пустая строка, которая начинается на символ табуляции, на самом деле не пустая: это empty recipe (см. "5.9 Using Empty Recipes" [1]). • Комментарий в recipe это не комментарий make; он передается в shell как есть. Будет ли эта строка обработана как комментарий или как-то иначе зависит от вашего shell. • Определение переменной в "контексте правила", которое идет за символом табуляции в первом символе строки, будет считаться частью recipe, но не определением переменной make, и это определение будет передано в shell. • Условные выражения (ifdef, ifeq и т. п., см. "7.2 Syntax of Conditionals" [1]) в "контексте правила", которые идут за символом табуляции в первой позиции строки, считаются частью recipe, и будут переданы в shell.
См. также:
• 5.1.1 Splitting Recipe Lines [1]. • 5.1.2 Using Variables in Recipes [1].
[Ссылки]
1. GNU make. 2. Магия makefile на простых примерах. 3. Makefile: синтаксис команд цели (recipe syntax). |