通过计算名称简单扩展变量的值在配方与外部配方中不同

value of simply-expanded variable via computed name is different in recipe vs outside recipe

我想弄清楚以下行为是 Make 中的错误,还是设计的一部分(如果是这样,我在任何地方都找不到它的记录)。我尝试过的旧版和新版 GNU Make 都会出现这种情况。

简而言之,该行为是在调用配方时对配方中的计算名称变量进行求值,而不是在文件中定义配方的位置,即使变量只是-扩展(“:=”,与递归扩展“=”相对)(我不认为这很重要)。

复制代码:


a_name := alpha
b_name := beta

AB := a

target1 : $($(AB)_name)
        echo $^
        echo $($(AB)_name)

alpha : ;

beta : ;

AB := b

target2 : target1 ;

调用后 make target2

我期望的输出:

alpha
alpha

实际输出:

alpha
beta

您需要阅读 3.7 How make Reads a Makefile 才能理解您所看到的内容。

读完后,您会发现关键部分是:

Rule Definition

A rule is always expanded the same way, regardless of the form:

immediate : immediate ; deferred
        deferred

在那种光线下你会看到:

target1 : $($(AB)_name)

在您的 makefile 中立即展开,当它在第 1 阶段被读取时。 那时 AB 的定义是 a,所以 $($(AB)_name) 展开 到 $(a_name),然后到 alpha

alpha$^ 的先决条件 扩展,延迟,在第 2 阶段,在配方中,所以:

echo $^

在食谱中会回显 alpha

食谱中的下一行:

echo $($(AB)_name)

也被延迟扩展,在第 2 阶段,在整个 makefile 之后 已阅读。那时 AB 拥有它的 final 定义 第 1 阶段是 b,所以此处 $($(AB)_name) 扩展为 $(b_name), 然后到 beta。所以这行菜谱呼应了beta.