make: Multi-Line
6.8 Defining Multi-Line Variables
=================================
Another way to set the value of a variable is to use the 'define'
directive. This directive has an unusual syntax which allows newline
characters to be included in the value, which is convenient for defining
both canned sequences of commands (Defining Canned Recipes Canned
Recipes.), and also sections of makefile syntax to use with 'eval'
(Eval Function).
The 'define' directive is followed on the same line by the name of
the variable being defined and an (optional) assignment operator, and
nothing more. The value to give the variable appears on the following
lines. The end of the value is marked by a line containing just the
word 'endef'. Aside from this difference in syntax, 'define' works just
like any other variable definition. The variable name may contain
function and variable references, which are expanded when the directive
is read to find the actual variable name to use.
You may omit the variable assignment operator if you prefer. If
omitted, 'make' assumes it to be '=' and creates a recursively-expanded
variable (The Two Flavors of Variables Flavors.). When using a
'+=' operator, the value is appended to the previous value as with any
other append operation: with a single space separating the old and new
values.
You may nest 'define' directives: 'make' will keep track of nested
directives and report an error if they are not all properly closed with
'endef'. Note that lines beginning with the recipe prefix character are
considered part of a recipe, so any 'define' or 'endef' strings
appearing on such a line will not be considered 'make' directives.
define two-lines =
echo foo
echo $(bar)
endef
The value in an ordinary assignment cannot contain a newline; but the
newlines that separate the lines of the value in a 'define' become part
of the variable's value (except for the final newline which precedes the
'endef' and is not considered part of the value).
When used in a recipe, the previous example is functionally
equivalent to this:
two-lines = echo foo; echo $(bar)
since two commands separated by semicolon behave much like two separate
shell commands. However, note that using two separate lines means
'make' will invoke the shell twice, running an independent sub-shell for
each line. Recipe Execution Execution.
If you want variable definitions made with 'define' to take
precedence over command-line variable definitions, you can use the
'override' directive together with 'define':
override define two-lines =
foo
$(bar)
endef
The 'override' Directive Override Directive.