C++ 模板调用中变量的makefile求值

C++ 模板调用中变量的makefile求值,c++,makefile,C++,Makefile,考虑一下这个简单的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,$(mo

考虑一下这个简单的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\u DEBUG
rule\u OPT
,它们的配方将响应它们的名称和参数。此外,我认为
info
行只需打印
DEBUG-DEBUG
,然后打印
OPT-OPT
。然而,我在这两方面都错了。
info
行日志:

DEBUG 
OPT DEBUG
当我运行
make
时,除了空行之外,我什么也得不到。如果我运行
make-p
,我确实看到了
规则选项的以下内容:

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  
这正是我想要的,但我仍然不知道如何
info
复制
。为什么?

输出问题是我在我的评论中解释的。您有一个评估顺序问题。定义中的赋值只有在定义扩展由
eval
处理后才会发生,因此分配的变量值直到稍后才可见。您需要额外的
eval
或后期
eval
扩展才能完成此操作

或者

$(eval copy      := $(1))
或将内容拆分为多个定义


@echo$(VAR)
的问题是相同的。通过
define
扩展的
eval
进行扩展,并且
$(VAR)
在该点未设置,因此您需要在模板中使用
$(VAR)
来具有文本
$(VAR)
在扩展的配方中,以确保其正确工作并缩短配方执行时间。

谢谢-我想我终于开始了解它了。
$(eval copy      := $(1))