繁体   English   中英

模板调用中变量的 makefile 评估

[英]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_DEBUGrule_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM