我在 makefile 中遇到了这种构造:
clean:
@echo "Cleaning"
ifeq "DEV" "$(VERSION)"
$(MAKE) clean -C bin/
else
@echo "Unsupported"
@false
endif
Run Code Online (Sandbox Code Playgroud)
在@false做什么?
附注
谷歌搜索把我带到了这里——他们使用它,但他们没有解释它。
我将在这里扩展@kabanus 的答案(这对于评论来说太长了......)
首先,该@符号只是告诉 make 不要将命令回显到标准输出。因此,配方false和@false将执行相同的操作,只是只有第一个会回显正在运行的命令。
接下来,当 make 构建目标时,它将逐行运行每个配方。如果配方行返回非零(假),它将停止构建目标(它不会执行超出该目标的任何配方)。同样,它会认为目标构建失败,任何依赖于它的东西也会失败,因此 make 通常会失败,返回非零状态。
因此,如果您make bar使用 makefile:
foo:
@echo this will be printed '(foo)'
@false
@echo this will not be printed '(foo)'
bar: foo
@echo this will not be printed '(bar)'
Run Code Online (Sandbox Code Playgroud)
第二个 echofoo不会出现,因为 make 在上面的配方中会失败并中止构建foo。 bar也不会被构建,因为它的依赖关系没有构建,所以你不会看到来自 的回显bar。
请注意,如果您确实有一个配方行,您知道它可能会失败,但您想忽略,则可以通过在其前面添加 - 来解决此问题,如下所示:
foo:
@echo this will be printed '(foo)'
-@false
@echo this will also be printed '(foo)'
Run Code Online (Sandbox Code Playgroud)
这将产生两种回声。它将运行false,它不执行任何操作,但随后由于-符号而忽略它的返回值。有关详细信息,请参阅此问题
最后,make 命令的返回值也将影响&&and||运算符以及if语句。通常在脚本中您会看到类似以下内容:
make foo && cp foo /tftpboot/foo && echo success
Run Code Online (Sandbox Code Playgroud)
如果 make 返回 false,则不会尝试cp或echo。正如人们所期望的那样,在失败时让 make 返回非零始终是一种好的做法。
| 归档时间: |
|
| 查看次数: |
6228 次 |
| 最近记录: |