How to make GNU Make fail if a shell command assig

2020-02-13 07:23发布

I have a Make variable:

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

If vault is not installed, make will print make: vault: Command not found, but continue executing the recipe. How do I make it fail and stop execution if the expression fails?

3条回答
做自己的国王
2楼-- · 2020-02-13 08:00

Maybe this idea should work:

X!=lsx /

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

For example you can create a check: PHONY-target which is needed by every (other) target.

Explanation see here:

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

The X=$(shell ls /) doesn't work but IMHO should.

查看更多
ゆ 、 Hurt°
3楼-- · 2020-02-13 08:10

Here is one approach:

$ 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.
查看更多
Juvenile、少年°
4楼-- · 2020-02-13 08:21

In case you are intending to use a call function, and want to abort at one central place (so that future users of GET_SECRET do not forget to check e.g. .SHELLSTATUS), I found this hack practical:

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

The parent make process is killed of shell error. See also 225542/how-to-make-a-failing-shell-command-interrupt-make and 50958731/assign-shell-output-to-variable-or-exit-terminate-makefile

查看更多
登录 后发表回答