在makefile中,
targets : prerequisites
recipe command \
recipe command \
...和
targets : prerequisites
recipe command
recipe-command
...发布于 2014-12-19 04:38:57
来自GNU手册的5.3配方执行部分:
当执行菜谱以更新目标时,将通过为菜谱的每一行调用一个新的子Shell来执行它们,除非.ONESHELL特殊目标生效(请参见使用一个Shell) (实际上,make可能采用不影响结果的快捷方式)。 请注意:这意味着设置shell变量和调用shell命令(如为每个进程设置本地上下文的cd )不会影响接收程序中的下列行。2如果要使用cd来影响下一条语句,请将这两条语句放在一条菜谱行中。然后make将调用一个shell来运行整个行,shell将按顺序执行这些语句。例如: foo : bar/lose $(@D) && gobble $(@F) > ../$@ 在这里,我们使用shell和操作符(&&),这样如果cd命令失败,脚本就会失败,而不会试图在错误的目录中调用gobble命令,这可能会导致问题(在这种情况下,它肯定会导致../foo被截断)。
反斜杠用于将命令拆分为多行。如手册5.1配方语法部分所详细说明的那样。
make解释菜谱的少数几种方法之一是在换行符前检查反斜杠。与普通makefile语法一样,通过在每个换行符前面放置反斜杠,可以将单个逻辑配方行拆分为makefile中的多个物理行。像这样的一系列行被认为是一个单独的菜谱行,将调用shell的一个实例来运行它。
发布于 2014-12-19 04:36:30
当通过用反斜杠转义换行符连接多行时,它们都将在同一个shell中运行。如果使用shell变量,这可能很重要。当每个命令出现在自己的行中时,它们都将在一个新的shell中运行。
https://stackoverflow.com/questions/27559778
复制相似问题