.PHONY在makefile中的用途是什麼?


Answers

假設你已經install目標,這在makefile中很常見。 如果您使用.PHONY ,並且名為install的文件與Makefile位於同一目錄中,則make install將不會執行任何操作 。 這是因為Make將規則解釋為“執行這樣的配方來創建名為install的文件”。 由於該文件已經存在,並且其依賴關係沒有改變,所以不會做任何事情。

但是,如果您將install目標設為PHONY,它會告訴make工具該目標是虛構的,並且該make不應該期望它創建實際的文件。 因此它不會檢查install文件是否存在,這意味著:a)如果文件存在並且b)不會調用額外的stat()則其行為不會被改變。

通常,Makefile中不生成與目標名稱同名的輸出文件的所有目標應該是PHONY。 這通常包括allinstallcleandistclean等。

Question

.PHONY在Makefile中意味著什麼? 我已經經歷了this ,但它太複雜了。

有人可以用簡單的語言向我解釋嗎?




最好的解釋是GNU make手冊本身: 4.6 Phony Targets部分

.PHONY是make的特殊內置目標名稱之一 。 還有其他你可能感興趣的目標,所以值得瀏覽這些參考資料。

當需要考慮一個.PHONY目標時,make會無條件地運行它的配方,不管這個名稱的文件是否存在,或者它的最後修改時間是什麼。

你也可能對make的標準目標感興趣,比如allclean




注意 :make工具讀取makefile並檢查規則中':'符號兩側文件的修改時間戳。

在“測試”目錄中存在以下文件:

prerit@vvdn105:~/test$ ls
hello  hello.c  makefile

在makefile中,規則定義如下:

hello:hello.c
    cc hello.c -o hello

現在假定文件'hello'是一個包含一些數據的文本文件,它是在'hello.c'文件之後創建的。 所以'hello'的修改(或創建)時間戳將比'hello.c'更新。 所以當我們從命令行調用'make hello'時,它會打印為:

make: `hello' is up to date.

現在訪問'hello.c'文件並在其中放入一些空格,這不會影響代碼語法或邏輯,然後保存並退出。 現在hello.c的修改時間戳比'hello'更新。 現在,如果您調用'make hello',它將執行以下命令:

cc hello.c -o hello

並且文件'hello'(文本文件)將被新的二進製文件'hello'覆蓋(上面編譯命令的結果)。

如果我們在makefile中使用.PHONY,如下所示:

.PHONY:hello

hello:hello.c
    cc hello.c -o hello

然後調用'make hello',它會忽略pwd中存在的任何名為'hello'的文件並每次執行該命令。

現在假設makefile中沒有目標依賴關係:

hello:
    cc hello.c -o hello

並且'hello'文件已經存在於pwd'test'中,那麼'make hello'將始終顯示為:

make: `hello' is up to date.