“什么是”呢@假;及@“真的”;在makefile中?

“什么是”呢@假;及@“真的”;在makefile中?,makefile,Makefile,我在makefile中遇到了这种构造: clean: @echo "Cleaning" ifeq "DEV" "$(VERSION)" $(MAKE) clean -C bin/ else @echo "Unsupported" @false endif foo: @echo this will be printed '(foo)' @false @echo this will not be printed '(foo)' bar: f

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

clean:
    @echo "Cleaning"
ifeq "DEV" "$(VERSION)"
    $(MAKE) clean -C bin/
else
    @echo "Unsupported"
    @false
endif
foo:
    @echo this will be printed '(foo)'
    @false
    @echo this will not be printed '(foo)'

bar: foo
    @echo this will not be printed '(bar)'
@false
在做什么

p、 美国


Google给我带来了一个例子-他们使用它,但他们没有解释它。

当你运行Makefile的那部分时(即
makeclean
),默认情况下,状态代码为0(成功),因为echo不会失败。
@false
调用shell内置的(现在是天)
false
,它只会失败,因此最后一个命令失败(通常将状态代码设置为1)

因此,如果在以不受支持的模式运行
make
后检查状态代码(
$?
),则可以看到故障。我认为这是一个很好的编码实践
@true
是相同的,但返回0-这是不必要的,因为其他命令的成功将返回0

bash中的一个示例用例:

make clean VERSION=somethingThatIsntSupported
if [ $? -gt 0 ]; then echo "Oh no! Make failed, are you sure that version is OK?"; fi

当然,这在这里是多余的,但是如果的内容可能会很复杂。

当您运行Makefile的该部分时(即makeclean),默认情况下,状态代码将为0(成功),因为echo不会失败。
@false
调用shell内置的(现在是天)
false
,它只会失败,因此最后一个命令失败(通常将状态代码设置为1)

因此,如果在以不受支持的模式运行
make
后检查状态代码(
$?
),则可以看到故障。我认为这是一个很好的编码实践
@true
是相同的,但返回0-这是不必要的,因为其他命令的成功将返回0

bash中的一个示例用例:

make clean VERSION=somethingThatIsntSupported
if [ $? -gt 0 ]; then echo "Oh no! Make failed, are you sure that version is OK?"; fi
当然,这在这里是多余的,但是
if
的内容可能会很复杂。

我将在这里进行扩展(这对于注释来说太长了…)

首先,
@
符号只是告诉make不要将命令回显到stdout。因此,配方
false
@false
将执行相同的操作,但只有第一个将响应正在运行的命令

接下来,当make构建一个目标时,它将逐行运行每个配方。如果配方行返回非零(false),它将停止构建目标(它不会执行超出该配方的任何配方)。同样,它会考虑目标建筑失败,并且依赖它的任何东西也将失败,从而使一般将失败,返回非零状态。 因此,如果您使用makefile制作了
条形图

clean:
    @echo "Cleaning"
ifeq "DEV" "$(VERSION)"
    $(MAKE) clean -C bin/
else
    @echo "Unsupported"
    @false
endif
foo:
    @echo this will be printed '(foo)'
    @false
    @echo this will not be printed '(foo)'

bar: foo
    @echo this will not be printed '(bar)'
foo
中的第二个回声将不会出现,因为make将在其上方的配方中失败,并中止构建
foo
<代码>栏也不会生成,因为它的依赖项未生成,因此您将不会看到来自
的回音

请注意,如果您确实知道某个配方行可能会失败,但希望忽略该行,则可以通过在其前面添加-来避免此行为,如下所示:

foo:
    @echo this will be printed '(foo)'
    -@false
    @echo this will also be printed '(foo)'
这将做两个回声。它将运行
false
,它不执行任何操作,但由于
-
符号,它将忽略它的返回值。有关详细信息,请参阅

最后,make命令的返回值还将影响
&&
|
运算符以及
if
语句。通常在脚本中,您会看到如下内容:

 make foo && cp foo /tftpboot/foo && echo success
如果make返回false,它将不会尝试
cp
echo
。正如人们所期望的那样,在失败时将返回值设为非零始终是一种良好的做法。

我将在这里进行扩展(这太长了,无法发表评论…)

首先,
@
符号只是告诉make不要将命令回显到stdout。因此,配方
false
@false
将执行相同的操作,但只有第一个将响应正在运行的命令

接下来,当make构建一个目标时,它将逐行运行每个配方。如果配方行返回非零(false),它将停止构建目标(它不会执行超出该配方的任何配方)。同样,它会考虑目标建筑失败,并且依赖它的任何东西也将失败,从而使一般将失败,返回非零状态。 因此,如果您使用makefile制作了
条形图

clean:
    @echo "Cleaning"
ifeq "DEV" "$(VERSION)"
    $(MAKE) clean -C bin/
else
    @echo "Unsupported"
    @false
endif
foo:
    @echo this will be printed '(foo)'
    @false
    @echo this will not be printed '(foo)'

bar: foo
    @echo this will not be printed '(bar)'
foo
中的第二个回声将不会出现,因为make将在其上方的配方中失败,并中止构建
foo
<代码>栏也不会生成,因为它的依赖项未生成,因此您将不会看到来自
的回音

请注意,如果您确实知道某个配方行可能会失败,但希望忽略该行,则可以通过在其前面添加-来避免此行为,如下所示:

foo:
    @echo this will be printed '(foo)'
    -@false
    @echo this will also be printed '(foo)'
这将做两个回声。它将运行
false
,它不执行任何操作,但由于
-
符号,它将忽略它的返回值。有关详细信息,请参阅

最后,make命令的返回值还将影响
&&
|
运算符以及
if
语句。通常在脚本中,您会看到如下内容:

 make foo && cp foo /tftpboot/foo && echo success

如果make返回false,它将不会尝试
cp
echo
。正如人们所期望的那样,在失败时将返回值设为非零始终是一种良好的做法。

顺便说一句,您可以进一步跟踪您的链接,这可能会给出一个提示。顺便说一句,您可以进一步跟踪您的链接,这可能会给出一个提示。好的,因此它将sens作为子句中的最后一个命令。用例是什么?@hans如前所述-因此在某些脚本中运行make的代码可以检查
$?
并查看是否失败-如果需要,可以执行一些操作。好的,因此它将sens作为子句中的最后一个命令。用例是什么?@hans如前所述-因此,在某些脚本中运行make的代码可以检查
$?
并查看是否失败-如果需要,可以执行一些操作。感谢您提供了非常完整的答案。它还解释了配方
mv…
af