在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