makefile 中的“@false”和“@true”是什么?

han*_*ans 1 makefile

我在 makefile 中遇到了这种构造:

clean:
    @echo "Cleaning"
ifeq "DEV" "$(VERSION)"
    $(MAKE) clean -C bin/
else
    @echo "Unsupported"
    @false
endif
Run Code Online (Sandbox Code Playgroud)

@false做什么?

附注

谷歌搜索把我带到了这里——他们使用它,但他们没有解释它。

Har*_*nry 5

我将在这里扩展@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 在上面的配方中会失败并中止构建foobar也不会被构建,因为它的依赖关系没有构建,所以你不会看到来自 的回显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,则不会尝试cpecho。正如人们所期望的那样,在失败时让 make 返回非零始终是一种好的做法。