我有当我执行的Linux工具makefile规则。 我需要检查工具命令的退出状态,如果该命令失败,make也被中止。
我试着用?$ $$检查? \ $? 等在makefile。 但是生成文件运行时,他们给了我语法错误。
什么是这样做的正确方法?
这里是Makefile中的相关规则
mycommand \ if [ $$? -ne 0 ] \ then \ echo "mycommand failed" \ false \ fi
我有当我执行的Linux工具makefile规则。 我需要检查工具命令的退出状态,如果该命令失败,make也被中止。
我试着用?$ $$检查? \ $? 等在makefile。 但是生成文件运行时,他们给了我语法错误。
什么是这样做的正确方法?
这里是Makefile中的相关规则
mycommand \ if [ $$? -ne 0 ] \ then \ echo "mycommand failed" \ false \ fi
在makefile-:
mycommand || (echo "mycommand failed $$?"; exit 1)
在makefile行动的每一行调用一个新的shell - 错误必须在动作行,其中的命令失败进行检查。
如果mycommand的失败逻辑分支到echo语句,然后退出。
这里有几个其他方法:
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命令,用分号分隔的一个字符串。 逃离你想要的任何新行很讨厌,很容易忘记分号,但我用这种方法纯粹是因为上述警告的去了。
如果你想要的是用于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 > $@