![](/img/trans.png)
[英]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.