Makefile 中的“递归扩展变量赋值”和“简单扩展变量赋值”有什么区别?

Makefile 中的“递归扩展变量赋值”和“简单扩展变量赋值”有什么区别?

我对它们之间的区别感到困惑。

我已经阅读了 GNU 文档,但我仍然很困惑。

您指定的值将逐字安装;如果它包含对其他变量的引用,则每当替换该变量时(在扩展某些其他字符串的过程中),这些引用都会扩展。当这种情况发生时,称为递归扩展。

定义变量时,简单扩展变量的值将被扫描一次,扩展对其他变量和函数的任何引用。一旦扩展完成,变量的值就不会再扩展:当使用变量时,该值将被逐字复制作为扩展。如果包含变量的值引用,则扩展的结果将包含定义该变量时的值。

谁能清楚地解释一下他们的区别?

多谢。

答案1

文档试图说明的只是在使用时处理嵌套扩展之间的区别(递归赋值, =) 与分配时 (简单的作业, :=)。


举个简单的例子:

foo = abc
bar = $(foo)
foo = xyz

all:
    echo $(bar)

打印“xyz”,使用$(foo)时会展开。$(bar)

但是这个:

foo := abc
bar := $(foo)
foo := xyz

all:
    echo $(bar)

打印“abc”,设置$(foo)后会展开。bar


同样,这个

xyzzy = $(shell date >&2)

foo:
    : $(xyzzy)
    : $(xyzzy)

使用时运行date(并打印到 stderr)两次。$(xyzzy)

虽然这样:

xyzzy := $(shell date >&2)

foo:
    : $(xyzzy)
    : $(xyzzy)

设置时运行date(并打印到 stderr)一次。xyzzy在这种情况下,date即使目标foo未被处理,也会运行。

相关内容