带反斜杠的多行配方与makefile中没有反斜杠的多行配方之间的区别

时间:2014-12-19 04:34:16

标签: c makefile

在makefile中,

之间有什么区别
targets : prerequisites
        recipe command \
        recipe command \
        ...

targets : prerequisites
        recipe command
        recipe-command
        ...

2 个答案:

答案 0 :(得分:4)

当通过使用反斜杠转义换行来连接多行时,它们将在同一个shell中运行。如果使用shell变量,这可能很重要。当每个命令出现在它自己的行上时,它们将分别在新shell中运行。

答案 1 :(得分:0)

从GNU Make手册的5.3 Recipe Execution部分:

  

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

     

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

foo : bar/lose
        cd $(@D) && gobble $(@F) > ../$@
     

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

反斜杠的使用用于在多行上分割命令。正如本手册5.1 Recipe Syntax一节中详细解释的那样。

  

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