继续翻译
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 subshell for each line. *Note 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 *Note The `override' Directive: Override Directive.
你可以嵌套 define 指令:make 将会保持对嵌套的指令的跟踪,并且如果没有正确地以endef 结束将会报告错误。请注意,以片段前缀符号开始的行被认为是片段的一部分,因此任何define 或者 endef 串出现在这样一行不会被认为是 make 指令。
define two-lines =
echo foo
echo $(bar)
endef
在一个普通的赋值当中,使不能包含一个新行的;但是在define中分隔了值的各行的新行成为变量值得一部分(除了在 endef之后的那个新行,此新行不会被认为是值的一部分)。
在片段中使用,上一个例子就会等价于:
two-lines = echo foo; echo $(bar)
因为两个命令用分号分隔,看起来就像两个独立的shell 命令。但是,请注意使用两个独立的意味着 shell 必须被激活两次,为每一个行都要运行一个子shell。*Note Recipe Execution: Execution.
如果你想要使 define中定义的变量获得比命令行中的变量更高的优先级,你可以将define 和 override 指令结合起来使用:
override define two-lines =
foo
$(bar)
endef
*Note The `override' Directive: Override Directive.
后文待续