【C編程系列】Makefile中.PHONY的使用

在C項(xiàng)目構(gòu)建中,經(jīng)常在Makefile文件中用到.PHONY配置項(xiàng)。.PHONY配置項(xiàng)的主要作用在于避免指定命令和項(xiàng)目下的同名文件沖突,進(jìn)行性能優(yōu)化。.PHONY [command name] 顯式指定了一個(gè)命令名稱【而不是實(shí)際文件名】,是為了避免該命令名稱與makefile同路徑下的文件名重名沖突,以使make [command name]命令可以正確被解析、執(zhí)行。下面將舉例說(shuō)明。

例 1

如果編寫一個(gè)規(guī)則名稱為clean,不產(chǎn)生目標(biāo)文件,那么該命令在執(zhí)行make clean時(shí)規(guī)則都會(huì)被執(zhí)行,makefile內(nèi)容如下:

clean:
    rm -f *.o temp

rm 命令不產(chǎn)生任何clean文件。

  • 如果目錄下不存在名為"clean"的文件,則運(yùn)行make clean時(shí),命令都會(huì)正常執(zhí)行;
  • 如果目錄下存在名為"clean"的文件,則運(yùn)行make clean時(shí),命令規(guī)則會(huì)失效,文件"clean"沒(méi)有依賴文件,始終是最新的,make clean永遠(yuǎn)不會(huì)被執(zhí)行。
    為了解決上述問(wèn)題,可以使用.PHONY clean指明該clean命令。如下:
.PHONY clean

clean:
    rm -f *.o temp

這樣執(zhí)行命令make clean會(huì)自動(dòng)忽略名為"clean"文件的存在。已知.PHONY配置項(xiàng)的目標(biāo)并不是其他文件生成的實(shí)際文件,make命令會(huì)自動(dòng)繞過(guò)隱含規(guī)則搜索過(guò)程,因此聲明.PHONY配置項(xiàng)會(huì)改善性能,bi且不需要擔(dān)心實(shí)際同名文件存在與否。

例 2

如果.PHONY目標(biāo)有依賴關(guān)系。當(dāng)一個(gè)目錄中存在多個(gè)可運(yùn)行程序,將其配置在同一個(gè)makefile文件。由于make [command name/ Default command]默認(rèn)缺省規(guī)則是makefile文件中的第一個(gè)規(guī)則,一般將這第一個(gè)規(guī)則稱為"all",其依賴文件為多個(gè)可運(yùn)行程序,如下:

all:  p1 p2 p3
.PHONY: all
p1:  p1.o utils.o
       cc -o p1 p1.o utils.o
p2:  p2.o utils.o
       cc -o p2 p2.o utils.o
p3:  p3.o utils.o
       cc -o p3 p3.o utils.o

其中p1、p2和p3是三個(gè)可執(zhí)行文件,make把"all"作為主要規(guī)則,每次執(zhí)行時(shí)都嘗試把"all"更新,因此會(huì)檢查其依賴文件p1、p2和p3是否需要更新,如果需要,就把它們更新,從而達(dá)到我們的目的。通過(guò).PHONY指定目標(biāo)為all,可以避免目錄下同名文件的干擾,即不用檢查規(guī)則"all"是否有同名文件存在,也不需要查詢?nèi)魏坞[含規(guī)則,直接假定指定的規(guī)則"all"需要被更新。


綜上所述,.PHONY是一個(gè)偽目標(biāo),可以有效防止在Makefile文件中定義的可執(zhí)行命令的目標(biāo)規(guī)則和工作目錄下的實(shí)際文件出現(xiàn)名稱沖突,并提高了執(zhí)行Makefile的性能。


Bob Huang
2018.0608

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 快速過(guò)敏反應(yīng)是瞬間的, 慢的過(guò)敏反應(yīng)是量的累積, 有那么多能吃并且安全的,為啥非得挑一些麻煩危險(xiǎn)的吃……
    家有兩男寶閱讀 347評(píng)論 0 0
  • “棍棍!?”小馬使勁的撥開(kāi)兩大坨脂肪,露出臉來(lái),被冷落的兩位美女對(duì)這突如其來(lái)的造訪及搗亂者投以憤慨的目光,卻依然把...
    半點(diǎn)正經(jīng)閱讀 420評(píng)論 0 0
  • hanxuerping閱讀 169評(píng)論 0 0
  • 了解公司架構(gòu),業(yè)務(wù)方、開(kāi)發(fā)、測(cè)試、BI等等 了解部門分工,多少組,每個(gè)組負(fù)責(zé)什么,自己的組負(fù)責(zé)什么,什么地位 了解...
    漠往閱讀 470評(píng)論 0 0

友情鏈接更多精彩內(nèi)容