如果命令失败,不要停止 make'ing,而是检查退出状态

如果命令失败,不要停止 make'ing,而是检查退出状态

我试图指示 GNU Make 3.81 在命令失败时不要停止(因此我在命令前加上-),但我还想检查下一个命令的退出状态并打印更多信息。但是我的 Makefile 下面失败了:

$ cat Makefile 
all:
    -/bin/false
    ([ $$? -eq 0 ] && echo "success!") || echo "failure!"
$
$ make
/bin/false
make: [all] Error 1 (ignored)
([ $? -eq 0 ] && echo "success!") || echo "failure!"
success!

为什么上面的 Makefile 会回显“成功!”而不是“失败!” ?

更新:

遵循并扩展已接受的答案,下面是它的写法:

failure:                                                                                                                                                                                                                                      
    @-/bin/false && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"                                                                                                                                                                 
success:                                                                                                                                                                                                                                      
    @-/bin/true && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"     

答案1

规则中的每个更新命令都Makefile在单独的 shell 中执行。因此不包含先前失败命令的退出状态,它包含新 shell 中$?的默认值。$?这就是为什么你的[ $? -eq 0 ]测试总是成功的。

答案2

您不需要进行测试,$?因为&&如果$?为零,则有效;||如果返回值非零,则继续进行。

并且您不需要减号,因为 make 的返回值是从该行的最后一个进行程序调用中获取的。所以这很好用

失败:

      @/bin/false && echo "success!" || echo "failure!" 

成功:

      @/bin/true && echo "success!" || echo "failure!"

相反的情况会发生:如果您想执行自己的消息并希望使用非零值来中断 make 过程,则需要编写如下内容:

失败:

      @/bin/false && echo "success!" || { echo "failure!"; exit 1; }

答案3

GNU make 文档:

当由于“-”或“-i”标志而要忽略错误时,make 将错误返回视为成功,只不过它会打印一条消息,告诉您 shell 退出时的状态代码,并表示错误已被忽略。

make在这种情况下利用 的退出状态,请make从脚本执行:

#!/bin/bash
make
([ $? -eq 0 ] && echo "success!") || echo "failure!"

并让你的 Makefile 包含:

all:
    /bin/false

答案4

我最终是这样做的:

.PHONY: test-cleanup
test-cleanup:
    $(eval CLEANUP = echo "Some cleanup procedure")
    @/bin/true && touch _testok || $(CLEANUP) ;\
    if [ -f "_testok" ]; then \
        rm -f _testok ;\
        echo "What a success!" ;\
    else \
        echo "Failure :-(" ;\
        exit 1 ;\
    fi

哪个打印:

What a success!

如果更改/bin/true为,/bin/false则会得到以下输出:

Some cleanup procedure
Failure :-(
make: *** [Makefile:4: test-cleanup] Error 1

相关内容