簡體   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