[英]Is there any option to defer the evaluation of a function call in a variadic template
[英]makefile evaluation of variables in template call
考虑这个简单的makefile,它的作用很小:
define template
copy := $(1)
$(info $(1) $(copy))
.PHONY : rule_$(1)
rule_$(1) : VAR := $(1)
rule_$(1) :
@echo $@ $(VAR)
all : rule_$(1)
endef
$(foreach mode,DEBUG OPT, \
$(eval $(call template,$(mode))))
.PHONY : all
.DEFAULT_GOAL := all
我认为这会创建两个规则, rule_DEBUG
和rule_OPT
,它们的配方会与它们的名称和参数相呼应。 此外,我认为info
行只会打印DEBUG DEBUG
然后OPT OPT
。 但是,我在这两个方面都错了。 info
行记录:
DEBUG
OPT DEBUG
当我运行make
,我只得到空行。 如果我运行make -p
,我确实看到了rule_OPT
:
rule_OPT:
# Phony target (prerequisite of .PHONY).
# Implicit rule search has not been done.
# Implicit/static pattern stem: `'
# File does not exist.
# File has been updated.
# Successfully updated.
# automatic
# @ := rule_OPT
# makefile (from `makefile', line 10)
# VAR := OPT
# automatic
# % :=
# automatic
# * :=
# automatic
# + :=
# automatic
# | :=
# automatic
# < :=
# automatic
# ^ :=
# automatic
# ? :=
# variable set hash-table stats:
# Load=9/32=28%, Rehash=0, Collisions=1/12=8%
# recipe to execute (from `makefile', line 10):
@echo
看起来@
和VAR
具有我想要和期望的值 - 但为什么它没有正确echo
? 看起来如果我有食谱:
rule_$(1) :
@echo $$@ $$(VAR)
这与我想要的相呼应,但我仍然不确定如何为copy
提供info
。 为什么?
$(info)
输出问题是我在我的这个答案的评论中所解释的。 你有一个评估顺序问题。 在定义扩展由eval
处理之前,定义中的赋值不会发生,因此您分配的变量值直到稍后才可见。 你需要额外的eval
或 post- eval
扩展来做到这一点。
任何一个
$(eval copy := $(1))
在模板中或将内容拆分为多个定义。
@echo $(VAR)
是一样的。 这是由define
的扩展的eval
扩展的,并且此时$(VAR)
未设置,因此您需要模板中的$$(VAR)
在扩展配方中有文字$(VAR)
以便它工作正确和配方执行时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.