使用';的场景:=';vs'=';在makefile中?(如有可能,请举例说明)

使用';的场景:=';vs'=';在makefile中?(如有可能,请举例说明),makefile,gnu-make,Makefile,Gnu Make,我最近开始深入研究makefile的细节。我理解“:=”是立即的,而“=”是延迟的。但是,我需要一些简化的场景/示例,说明何时需要使用其中一个与另一个进行比较,以便充分理解差异 如果.foo和.bar文件具有完全相同的配方,则您不需要将其写出两次,递归展开变量以进行解救: foobar = do_stuff $@ %.foo: $(foobar) %.bar: $(foobar) 除非您需要递归扩展,否则默认情况下应该使用简单扩展的变量,因为它们更容易推理,也更健壮 some_

我最近开始深入研究makefile的细节。我理解“:=”是立即的,而“=”是延迟的。但是,我需要一些简化的场景/示例,说明何时需要使用其中一个与另一个进行比较,以便充分理解差异

如果
.foo
.bar
文件具有完全相同的配方,则您不需要将其写出两次,递归展开变量以进行解救:

foobar = do_stuff $@
%.foo:
    $(foobar)
%.bar:
    $(foobar)
除非您需要递归扩展,否则默认情况下应该使用简单扩展的变量,因为它们更容易推理,也更健壮

some_deps = stuff I really want
some_other_deps = $(some_deps) some more

### [...]

some_deps = unrelated stuff

foo: $(some_other_deps) # Oops, should have used := for some_other_deps

您可以在中找到更多示例。

:=
仅计算一次,而
=
在每个引用上重新计算。考虑这个场景:<代码> TimeFrase= $(shell MKTEMP/TMP/XXXXXXXX)< /代码>。当您引用
TEMPFILE
时,在每个引用中都会有所不同。如果这是有意的,那么
=
将起作用。如果目的是引用以前创建的
TEMPFILE
,即希望在
Makefile
中的所有步骤中使用相同的文件,则应改用
:=
。感谢您引用本手册的这一部分。我完全错过了这一部分。