如何将参数传递给makefile配方,或者在解析时解析变量

时间:2013-12-12 01:02:47

标签: gcc makefile gnu-make

我正在处理一个相当复杂的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)

1 个答案:

答案 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)

如果这些还不够,您将不得不更加关注您的实际要求和限制。