makefile變量的使用進(jìn)階(2)

多行變量

多行變量使用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拾枣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沃疮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子梅肤,更是在濱河造成了極大的恐慌司蔬,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姨蝴,死亡現(xiàn)場(chǎng)離奇詭異俊啼,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)左医,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)授帕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人炒辉,你說(shuō)我怎么就攤上這事豪墅。” “怎么了黔寇?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵偶器,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)屏轰,這世上最難降的妖魔是什么颊郎? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮霎苗,結(jié)果婚禮上姆吭,老公的妹妹穿的比我還像新娘。我一直安慰自己唁盏,他們只是感情好内狸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著厘擂,像睡著了一般昆淡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刽严,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天昂灵,我揣著相機(jī)與錄音,去河邊找鬼舞萄。 笑死眨补,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的倒脓。 我是一名探鬼主播撑螺,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼崎弃!你這毒婦竟也來(lái)了实蓬?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤吊履,失蹤者是張志新(化名)和其女友劉穎安皱,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體艇炎,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酌伊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缀踪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片居砖。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖驴娃,靈堂內(nèi)的尸體忽然破棺而出奏候,到底是詐尸還是另有隱情,我是刑警寧澤唇敞,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布蔗草,位于F島的核電站咒彤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏咒精。R本人自食惡果不足惜镶柱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望模叙。 院中可真熱鬧歇拆,春花似錦、人聲如沸范咨。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)渠啊。三九已至逻卖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間昭抒,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工炼杖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留灭返,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓坤邪,卻偏偏與公主長(zhǎng)得像熙含,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子艇纺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容