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
:= 是覆盖之前的值(立即展开)
?= 是如果没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值
例子:
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
相关文章推荐
- spain 提示
- UFT VB脚本(更新中)
- UVA 810 A Dicey Promblem 筛子难题 (暴力BFS+状态处理)
- Web.config自定义节点
- Microservice架构模式简介
- Lowest Common Ancestor of a Binary Tree
- javah生成.h文件发生错误: 编码GBK的不可映射字符
- Android: NullPointerException when using RelativeLayout with measure()
- 日志切分
- Handler导致的内存泄露问题
- 将list集合的数据转换为json字符串需要注意的问题
- 聚合数据api的使用
- CoreData增删改查简单操作及多线程添加数据
- Lua5.2.3源码阅读(2)-Table
- JS_002
- Makefile 学习笔记
- 首届中国移动互联网测试大会在北京圆满闭幕
- PHP源码安装
- JS_001
- 第二章