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

Gcc 如何将参数传递给makefile配方,或在解析时解析变量,gcc,makefile,gnu-make,Gcc,Makefile,Gnu Make,我正在处理一个相当复杂的makefile系统,我希望能够将参数传递给配方,或者在解析时解析配方中的变量,而不是在执行时解析。下面是一个简单的例子 Makefile all : dep_chain MYVAR := hello include depchain.mk MYVAR := world include depchain.mk dep_chain : $(DEPCHAIN) depchain.mk $(MYVAR) : $(DEPCHAIN) @echo $(MYVAR)

我正在处理一个相当复杂的makefile系统,我希望能够将参数传递给配方,或者在解析时解析配方中的变量,而不是在执行时解析。下面是一个简单的例子

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)
$(MYVAR) : MYVAR := $(MYVAR)

$(MYVAR) : $(DEPCHAIN)
    @echo $(MYVAR)

DEPCHAIN:= $(MYVAR)
我想把这个打印出来

hello
world
而不是

world
world
换句话说,在配方
@echo$(MYVAR)
中,我希望
$(MYVAR)
在解析时解析它。或者可能有人知道传递变量值的另一种方法,该变量可能在以后更改为配方

编辑:

MadScientist解决了这个问题,解决方法是如下更改depchain.mk

depchain.mk

$(MYVAR) : $(DEPCHAIN)
    @echo $(MYVAR)

DEPCHAIN := $(MYVAR)
$(MYVAR) : MYVAR := $(MYVAR)

$(MYVAR) : $(DEPCHAIN)
    @echo $(MYVAR)

DEPCHAIN:= $(MYVAR)

好吧,我假设您的示例并不能很好地表示您的实际需求,因为如果您真的只想获得目标的名称,您可以使用自动变量(
$@
)来实现:

$(MYVAR): $(DEPCHAIN)
        @echo $@
通常有两种方法来处理这个问题。第一个是构造变量名,如下所示:

hello_MYVAR = foo
world_MYVAR = bar

$(MYVAR): $(DEPCHAIN)
        @echo $($@_MYVAR)
hello: MYVAR = foo
world: MYVAR = bar

$(MYVAR): $(DEPCHAIN)
        @echo $(MYVAR)
第二个是特定于目标的变量,如下所示:

hello_MYVAR = foo
world_MYVAR = bar

$(MYVAR): $(DEPCHAIN)
        @echo $($@_MYVAR)
hello: MYVAR = foo
world: MYVAR = bar

$(MYVAR): $(DEPCHAIN)
        @echo $(MYVAR)

如果这些还不够,您就必须更坦率地说明您的实际需求和限制。

先生,您真是太棒了。第二个选择正是我想要的。