内核Makefile中的=和+ =有什么区别?

Sid*_*rth 2 kernel makefile linux-kernel

在Linux内核Makefile中是:=和+ =相同,可以互换使用吗?如果没有,那么两者有什么区别?

ugo*_*ren 9

正如其他人所说,:=是任务.

但是:=和之间有一个很好的区别=.在大多数情况下,这并不重要,但它可能会产生很大的不同.

X = $(Y)定义X为递归变量,类似于C预处理器宏.
无论何时X引用,Y都将使用值.
扩展时会发生X扩展.因此,您可以在定义Y之后进行定义X,并且没关系.

X := $(Y)定义X为一个简单的变量.这更像是C任务.
现在,Y在定义时进行了扩展,因此稍后更改它将无能为力.

X += $(Y)追加X,但保持其类型.
如果X以前定义过=,Y则不会立即扩展.同样如果X从未定义过.
如果X以前定义过:=,Y将立即扩展.

你可以试试这个exmaple makefile:

X = 1

Y  = $(X)
Z := $(X)

X = 2

Y += $(X)
Z += $(X)

X = 3

test:
        @echo "Y = $(Y)"
        @echo "Z = $(Z)"
Run Code Online (Sandbox Code Playgroud)

它打印

Y = 3 3
Z = 1 2
Run Code Online (Sandbox Code Playgroud)