3 回答

TA貢獻2051條經驗 獲得超10個贊
默認情況下,Makefile目標是“文件目標”-用于從其他文件構建文件。Make假設其目標是文件,這使得編寫Makefile相對容易:
foo: bar
create_one_from_the_other foo bar
但是,有時您希望Makefile運行不代表文件系統中物理文件的命令。常見的目標“干凈”和“全部”就是很好的例子??赡懿皇沁@種情況,但是您可能clean在主目錄中有一個命名的文件。在這種情況下,Make會感到困惑,因為默認情況下clean目標將與此文件關聯,而Make僅在文件的依賴關系似乎不是最新時才運行它。
這些特殊的目標稱為phony,您可以明確地告訴Make與文件無關,例如:
.PHONY: clean
clean:
rm -rf *.o
make clean即使您有一個名為的文件,Now 也將按預期運行clean。
就Make而言,偽造目標只是一個始終過期的目標,因此,只要您詢問make <phony_target>,它就可以獨立于文件系統的狀態運行。一些常見的make是經常假目標是:all,install,clean,distclean,TAGS,info,check。

TA貢獻1788條經驗 獲得超4個贊
假設您有install
目標,這在makefile中很常見。如果不使用.PHONY
,并且install
與Makefile所在的目錄中存在一個名為的文件,make install
則將不執行任何操作。這是因為Make將規則解釋為“執行某類配方以創建名為install
” 的文件。由于該文件已經存在,并且其依存關系沒有更改,因此不會執行任何操作。
但是,如果將install
目標設為PHONY,它將告訴make工具該目標是虛構的,并且該make不應該期望它創建實際的文件。因此,它將不會檢查install
文件是否存在,這意味著:a)如果文件確實存在,其行為不會改變; b)stat()
不會調用多余的行為。
通常,Makefile中所有不會產生與目標名稱相同名稱的輸出文件的目標都應為PHONY。這通常包括all
,install
,clean
,distclean
,等。

TA貢獻1859條經驗 獲得超6個贊
注意: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”文件,并在其中添加一些空格,這不會影響代碼語法或邏輯,然后保存并退出?,F在,hello.c的修改時間戳比“ hello”的修改時間戳新?,F在,如果您調用“ make hello”,它將執行以下命令:
cc hello.c -o hello
文件“ hello”(文本文件)將被新的二進制文件“ hello”(上述編譯命令的結果)覆蓋。
如果我們在makefile中使用.PHONY,如下所示:
.PHONY:hello
hello:hello.c
cc hello.c -o hello
然后調用“ make hello”,它將忽略pwd“ test”中存在的任何文件,并每次執行命令。
現在假設,“ hello”目標沒有聲明依賴項:
hello:
cc hello.c -o hello
并且pwd“測試”中已經存在“ hello”文件,那么“ make hello”將始終顯示為:
make: `hello' is up to date.
添加回答
舉報