I have a Make variable:
PASSWORD:=$(shell vault read -field=password test/password)
If vault
is not installed, make
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.
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
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.