2017-10-18 67 views
0

我有,我想停下来,如果文件不存在运行整个化妆生成文件的功能,或者至少目标是从执行:如何获得makefile函数来停止当前目标?

vaultfile = ./vault 

$(shell test -f $(1) || exit 1) 

define get_token 
$(shell test -f $1 && cat $1 || exit 2) 
endef 

a: token = $(call get_token,$(vaultfile),tokenname) 
a: 
     echo ==== $(token) 
.PHONY=a 

以上不工作,当文件丢失

$ rm vault 
$ make 
echo ==== 
==== 
$ echo f > vault 
$ make 
echo ==== f 
==== f 

默默地失败我想这是在功能,因为大部分目标不调用函数(这显然做更多IRL)。

我该如何做这项工作?

回答

0

首先的几件事情:

.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` 

如果文件不存在,它将运行立即停止制作的功能,打印该错误信息。

0

谢谢MadScientist

什么我结束了简化的版本是:(格式化的可读性更强)

vaultfile = ./vault 

define get_token 
$(shell \ 
$(if $(wildcard $1), \ 
echo "Decoded $1" \ 
, \ 
$(error File $1 does not exist) 
) 
) 
endef 

a: token = $(call get_token,$(vaultfile)) 
a: 
     echo ==== $(token) 
相关问题