我想基于变量列表(在我的用例中,我要选择性地构建的一组文件)自动创建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
,我不知道为什么。有人可以阐明我在这里缺少什么吗?
答案 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