Makefile小問題提示“make: `arm' is up to date”涉及到.PHONY

轉載自:http://blog.csdn.net/skdkjzz/article/details/39120603



1、除了你的Makefile功能沒有make clean 還有其他原因

2、原因就是你的Makefile中.PHONY不對

例子如下:

我的父Makfile爲:

{

include env.sh


all:
make -C src all


x86:
make -C src x86


arm:
make -C src arm


clean:


make -C src clean


.PHONY:

all x86 arm clean

}

我的子Makefile爲:

{

#Author : kj
#Time : 2014-09-07
#Function: compile sqlite3 


BIN=joseph_cvr


L_CFLAGS_X86= -L$(JOSEPH_SQLITE_X86_LIB) -lsqlite3
I_CFLAGS_X86= -I$(JOSEPH_SQLITE_X86_INLCUDE)


L_CFLAGS_ARM= -L$(JOSEPH_SQLITE_ARM_LIB) -lsqlite3
I_CFLAGS_ARM= -I$(JOSEPH_SQLITE_ARM_INLCUDE)


#all:x86


x86:
gcc -o $(BIN) *.c $(I_CFLAGS_X86) $(L_CFLAGS_X86)


arm:
arm-hisiv100nptl-linux-gcc -o $(BIN) *.c $(I_CFLAGS_ARM) $(L_CFLAGS_ARM)


clean:


rm -rf $(BIN) 


.PHONY:
all x86 arm clean

}


如上格式的話會提示錯誤爲:“make: `arm' is up to date”

原因是父Makefile中加紅色顏色的這句話導致的,改成下面:

{

.PHONY:all x86 arm clean

}

要寫到同一行中,不然該規則不會生效

則問題解決,爲的就是避免同名,下面看看.PHONY的知識點:

makefile裏PHONY的相關介紹

Phony Targets

PHONY 目標並非實際的文件名:只是在顯式請求時執行命令的名字。有兩種理由需要使用PHONY 目標:避免和同名文件衝突,改善性能。

如果編寫一個規則,並不產生目標文件,則其命令在每次make 該目標時都執行。例如:
  clean:
  rm *.o temp
因爲"rm"命令並不產生"clean"文件,則每次執行"make clean"的時候,該命令都會執行。如果目錄中出現了"clean"文件,則規則失效了:沒有依賴文件,文件"clean"始終是最新的,命令永遠不會 執行;爲避免這個問題,可使用".PHONY"指明該目標。如:
  .PHONY : clean
  這樣執行"make clean"會無視"clean"文件存在與否。

已知phony 目標並非是由其它文件生成的實際文件,make 會跳過隱含規則搜索。這就是聲明phony 目標會改善性能的原因,即使你並不擔心實際文件存在與否。
  完整的例子如下:
  .PHONY : clean
  clean :
  rm *.o temp

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

假設你的一個項目最後需要產生兩個可執行文件。你的主要目標 是產生兩個可執行文件,但這兩個文件是相互獨立的——如果一 個文件需要重建,並不影響另一個。你可以使用“假象目的”來 達到這種效果。一個假象目的跟一個正常的目的幾乎是一樣的, 只是這個目的文件是不存在的。因此, make 總是會假設它需要 被生成,當把它的依賴文件更新後,就會執行它的規則裏的命令 行。 

如果在我們的 makefile 開始處輸入: 

all : exec1 exec2 

其中 exec1 和 exec2 是我們做爲目的的兩個可執行文件。 make 把這個 'all' 做爲它的主要目的,每次執行時都會嘗試把 'all' 更新。但既然這行規則裏沒有哪個命令來作用在一個叫 'all' 的 實際文件(事實上 all 並不會在磁碟上實際產生),所以這個規 則並不真的改變 'all' 的狀態。可既然這個文件並不存在,所以 make 會嘗試更新 all 規則,因此就檢查它的依靠 exec1, exec2 是否需要更新,如果需要,就把它們更新,從而達到我們的目的。 

假象目的也可以用來描述一組非預設的動作。例如,你想把所有由 make 產生的文件刪除,你可以在 makefile 裏設立這樣一個規則: 

veryclean : 
rm *.o 
rm myprog 

前提是沒有其它的規則依靠這個 'veryclean' 目的,它將永遠 不會被執行。但是,如果你明確的使用命令 'make veryclean' , make 會把這個目的做爲它的主要目標,執行那些 rm 命令。 

如果你的磁碟上存在一個叫 veryclean 文件,會發生什麼事?這 時因爲在這個規則裏沒有任何依靠文件,所以這個目的文件一定是 最新的了(所有的依靠文件都已經是最新的了),所以既使用戶明 確命令 make 重新產生它,也不會有任何事情發生。解決方法是標 明所有的假象目的(用 .PHONY),這就告訴 make 不用檢查它們 是否存在於磁碟上,也不用查找任何隱含規則,直接假設指定的目 的需要被更新。在 makefile 里加入下面這行包含上面規則的規則: 

.PHONY : veryclean 

就可以了。注意,這是一個特殊的 make 規則,make 知道 .PHONY 是一個特殊目的,當然你可以在它的依靠里加入你想用的任何假象 目的,而 make 知道它們都是假象目的

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