Makefile のターゲット記述で、普通は
[実行させたいターゲット] :
[実行するタスクコマンド行]
となりますが、実行させたいターゲットが、特定のファイルなのか、それとも、
make xxxx
の xxxx で使いたい単なるタスクの名称なのかがはっきりしません。
タスクの名前のつもりでネーミングしたターゲットが、実はファイルやディレクトリとして存在している場合、コマンドが実行されないという事態が発生します。
ターゲットがファイルではなく、擬似的な名前のターゲットなんですよ、と明示するために、PHONY というキーワードがあります。
.PHONY: [実行させたいターゲット]
[実行させたいターゲット] :
[実行するタスクコマンド行]
とすると、ファイルターゲットじゃないよと明示することになります。
PHONY ターゲットについてよく引き合いにだされるのは、clean という名前です。つまり、
clean:
rm -f *.o
としたけど思ったように動かないと。
たしかに、ディレクトリ内のゴミ掃除をする clean という名前の単体スクリプトをわざわざ作成して使いたがる人っているのですよね。で、そのファイル名とかぶってるからこっちが動かないわけです。
まあ、自分で作って自分で使うだけの Makefile なら別にいいかもしれませんが、環境ごとリリースして他者が使用するかもしれないケースでは、念のため、擬似ターゲットなら PHONY で明示しておく習慣を持っておいたほうが良いのでしょう。
そもそも、他人が書いた Makefile は、他者に分かりにくいもののひとつです。
記述の後付け後付けで、プロジェクトが進むにつれ、書いた本人にも分かりにくくなっていくものだ、ということは理解できますが、できるだけ平易に、だれが見ても何をやっているか分かりやすい記述を心がけましょう。
難しく書くことが偉いと勘違いしてるエンジニアさんはまだ多いですね。