通过计算名称简单扩展变量的值在配方与外部配方中不同
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
.
我想弄清楚以下行为是 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
.