makefile类似于脚本程序,当然也支持程序里边变量的概念,makefile中的变量只是文本数据(字符串),没有C语言中的数字等,并且大小写敏感。
makefile中的变量有4种赋值方式:
- 简单赋值( := )(最常用)
- 递归赋值( = )
- 条件赋值( ?= )
- 追加赋值( += )
对于变量的使用,与C语言不同的是,需要使用$符号与()结合,例如要使用变量x,那么在makefile中的方式为$(x)。
下边分别讨论这4种赋值
- 简单赋值( := ):通用赋值方式,只对当前语句的变量有效,如下makefile
X := foo
y := $(x)b
x := new
.PHONY : test
test:
@echo "x => $(x)"
@echo "y => $(y)"
- 递归赋值( = ):所有与目标变量相关的其他变量都会受到影响
x = foo
y = $(x)b
x = new
.PHONY : test
test:
@echo "x => $(x)"
@echo "y => $(y)"
/home/delphi>make test
x => new
y => newb
/home/delphi>
因为使用的递归赋值,所以x = new 会将前边的x也会重新赋值,导致y=newb
- 条件赋值( ?= ):如果变量未定义,则赋值有效,如果已经定义,则无效
x := foo
y := $(x)b
x ?= new
.PHONY : test
test:
@echo "x => $(x)"
@echo "y => $(y)"
/home/delphi>make test
x => foo
y => foob
/home/delphi>
因为x已经在前边定义为foo,所以后边 x ?= new 条件赋值将new赋给x无效
- 追加赋值( += ):原变量值后边追加新值,以空格分开
x := foo
y := $(x)b
x += new
.PHONY : test
test:
@echo "x => $(x)"
@echo "y => $(y)"
/home/delphi>make test
x => foo new
y => foob
/home/delphi>
第一次 x := foo,第二次 x += new,所以追加赋值后的结果为 foo new
makefile的四种变量赋值比较简单,但是最常用的是 简单赋值( := ),使用其余3种赋值时需要注意使用环境。
以上内容参考《狄泰软件学院》操作系统篇之 - makefile专题