多行变量
多行变量使用define
关键字在makefile中定义,endef
关键字标志着多行标量的定义结束。
define
定义的变量等价于=
定义的变量。
使用的方法如下
define richard
I am richard.
endef
override define cmd_pwd
@echo "run pwd cmd..."
@pwd
endef
all :
@echo "richard = $(richard)"
$(cmd_pwd)
运行结果如下
richard = I am richard.
run pwd cmd...
/media/richard/WORK/makefile/code/
环境变量
make在运行时,系统中的所有环境变量对它都是可见的。在makefile中,可以引用任何已定义的环境变量。
- 若makefile中定义了和环境变量同名的变量,环境变量的值将被覆盖。
- 运行make时,加上
-e
选项,会优先使用环境变量。
PWD
是环境变量,代表当前目录的绝对位置。以此变量举例如下
PWD := /tmp
test :
@echo $(PWD)
.PHONY : test
执行make test
的结果是:/tmp
;
执行make -e test
的结果是:/media/richard/WORK/makefile/code/
。
变量的传递
变量在不同的makefile之间传递有三种方式
- 直接在外部定义环境变量进行传递
- 使用
export
定义变量进行传递 - 使用
make
命令行方式进行传递
创建两个makefile文件makefile.3以及makefile.4,makefile.3如下
PWD := /tmp
export madpenguin := richard
var := boy
test :
@echo "PWD = $(PWD)"
@echo "make -f makefile.4"
@$(MAKE) -f makefile.4
@$(MAKE) -f makefile.4 var:=$(var)
.PHONY : test
makefile.4如下
test:
@echo "PWD = $(PWD)"
@echo "madpenguin = $(madpenguin)"
@echo "var = $(var)"
.PHONY : test
执行make -f makefile.3
结果如下
PWD = /tmp
make -f makefile.4
make[1]: Entering directory '/media/richard/WORK/makefile/code/'
PWD = /tmp
madpenguin = richard
var =
make[1]: Leaving directory '/media/richard/WORK/makefile/code/'
make[1]: Entering directory '/media/richard/WORK/makefile/code/'
PWD = /tmp
madpenguin = richard
var = boy
make[1]: Leaving directory '/media/richard/WORK/makefile/code/'
通过执行结果可以看到,环境变量PWD
被覆盖,在两个makefile文件中打印都是/tmp
;
使用export
定义的变量madpenguin
的值可以传入到makefile.4中;
在执行make时定义的变量var
,也可以被传入到makefile.4中。
目标(指定)变量
目标指定变量的值只在指定它的目标的上下文中有效,对于其他的目标没有影响。此变量被定义在某个具体目标和由它所引发的规则的目标上。
var := madpenguin
new := boy
test : var := richard
test : next
@echo "test :"
@echo "var = $(var)"
@echo "new = $(new)"
next :
@echo "next :"
@echo "var = $(var)"
@echo "new = $(new)"
.PHONY : test next
当执行next
目标时,make next
输出结果为
next :
var = madpenguin
new = boy
当执行test
目标时,make test
输出结果为
next :
var = richard
new = boy
test :
var = richard
new = boy
看变量var
的的值在两次执行的时候不同,因为var
在test
目标下定义的值为richard
,所以这个值在test
目标以及它所依赖的目标下都是有效的。
而执行next
目标时,var
只在文件开始的时候定义,并没有在next
目标下定义,所以输出的是文件变量的值。
模式(指定)变量
模式变量是对目标变量的扩展,模式指定变量定义是将一个变量值指定到所有符合此模式的目标以及其连带的规则中。
var := madpenguin
new := boy
%st : override new := girl
test :
@echo "test :"
@echo "var = $(var)"
@echo "new = $(new)"
next :
@echo "next :"
@echo "var = $(var)"
@echo "new = $(new)"
.PHONY : test next
当执行next
目标时,make next
输出结果为
next :
var = madpenguin
new = boy
当执行test
目标时,make test
输出结果为
test :
var = madpenguin
new = girl
目标test
符合%st
模式,所以test
规则中的new
变量的值变成girl
,而目标next
不符合%st
模式,所以next
规则中的new
变量的值还是boy
。