如果分配给变量的 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)
如果未安装vault
,make
将打印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
我有一个 Make 变量:
PASSWORD:=$(shell vault read -field=password test/password)
如果未安装vault
,make
将打印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