首先的几件事情:
.PHONY=a
不会做任何事情:变量.PHONY
不是特别制作。要声明,你需要列出它作为.PHONY
伪目标的先决条件的目标假冒:
.PHONY: a
其次,这条线:
$(shell test -f $(1) || exit 1)
不会做任何事情:make变量$(1)
不这里设置test
总是失败,但这并不重要,因为退出代码被忽略,请参阅下文。
make shell
函数的退出代码不会导致make失败,它会被忽略。要使认为配方失败,你必须让命令行本身以非零值退出。
一个很好的经验法则是,如果你发现自己在配方中使用make shell
函数,那么你做错了一些事情,而且你不了解如何扩展变量和函数。一个配方已经被传递给一个shell,所以你根本不需要使用shell
函数。
让我们看一下你的食谱是什么扩张的第一步后,为token
变量:
echo ==== $(call get_token,$(vaultfile),tokenname)
现在call
功能扩展后(注意,第二个参数的功能,tokenname
,完全忽略)你:
echo ==== $(shell test -f ./vault && cat ./vault || exit 2)
现在让扩展它调用一个shell来运行命令,并替换输出扩展外壳功能......但退出代码灌胃接异。比方说,./vault
不存在:那么这个shell命令输出什么,并运行此规则:
echo ====
最好的办法来阻止整个make运行使用error
功能。您可以使用make功能来完成所有的工作,像这样:
vaultfile = ./vault
get_token = $(if $(wildcard $1),`cat $1`,$(error File $1 does not exist))
a: token = $(call get_token,$(vaultfile),tokenname)
a:
echo ==== $(token)
让我们来看看什么call
扩张的结果现在是:
echo ==== $(if $(wildcard ,/vault),`cat ./vault`,$(error File ./vault does not exist))
现在做出评估if
功能和条件是wildcard
函数,如果它存在,将扩展到./vault
,如果不存在,则为空字符串。该if
函数将一个非空字符串作为“真”和一个空字符串为“假”,因此,如果该文件存在,它会扩展为:
echo ==== `cat ./vault`
如果文件不存在,它将运行立即停止制作的功能,打印该错误信息。