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