Gcc 如何将参数传递给makefile配方,或在解析时解析变量
我正在处理一个相当复杂的makefile系统,我希望能够将参数传递给配方,或者在解析时解析配方中的变量,而不是在执行时解析。下面是一个简单的例子 MakefileGcc 如何将参数传递给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)
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)
如果这些还不够,您就必须更坦率地说明您的实际需求和限制。先生,您真是太棒了。第二个选择正是我想要的。