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