是"全球" makefile变量与特定于目标的变量不同?

时间:2015-08-19 09:24:45

标签: makefile gnu-make

来自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

1 个答案:

答案 0 :(得分:1)

我相信你只是误解了“独特”的意思。它没有意味着它们是两个不同的变量。通过以下片段澄清了含义“两个变量不必具有相同的味道”。这才是重点。全局变量foo和特定于目标的变量foo是两个不同的(但在扩展时组合)变量。

考虑到这一点,你得到的输出正是你所期望的。

分配给foo第一个事物是全局作业中的值2

之后,在目标处理过程中,处理了foo += 1作业(两次,all一次,x一次)。

完全如图所示,您将2 1 1