makefile 中带反斜杠的多行配方和不带反斜杠的多行配方之间的区别

Yul*_* Ao 5 c makefile

在makefile中,有什么区别

targets : prerequisites
        recipe command \
        recipe command \
        ...
Run Code Online (Sandbox Code Playgroud)

targets : prerequisites
        recipe command
        recipe-command
        ...
Run Code Online (Sandbox Code Playgroud)

Eta*_*ner 2

来自GNU Make 手册的第5.3 节配方执行:

当需要执行配方来更新目标时,将通过为配方的每一行调用一个新的子 shell 来执行它们,除非 .ONESHELL 特殊目标有效(请参阅使用一个 Shell)(在实践中,make 可以采取不影响结果的捷径。)

请注意:这意味着设置 shell 变量和调用 shell 命令(例如设置每个进程本地上下文的 cd)不会影响配方中的以下行。2 如果要使用 cd 影响下一条语句,请将这两个语句都放在在一个配方行中。然后make将调用一个shell来运行整行,并且shell将按顺序执行语句。例如:

foo : bar/lose
        cd $(@D) && gobble $(@F) > ../$@
Run Code Online (Sandbox Code Playgroud)

这里我们使用 shell AND 运算符 (&&),这样如果 cd 命令失败,脚本就会失败,而不会尝试在错误的目录中调用 gobble 命令,这可能会导致问题(在这种情况下肯定会导致 ../foo至少被截断)。

反斜杠的使用用于将命令拆分为多行。如本手册第 5.1 节“配方语法”中详细解释的那样。

make 解释配方的几种方法之一是检查换行符之前的反斜杠。与正常的 makefile 语法一样,通过在每个换行符之前放置反斜杠,可以将单个逻辑配方行拆分为 makefile 中的多个物理行。像这样的一系列行被视为单个配方行,并且将调用 shell 的一个实例来运行它。