您的位置:首页 > 其它

Makefile 中:=/ ?=/ +=/ =的区别

2015-07-13 23:49 337 查看
= 是最基本的赋值(用到的时候再赋值,展开)

:= 是覆盖之前的值(立即展开)

?= 是如果没有被赋值过就赋予等号后面的值

+= 是添加等号后面的值

例子:

1、“=”

make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子:

x = foo

y = $(x) bar

x = xyz

在上例中,y的值将会是 xyz bar ,而不是 foo
bar 。

2、“:=”

“:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。

x := foo

y := $(x) bar

x := xyz

在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。
======================================================
先看下面的Makefile:

#example

B := $(A)

A = later

all:

@echo $(B)

执行make命令,我们发现什么都没输出,我们将第3行的:=换成=。

#example

B = $(A)

A = later

all:

@echo $(B)

执行make,输出later。

分析:B :=$(A)时,它只会到这句语句之前去找A的值,因A没有定义所以什么都没有输出。

B = $(A)时,虽然该语句之前A没有定义,但是在其后定义了,所以能输出later。

#example

A = before1

A = before2

B := $(A)

A = later1

all:

@echo $(B)

执行make,输出before2。

解释:上面Makefile最后一句echo前面的@符号的作用是禁止回显。如我们的Makefile改为如下:

#example

A = before1

B = $(A)

B = before2

C = $(B)

A = later1

B = later2

all:

echo $(C)

执行make:

echo later2

later2

分析:C = $(B),应该从Makefile文件最后往前找B,得到B = later2,将最后一句全部变量代替即为:echo later2,因echo前没有@符号,回显该语句,然后再输出later2。

注意:当我们直接在终端上要用echo输出某个变量的值时,是不能加()的。如我们要输出PAHT

应该用echo $PATH,而不能用echo $(PATH),否则会报错,注意'$'不能少了。

Makefile中"?=",含义为:如没定义,则赋值。

如:TEMP ?= var 等价于

ifeq($(TEMP),undefined)

TEMP = var

endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: