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

How to make GNU Make fail if a shell command assigned to a variable failed?

我有一个 Make 变量:

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

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

这是一种方法:

$ 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.

也许这个想法应该可行:

X!=lsx /

all:
ifeq (${.SHELLSTATUS},0)
    @echo OK
else
    @exit 1
endif

例如,您可以创建每个(其他)目标都需要的 check: PHONY 目标。

解释见here:

After the shell function or ‘!=’ assignment operator is used, its exit status is placed in the .SHELLSTATUS variable.

X=$(shell ls /) 不起作用,但恕我直言。

如果您打算使用 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-make and