如何获得在GNU Makefile中使用的shell命令的退出状态?(How to get exit

2019-09-01 14:23发布

我有当我执行的Linux工具makefile规则。 我需要检查工具命令的退出状态,如果该命令失败,make也被中止。

我试着用?$ $$检查? \ $? 等在makefile。 但是生成文件运行时,他们给了我语法错误。

什么是这样做的正确方法?

这里是Makefile中的相关规则

  mycommand \ if [ $$? -ne 0 ] \ then \ echo "mycommand failed" \ false \ fi 

Answer 1:

在makefile-:

mycommand || (echo "mycommand failed $$?"; exit 1)

在makefile行动的每一行调用一个新的shell - 错误必须在动作行,其中的命令失败进行检查。

如果mycommand的失败逻辑分支到echo语句,然后退出。



Answer 2:

这里有几个其他方法:


shell.SHELLSTATUS

some_recipe:
    @echo $(shell echo 'doing stuff'; exit 123)
    @echo 'command exited with $(.SHELLSTATUS)'
    @exit $(.SHELLSTATUS)

输出:

$ make some_recipe

doing stuff
command exited with 123      
make: *** [Makefile:4: some_recipe] Error 123

它确实有需要提醒的是在shell命令输出不流,所以你刚刚结束了一个转储当它完成到标准输出。


$?

some_recipe:
    @echo 'doing stuff'; exit 123;\
    EXIT_CODE=$$?;\
    echo "command exited with $$EXIT_CODE";\
    exit $$EXIT_CODE

输出:

$ make some_recipe

doing stuff                  
command exited with 123      
make: *** [Makefile:2: some_recipe] Error 123

它本质上是shell命令,用分号分隔的一个字符串。 逃离你想要的任何新行很讨厌,很容易忘记分号,但我用这种方法纯粹是因为上述警告的去了。



Answer 3:

如果你想要的是用于make到当且仅当工具退出非零状态被中止, make将已经这样做,默认情况下。

例如Makefile

a: b
    @echo making $@
b:
    @echo making $@
    @false
    @echo already failed

。 这是与我发生了什么make

$ make
making b
make: *** [Makefile:6: b] Error 1

确保部分或全部创建的目标是在你失败的情况下删除。 例如,这

a: b
    @gena $+ > $@
b:
    @genb > $@

不正确:如果在第一次尝试, genb失败,它可能会留下一个不正确的b ,其中,在第二次尝试, make假定是正确的。 所以,你需要做这样的事情

a: b
    @gena $+ > $@ || { rm $@; exit 1; }
b:
    @genb > $@


文章来源: How to get exit status of a shell command used in GNU Makefile?