(1)預設情況下,make 認為目標對應著乙個檔案==> 目標即檔名
(2)make首先會檢測目標對應的檔案是否存在,若不存在則執行依賴和命令。若存在則會比較目標檔案和依賴檔案的新舊關係,決定是否執行命令。
在 make 中,通過比較目標檔案和依賴檔案的時間戳,來判斷兩者的新舊關係。make 程式使用的時間戳的型別是mtime(modify time),即檔案發生修改的時間。
在 linux 中,有三個時間的概念,修改時間mtime(modify time)、訪問時間atime(access time)、狀態改動時間ctime(change time)。
(3)make 以檔案處理作為第一優先順序。
下面的**有什麼意義?
執行make clean會將第2課中編譯生成的中間.o檔案和hello.out目標檔案刪除。但如果該目錄下存在名為 clean 的檔案就會導致刪除命令執行失敗。
有時我們並不希望目標對應的都是檔案,而只是把目標當作乙個標籤來使用,這就引入了makefile中的偽目標。
(1)makefile 中的偽目標
(2)makefile 偽目標的語法:先宣告,後使用
本質:偽目標是 make 中特殊目標 .phony 的依賴。
【程式設計實驗】
1(3)makefile 偽目標的妙用:規則呼叫(函式呼叫)# makefile偽目標的引入
23 hello.out
all : func.o main.o
4 gcc -o hello.out
func.o main.o56
func.o : func.c
7 gcc -o func.o -c func.c89
main.o : main.c
10 gcc -o main.o -c main.c
1112
.phony : clean
13clean :
14rm *.o hello.out
原理:當乙個目標的依賴包含偽目標時,偽目標所定義的命令總是會被執行。當執行 make rebuild 時首先會刪除之前編譯生成的垃圾檔案,然後重新編譯整個工程。
1(4)技巧:繞開 .phony 關鍵字定義偽目標# makefile中利用偽目標實現規則呼叫23
hello.out : func.o main.o
4gcc -o hello.out func.o main.o56
func.o : func.c
7gcc -o func.o -c func.c89
main.o : main.c
10gcc -o main.o -c main.c
1112
.phony : rebuild clean all
1314
rebuild : clean all
1516
all : hello.out
1718
clean :
19rm *.o hello.out
.phony 關鍵字只有標準的make(gnu make)才擁有,在使用非標準的make時可以使用如下技巧定義偽目標。
原理:如果乙個規則只有乙個目標,並且該目標不是乙個存在的檔名,則在執行此規則時,目標總會被認為是最新的。
當執行 make clean 時,由於 force 會被認為是最新的(force 比 clean 要新),clean 下的命令必然被執行。
1注:本文整理於《狄泰12月提公升計畫》課程內容狄泰qq群:199546072#非gnu make下偽目標的實現方法23
hello.out : func.o main.o
4gcc -o hello.out func.o main.o56
func.o : func.c
7gcc -o func.o -c func.c89
main.o : main.c
10gcc -o main.o -c main.c
1112
clean : force
13rm *.o hello.out
14 force :
偽目標的引入
預設情況下 1 make認為目標對應著乙個檔案 2 make比較目標檔案和依賴檔案的新舊關係,決定是否執行命令 3 make以檔案處理作為第一優先順序。1 通過.phony 關鍵字宣告乙個偽目標 2 偽目標不對應任何實際的檔案 3 不管偽目標的依賴是否更新,命令總是執行。本質 偽目標是make中特殊...
makefile之偽目標
偽目標的目的不是根據依賴關係生成某個目標,而是為了執行某種任務 clean rm o 通過 make clean來使用目標小結 1.因為我們並不是生成clean這個檔案,因此 偽目標 並不是乙個檔案,只是乙個標籤。2.由於 偽目標 不是檔案,所以 make 無法生成它的依賴關係和決定它是否要執行,因...
Makefile中的偽目標
華清遠見嵌入式學院 講師。所謂偽目標就是這樣乙個目標,它不代表乙個真正的檔名,在執行make時可以指定這個目標來執行其所在規則定義的命令,有時我們將乙個偽目標成為標籤。那麼到底什麼是偽目標呢?可能作為初學者還不會在乎這個問題,下面我們來看下我們將在什麼時候需要它。首先來看下面乙個例子 當前目錄下只有...