我正在处理一个相当复杂的makefile系统,我希望能够将参数传递给配方,或者在解析时解决配方中的变量,而不是在执行时。这是一个简单的例子,说明发生了什么。
生成文件
all : dep_chain
MYVAR := hello
include depchain.mk
MYVAR := world
include depchain.mk
dep_chain : $(DEPCHAIN)
depchain.mk
$(MYVAR) : $(DEPCHAIN)
@echo $(MYVAR)
DEPCHAIN := $(MYVAR)
我想要打印
hello
world
而不是
world
world
换句话说,在食谱@echo $(MYVAR)
中,我希望$(MYVAR)
在解析时解析。或许有人知道另一种传递变量值的方法,该变量可能会在以后更改为配方。
修改
由MadScientist解决的解决方法是将depchain.mk改为:
depchain.mk
$(MYVAR) : MYVAR := $(MYVAR)
$(MYVAR) : $(DEPCHAIN)
@echo $(MYVAR)
DEPCHAIN:= $(MYVAR)
答案 0 :(得分:1)
好吧,我假设您的示例并不能很好地表示您的实际需求,因为如果您真的只想获取目标的名称,则可以使用自动变量($@
) :
$(MYVAR): $(DEPCHAIN)
@echo $@
一般来说,有两种方法可以解决这个问题。第一个是构造变量名,如下所示:
hello_MYVAR = foo
world_MYVAR = bar
$(MYVAR): $(DEPCHAIN)
@echo $($@_MYVAR)
第二个是特定于目标的变量,如下所示:
hello: MYVAR = foo
world: MYVAR = bar
$(MYVAR): $(DEPCHAIN)
@echo $(MYVAR)
如果这些还不够,您将不得不更加关注您的实际要求和限制。