makefile中的4种赋值方式

4 Assignment Methods in Makefile

Posted by 王灿辉 on 2019-07-24

变量的定义与使用

Makefile中允许用户用等号自定义变量。

1
2
3
txt = Hello World
ALL:
    @echo $(txt)

使用变量时用 $() 将变量包住,以解析变量的值。 使用Shell变量时需要使用两个 $$

1
2
ALL:
    @echo $$HOME

变量的4种赋值方式

makefile中有4种赋值符号:=、:=、?=、+=。 表格中记录了他们的性质。

符号 展开时机 展开方式 赋值特性
= 执行时 动态展开 递归赋值
:= 定义时 静态展开 直接赋值
?= 执行时 动态展开 条件赋值
+= 执行时 动态展开 追加赋值

这样描述可能比较抽象,不过没关系,下面我们用一个例子,把4种赋值都用上,让我们更好得理解它们。

1
2
3
4
5
6
7
8
9
10
11
STR1  = I Love
STR1 ?= I Hate   # STR1不为空,不赋值
STR2 ?= Linux    # STR2为空,赋值
STR1 += $(STR2)  # 将STR2追加在STR1之后
STR3 := $(STR1)  # 将STR1静态展开赋值给STR3
STR2  = Magic    # 修改STR2

# 观察STR1、STR3是否会改变
ALL:
    @echo $(STR1)
    @echo $(STR3)

make执行,输出如下:

1
2
I Love Magic
I Love Linux

STR2追加在STR1之后,STR1的值变为 I Love $(STR2)。 随后当我们通过 $(STR1) 展开STR1时,会递归展开STR2

最后,我们将STR2的值改变为Magic。 所以$(STR3)展开时,其中的$(STR2)也随之改变。

但由于STR3是在我们修改STR2之前通过静态展开赋值的,所以改变STR2并不影响STR3的值。



赞赏支持
微信赞赏
微信赞赏
支付宝
支付宝