首先有几件事:
.PHONY=a
不执行任何操作:变量.PHONY
并不是特别做的。要声明目标假冒,您需要将其列为先决条件.PHONY
伪目标:
.PHONY: a
其次,这一行:
$(shell test -f $(1) || exit 1)
不执行任何操作:make 变量$(1)
此处未设置,因此test
总是失败,但这并不重要,因为退出代码被忽略,见下文。
make 的退出代码shell
function 不会导致 make 失败,它会被忽略。要使 make 认为配方失败,您必须让命令行本身以非零值退出。
一个好的经验法则是,如果您发现自己使用 makeshell
如果你在菜谱中使用函数,你就做错了,而且你不理解 make 如何扩展变量和函数。配方已经被传递到 shell,所以你不需要使用shell
根本没有功能。
让我们看看在第一步扩展之后您的配方是什么token
多变的:
echo ==== $(call get_token,$(vaultfile),tokenname)
现在之后call
函数被扩展(注意函数的第二个参数,tokenname
,被完全忽略)你得到:
echo ==== $(shell test -f ./vault && cat ./vault || exit 2)
现在 make 扩展了 shell 函数,该函数调用 shell 来运行命令并用输出替换扩展...但退出代码被忽略。这么说吧./vault
不存在:则此 shell 命令不输出任何内容,并且 make 运行此规则:
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))
现在 make 评估if
函数和条件是wildcard
函数将扩展为./vault
如果存在,则为空字符串。这if
函数将非空字符串视为“true”,将空字符串视为“false”,因此如果文件存在,它将扩展为:
echo ==== `cat ./vault`
如果该文件不存在,它将运行error
立即停止 make 的函数,打印该错误消息。