Makefile变量扩展未按预期工作

时间:2019-09-23 19:45:03

标签: makefile

我想基于变量列表(在我的用例中,我要选择性地构建的一组文件)自动创建makefile规则。但是我在扩展名称时遇到问题。

我创建了以下Makefile作为示例(M(not)WE):

| multisearch [search index=$logIndex$ clientApp=KI** enterpriseId=$Environment$ 
tagName=CLIENT_INITIALIZATION storeId=$store$ AND storeId!=$Stores$ 
countryCode=$country$ registerNbr=* message.cart=true | eval 
mytime=strftime(relative_time(strptime(timestamp,"%Y-%m-%dT%H:%M:%S.%3N%Z"),"+3H"),"%H%M") | eval 
filtertop=strftime(relative_time(strptime("0400","%H%M"),"+1H"),"%H%M") | eval 
filterbottom=strftime(relative_time(strptime("0400","%H%M"),"-1H"),"%H%M") | where (mytime >= 
filtertop) or (mytime < filterbottom) | eval marker="boot" ] [ search index=$logIndex$  
clientApp=KIOSK enterpriseId=prod storeId=* AND storeId!=55* countryCode=$country$ 
tagName=RESPONSE_TIMES 
command=finalize  | eval marker="trans" ] | stats count(eval(marker=="boot")) as bootcount 
count(eval(marker=="trans")) as transcount |eval r=(bootcount/transcount)*100 |table r

运行sudo yum install xorg-x11-xauth.x86_64 xorg-x11-server-utils.x86_64 dbus-x11.x86_64 会得到以下输出:

FILES_A=a1 a2 a3
FILES_B=b1 b2 b3
TARGET_BASES=A B

define test
  FILES := $(value FILES_$1)
  build_$1: $(addsuffix .ext, $(FILES))
  build_dummy_$1: $(FILES)
endef

$(foreach target, $(TARGET_BASES), $(eval $(call test,$(target))))

但是我得到了

make -p|grep build

,我不知道为什么。有人可以阐明我在这里缺少什么吗?

1 个答案:

答案 0 :(得分:3)

对eval和call的理解扩展可能会造成混淆。这就是为什么将它们视为高级项目的原因,只有在没有更简单易懂的设施能够解决问题的情况下才应使用它们。

这里的问题是您的宏test首先由call函数求值,然后才传递给eval函数。在该评估期间,尚未设置变量FILES,因此它将解析为上一次eval运行时设置的值:第一次评估为空,第二次评估为之后的结果第一次运行,等等。

基本规则是,要用call扩展的任何变量都应该只有一个$,而要用eval扩展的任何变量都必须转义与$$。所以:

define test
  FILES := $$(value FILES_$1)
  build_$1: $$(addsuffix .ext, $$(FILES))
  build_dummy_$1: $$(FILES)
endef