【问题标题】:Partially expanding recursively expanded variables部分扩展递归扩展变量
【发布时间】:2019-01-26 00:40:01
【问题描述】:

考虑以下 makefile 示例:

all:;

varname := a

val = $($(varname)-value)

a-value := AAA
b-value := BBB

$(info val: $(val))
varname := b
$(info val: $(val))

正如预期的那样,在这个 makefile 上运行 make 会导致:

val: AAA
val: BBB

由于valrecursively expanded variable,它的扩展发生在引用时(即$(val))。

在定义变量val的时候,变量a-value还没有定义。因此,将val 定义为simply expanded variable(即用:= 代替=):

val := $($(varname)-value) 

导致$($(varname)-value)立即展开为一个空字符串,这反过来又导致一个空的$(val)

我想知道是否有办法立即val的定义中扩展varname,但推迟结果的扩展直到val引用的时刻,就好像val 实际上在上面的makefile中被定义为:

val = $(a-value) 

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    好吧,你可以这样做:

    simplevar := $(varname)
    val = $($(simplevar)-value)
    

    【讨论】:

    • 所以,诀窍在于在引用时创建一个额外的间接级别,不是吗?
    • 有点,虽然因为simplevar 立即展开,你并没有真正引入另一个级别的间接。更像是您将间接分为两部分,因此它们可以有不同的处理方式。将要立即扩展的部分分解为单独的立即变量。当然,这可能有一些原因不能很好地工作,但这些在您的问题中并不明显。
    • This tutorial,是你写的,其实和我的问题有点关系。在标题为扩展是单次传递的部分中:重要的是要理解,make 在扩展过程中会准确地遍历每个字符串一次。当它遍历字符串时,它将扩展它发现的任何宏引用(它本身可能需要进一步扩展),然后继续。
    • 感谢您的回答和进一步阐述。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 2016-11-11
    相关资源
    最近更新 更多