多行變量
多行變量使用define
關(guān)鍵字在makefile中定義,endef
關(guān)鍵字標(biāo)志著多行標(biāo)量的定義結(jié)束。
define
定義的變量等價(jià)于=
定義的變量。
使用的方法如下
define richard
I am richard.
endef
override define cmd_pwd
@echo "run pwd cmd..."
@pwd
endef
all :
@echo "richard = $(richard)"
$(cmd_pwd)
運(yùn)行結(jié)果如下
richard = I am richard.
run pwd cmd...
/media/richard/WORK/makefile/code/
環(huán)境變量
make在運(yùn)行時(shí),系統(tǒng)中的所有環(huán)境變量對(duì)它都是可見(jiàn)的郊愧。在makefile中,可以引用任何已定義的環(huán)境變量井佑。
- 若makefile中定義了和環(huán)境變量同名的變量属铁,環(huán)境變量的值將被覆蓋。
- 運(yùn)行make時(shí)躬翁,加上
-e
選項(xiàng)焦蘑,會(huì)優(yōu)先使用環(huán)境變量。
PWD
是環(huán)境變量盒发,代表當(dāng)前目錄的絕對(duì)位置例嘱。以此變量舉例如下
PWD := /tmp
test :
@echo $(PWD)
.PHONY : test
執(zhí)行make test
的結(jié)果是:/tmp
;
執(zhí)行make -e test
的結(jié)果是:/media/richard/WORK/makefile/code/
宁舰。
變量的傳遞
變量在不同的makefile之間傳遞有三種方式
- 直接在外部定義環(huán)境變量進(jìn)行傳遞
- 使用
export
定義變量進(jìn)行傳遞 - 使用
make
命令行方式進(jìn)行傳遞
創(chuàng)建兩個(gè)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
執(zhí)行make -f makefile.3
結(jié)果如下
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/'
通過(guò)執(zhí)行結(jié)果可以看到,環(huán)境變量PWD
被覆蓋蛮艰,在兩個(gè)makefile文件中打印都是/tmp
腋腮;
使用export
定義的變量madpenguin
的值可以傳入到makefile.4中;
在執(zhí)行make時(shí)定義的變量var
,也可以被傳入到makefile.4中即寡。
目標(biāo)(指定)變量
目標(biāo)指定變量的值只在指定它的目標(biāo)的上下文中有效徊哑,對(duì)于其他的目標(biāo)沒(méi)有影響。此變量被定義在某個(gè)具體目標(biāo)和由它所引發(fā)的規(guī)則的目標(biāo)上聪富。
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
當(dāng)執(zhí)行next
目標(biāo)時(shí)实柠,make next
輸出結(jié)果為
next :
var = madpenguin
new = boy
當(dāng)執(zhí)行test
目標(biāo)時(shí),make test
輸出結(jié)果為
next :
var = richard
new = boy
test :
var = richard
new = boy
看變量var
的的值在兩次執(zhí)行的時(shí)候不同善涨,因?yàn)?code>var在test
目標(biāo)下定義的值為richard
,所以這個(gè)值在test
目標(biāo)以及它所依賴的目標(biāo)下都是有效的草则。
而執(zhí)行next
目標(biāo)時(shí)钢拧,var
只在文件開(kāi)始的時(shí)候定義,并沒(méi)有在next
目標(biāo)下定義炕横,所以輸出的是文件變量的值源内。
模式(指定)變量
模式變量是對(duì)目標(biāo)變量的擴(kuò)展,模式指定變量定義是將一個(gè)變量值指定到所有符合此模式的目標(biāo)以及其連帶的規(guī)則中份殿。
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
當(dāng)執(zhí)行next
目標(biāo)時(shí)膜钓,make next
輸出結(jié)果為
next :
var = madpenguin
new = boy
當(dāng)執(zhí)行test
目標(biāo)時(shí),make test
輸出結(jié)果為
test :
var = madpenguin
new = girl
目標(biāo)test
符合%st
模式卿嘲,所以test
規(guī)則中的new
變量的值變成girl
颂斜,而目標(biāo)next
不符合%st
模式,所以next
規(guī)則中的new
變量的值還是boy
拾枣。