怎麼編寫Makfile中_瞭解.PHONY

 

build:
  go build -o ~/bin/

.PHONY: build

我們瞭解上面代碼中提到的·.PHONY·

.PHONY是一個特殊工作目標(Special Built-in Target Names)。
 它用來指定一個僞目標,也就是說它後面的並不是一個實際文件。


PHONY 目標並非實際的文件名:只是在顯式請求時執行命令的名字。使用僞目標有兩個好處:

  1. 避免和同名文件衝突 - 
  2. 改善性能。

如果編寫一個規則,並不產生目標文件,則其命令在每次make 該目標時都執行。

我們看一個例子:
 

clean:
        rm *.o temp

如果目錄中出現了"clean"文件,則規則失效了,就不能滿足我們清理的需求了。因爲目錄下的文件"clean"始終是最新的,命令永遠不會執行;爲避免這個問題,可使用".PHONY"指明該目標。如:

.PHONY: clean
clean:
        rm *.o temp

這樣執行"make clean"會無視"clean"文件存在與否。

已知phony 目標並非是由其它文件生成的實際文件,make 會跳過隱含規則搜索。這就是聲明phony 目標會改善性能的原因,即使你並不擔心實際文件存在與否。

phony 目標不應是真正目標文件的依賴。如果這樣,每次make 在更新此文件時,命令都會執行。只要phony 目標不是真正目標的依賴,規則的命令只有在指定此目標時才執行。  
phony 目標可以有依賴關係。當一個目錄中有多個程序,將其放在一個makefile 中會更方便。因爲缺省目標是makefile 中的第一個目標,通常將這個phony 目標叫做"all",其依賴文件爲各個程序:

all : prog1 prog2 prog3
.PHONY : all
prog1 : prog1.o utils.o
  cc -o prog1 prog1.o utils.o
prog2 : prog2.o
 cc -o prog2 prog2.o
prog3 : prog3.o sort.o utils.o
 cc -o prog3 prog3.o sort.o utils.o

==========================================================================

# The "tools" are needed early, so put this first
# Don't include stuff already done in $(LIBS)
SUBDIRS = tools \
post \
post/cpu
.PHONY : $(SUBDIRS)

===========================================================

上面這段makefile,聲明SUBDIRS爲一個假象目標,那麼當Makefile中調用到SUBDIRS的時候,每次都要更新這個SUBDIRS,也就是每次make都會重新讀取這個SUBDIRS。

代碼中中還有:

.PHONY : $(LIBS)

# Make links to executive here so that the .c files are in place before dependency generation
.PHONY: links
links:
make -C lib_mips -f links.mk links

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章