如果分配给变量的shell命令失败,如何使GNU失败?

时间:2018-06-12 12:38:30

标签: makefile gnu-make

我有一个Make变量:

PASSWORD:=$(shell vault read -field=password test/password)

如果未安装vaultmake将打印make: vault: Command not found,但会继续执行配方。如果表达式失败,如何使其失败并停止执行?

3 个答案:

答案 0 :(得分:1)

这是一种方法:

$ cat err.mk
PASSWORD:=$(shell vault read -field=password test/password)
ifndef PASSWORD
$(error PASSWORD not set (maybe vault failed?))
endif
$ make -f err.mk
make: vault: Command not found
err.mk:3: *** PASSWORD not set (maybe vault failed?).  Stop.

答案 1 :(得分:1)

如果您打算使用call function,并且想在一个中心位置中止(以使GET_SECRET的未来用户不要忘记检查.SHELLSTATUS),我发现此黑客很实用:

GET_SECRET = $(shell vault read -field=$(1) $(2) || { echo >&2 "Error reading field $(1) from vault path $(2), aborting"; kill $$PPID; })

make进程因shell错误而被杀死。另请参见225542/how-to-make-a-failing-shell-command-interrupt-make50958731/assign-shell-output-to-variable-or-exit-terminate-makefile

答案 2 :(得分:0)

也许这个想法应该有效:

<div id="wrap-header">

</div>

例如,您可以创建每个(其他)目标所需的X!=lsx / all: ifeq (${.SHELLSTATUS},0) @echo OK else @exit 1 endif PHONY目标。

说明请参阅here

  

使用shell函数或'!='赋值运算符后,退出   status置于.SHELLSTATUS变量中。

check:不起作用,但恕我直言。