Makefile入門(3)

版權全部,轉載請註明:本文出自 學與思linux編程網
接着 Makefile入門(2)繼續來學習Makefile
在前面的例子中,Makefile中的每一個目標體都是一個文件,但事實上咱們在看別人寫得比較正規的Makefile時,咱們會發現有些目標體並非文件,好比常見的clean和install目標體,以下面這個真實的Makefile片段:

install:
    cp sunrise /usr/bin/
clean:
    rm *.o sunrise

這種在Makefile中不是文件的目標體咱們稱之爲僞目標,它僅僅起到標籤的做用。如這裏clean和 install這兩個目標體都是僞目標,有了它們咱們就能夠在命令行輸入make install來把sunrise這個程序安裝到/usr/bin/目錄中,或者輸入make clean來清除之前編譯好的目標文件和可執行程序以完整的從新編譯整個程序。
那若是make程序正在處理的目錄中正好有一個叫install的文件,咱們輸入make install會發生什麼事情呢?回憶前一篇文章咱們學習的make工做流程可知:
由於clean這個目標對應的規則中沒有依賴體,因此make會認爲install文件是最新的,因而就不會去執行該條規則對應的 cp sunrise /usr/bin/ 這條命令了,咱們的安裝也就沒有真正完成。
爲了不上述狀況,咱們能夠用 .PHONY 這個僞目標關鍵字來顯示指明某個目標是僞目標,如:

  .
  .
  .
.PHONY : install clean
install:
    cp sunrise /usr/bin/
clean:
    rm *.o sunrise

有了這樣顯示的說明,當咱們輸入make install時,無論make正在處理的目錄是否包含一個叫install的文件,make程序老是會去執行這條規則所對應的命令 cp sunrise /usr/bin/ ,對clean這個目標的處理也相似。
前面咱們看到的install和clean這兩個僞目標都沒有依賴體,那是否是僞目標不能有依賴體呢?其實不是,僞目標也能夠有依賴體,如:

.PHONY : all
all: sunrise
  .
  .
  .

這樣咱們就能夠輸入make all(若是all對應的規則是整個Makefile的第一條規則,咱們只需簡單的輸入make就好了)來編譯這個sunrise了。
對Makefile的僞目標總結一下:除非顯示的用.PHONY對一個目標體做說明外,make在處理普通目標體(目標體是文件)和僞目標(目標體 不是文件)時流程都同樣,決定是否執行該目標對應規則的命令的依據也同樣,但對於用.PHONY顯示指明的僞目標,make程序則不會管這個目標體所對應 的依賴體的時間只會去分析這些依賴體是否已經準備好(若是有依賴體),而後就去執行該規則的命令(若是有命令部分)。
相關文章
相關標籤/搜索