在Makefile中,赋值操作是构建脚本中非常重要的一部分,它允许你定义变量来存储文件名、编译选项、目录路径等,以便在Makefile的其他部分重用这些信息。Makefile支持几种不同的赋值方式,每种方式在变量作用域和何时扩展(evaluate)其值方面有所不同。以下是几种主要的赋值方式:
-
简单赋值(递归赋值)
使用单个等号
=
进行赋值。这种方式是“递归”的,意味着变量的值在每次被引用时都会被重新计算。如果变量的值依赖于其他变量,而这些变量的值在后续可能被修改,那么使用这种方式是很合适的。VAR = value another_var = $(VAR)_suffix
如果后续
VAR
的值改变了,another_var
的值也会基于新的VAR
值重新计算。 -
静态赋值(直接赋值)
使用
:=
进行赋值。这种方式是“直接”的或“静态”的,意味着变量的值在赋值时就被确定下来,后续对依赖变量的修改不会影响到这个变量的值。VAR := value another_var := $(VAR)_suffix
即使后续
VAR
的值改变了,another_var
的值也不会改变,因为它在赋值时就已经确定了。 -
条件赋值
使用
?=
进行赋值。这种方式只会在变量未被定义时才进行赋值。VAR ?= value
如果
VAR
之前没有被定义,那么VAR
将被赋予value
。如果VAR
已经被定义,那么这条赋值语句将不会改变VAR
的值。 -
追加赋值
使用
+=
进行赋值。这种方式用于向已存在的变量值后面追加内容。VAR = value VAR += more
VAR
的最终值将是value more
。 -
覆盖赋值
虽然Makefile本身没有直接的“覆盖赋值”语法,但你可以通过再次使用简单赋值或静态赋值的方式来“覆盖”一个变量的值。这实际上是变量作用域的一种表现,因为Makefile的变量作用域是全局的,后面的赋值会覆盖前面的赋值。
选择哪种赋值方式取决于你的具体需求,比如变量的值是否需要依赖于其他变量的后续修改,或者你是否希望变量在Makefile的不同部分具有不同的值等。