前言
今天我們要來繼續討論 Makefile,
Makefile 裡面有個十分常用的 target -「.PHONY」,
我們來看看這到底是什麼。
什麼是「.PHONY」?
我們先來介紹 「.PHONY」存在的意義是什麼,
如果我們去查電子辭典,會發現它對 phony 給出的解釋為 「假的、冒牌貨」,
沒錯,「.PHONY」本身就是一個「假的 target」,而他的主要功能就是
「變免 target 檔案名稱」與「實際上要使用的檔案名稱衝突」
(作為「單純的目標指令」,非「檔案名」,或者也可以理解為「作為達到目的用的假檔案」)
我們先來談談 .PHONY 如何「變免 target 檔案名稱」與「實際上要使用的檔案名稱衝突」
我們也依照官方的例子來說明這件事情,
假設同一個目錄底下有一個叫做「clean」的檔案!!
在前面的文章中,我們都知道
- 「target: prerequisites」:當 target 或 prerequisites 沒有被更新,指令不會被執行
我們來看看通常 clean: 的指令,後面都沒有接東西,
clean:
rm -rf *.o
在這個條件底下,「make clean」這個指令會在執行一次後,永遠不會被執行。
因為「clean 這個檔案不會再被更新了 (當然,一般我們也不會希望就這麼剛好有一個 clean 的檔案)」
如果要讓 make clean 依然發揮他原來的「清除檔案」效果。
我們需要改寫成:
.PHONY: clean
clean:
rm -rf *.o
在這裡,「.PHONY」被定義為一個純粹的方法,
也就是說,「clean」被作為一個純粹的方法使用,
所以「make clean」可以視為是一個單純的清除功能,「不會去尋找 clean 檔案」。
結論
如果我們在製作 Makefile 的過程中,有碰到過程中「有目標」,卻沒有「必要對應的檔案」,
我們都可以定義在 「.PHONY」之後。
Reference
- CU – AGSO – Introduction To Linux – Session 5 – Part 3 – GNU make and Makefiles
- Makefile 語法和示範
- Makefile 語法簡介
- 簡單學 makefile:makefile 介紹與範例程式
- What is the purpose of .PHONY in a Makefile?
- Makefile教學: 一篇文章教會妳Phony