【问题标题】:How to pass parameters to a makefile recipe, or resolve variables at parse time如何将参数传递给 makefile 配方,或在解析时解析变量
【发布时间】:2013-12-12 01:02:46
【问题描述】:

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

【问题讨论】:

    标签: gcc makefile gnu-make


    【解决方案1】:

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

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

    通常有两种方法可以处理此问题。首先是构造变量名,像这样:

    hello_MYVAR = foo
    world_MYVAR = bar
    
    $(MYVAR): $(DEPCHAIN)
            @echo $($@_MYVAR)
    

    第二个是目标特定的变量,像这样:

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

    如果这些还不够,您将不得不更加坦率地了解您的实际要求和限制。

    【讨论】:

    • 你,先生,太棒了。第二个选项正是我想要的。
    猜你喜欢
    • 2017-02-05
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 2020-08-21
    • 2021-01-07
    • 2019-03-01
    • 2011-02-27
    • 1970-01-01
    相关资源
    最近更新 更多