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

Makefile 如果分配给变量的shell命令失败,如何使GNU make失败?,makefile,gnu-make,Makefile,Gnu Make,我有一个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 $(er

我有一个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.
以下是一种方法:

$ 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
例如,您可以创建每个(其他)目标都需要的
检查:
假目标

说明见:

在shell函数或“!=”之后如果使用赋值运算符,则其退出 状态被放置在.SHELLSTATUS变量中


X=$(shell ls/)
不起作用,但我应该这样做。

也许这个想法应该起作用:

X!=lsx /

all:
ifeq (${.SHELLSTATUS},0)
    @echo OK
else
    @exit 1
endif
例如,您可以创建每个(其他)目标都需要的
检查:
假目标

说明见:

在shell函数或“!=”之后如果使用赋值运算符,则其退出 状态被放置在.SHELLSTATUS变量中


X=$(shell ls/)
不起作用,但我应该这样做。

如果您打算使用a,并希望在一个中心位置中止(以便
的未来用户获取u 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
错误而终止。另请参见和

如果您打算使用,并希望在一个中心位置中止(以便
获取机密
的未来用户不要忘记检查,例如
.SHELLSTATUS
),我发现此黑客很实用:

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

make
进程因
shell
错误而终止。另请参见和

如果您有一个足够新的GNU make,您可以使用它来代替
ifndef
$(或$(密码),$(错误密码未设置))
,这稍微好一点(IMO)。如果您有足够新的GNU make,您可以使用它来代替
ifndef
$(或$(密码),$(错误密码未设置))
哪一个更容易阅读(IMO)。测试
保险库是否存在(例如,使用
哪个保险库
在配方之外)是可行的解决方案?测试
保险库是否存在(例如,使用
哪个保险库
在配方之外)是可行的解决方案?