我对它们之间的区别感到困惑。
我已经阅读了 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
未被处理,也会运行。