来自docs:
出现在的所有变量 VARIABLE-ASSIGNMENT在目标范围内进行评估: 因此,任何先前定义的特定于目标的变量值都将在 影响。请注意,此变量实际上不同于任何"全局" value:这两个变量不必具有相同的风格(递归 与简单相比)。
所以,给定一个makefile:
% : foo += 1
all : x;
x ::
@echo '$(foo)'
foo := 2
正在运行,我得到:
2 1 1
仔细看看上面的引文:
出现在的所有变量 VARIABLE-ASSIGNMENT在目标范围内进行评估。
无法解释 特定于目标的 定义如何:% : foo += 1
,最终会在其中包含 include 价值,"全球" (即不是目标或模式特定的)值:2
。
当我们稍后看时,在上面的引文中很难证明它是正确的:
请注意,此变量实际上来自任何" global" distinct value:这两个变量不必具有相同的风格(递归 与简单相比)。
如果,那是"不同的",为什么Make最终会扩展到目标all
,这是一个"沙拉"取自" global"以及来自特定目标定义的值?
使用什么方法来制作价值2 1 1
,因为很明显,值1
继续上面的makefile中的值2
。
答案 0 :(得分:1)
我相信你只是误解了“独特”的意思。它没有意味着它们是两个不同的变量。通过以下片段澄清了含义“两个变量不必具有相同的味道”。这才是重点。全局变量foo
和特定于目标的变量foo
是两个不同的(但在扩展时组合)变量。
考虑到这一点,你得到的输出正是你所期望的。
分配给foo
的第一个事物是全局作业中的值2
。
之后,在目标处理过程中,处理了foo += 1
作业(两次,all
一次,x
一次)。
完全如图所示,您将2 1 1
。