Makefile のターゲットに .PHONY を付与するワンライナーのメモ。
個人的には Makefile はほぼタスクランナーとして使っていなくて、定義しているターゲットはすべて phony ターゲット になっている。 *1
ターゲットが phony ターゲットであることを make に伝えるには .PHONY <ターゲット> を Makefile に記述する必要があるが、ときどき .PHONY を付与し忘れることがある。
こんなときは以下のようなワンライナーを実行して、Makefile のすべてのターゲットに .PHONY を付与している。
$ cat Makefile | \
sed '/^.PHONY/d' | \
awk '/^[-_0-9a-zA-Z]+:/{s=$1; gsub(/:.*/, "", s); print ".PHONY:", s}{print $0}' > Makefile.new
3行目の awk で .PHONY をターゲットに付与している。
すでに記述されている .PHONY 2行目の sed で削除しているので、3行目の awk は .PHONY が重複するかは考慮せずに無条件に .PHONY をターゲットに付与しても問題はない。