Edited at

Makefileをタスクランナーとして使うときに .PHONY を自動生成する

タスクランナーとして Makefile を使うときに、ターゲットと同じファイルがあっても良いように .PHONY ターゲットを書きますよね?

でも面倒じゃないですか。というわけで思いつきました。.PHONY を自動生成すれば良いのです。

x:

echo $@
y:
touch $@
z:
touch $@

NO_PHONY = /^(z):/
.PHONY: $(shell cat $(MAKEFILE_LIST) | awk -F':' '/^[a-z0-9_-]+:/ && !$(NO_PHONY) {print $$1}')

% make x

echo x
x

% make y
touch y
% make y
touch y

% make z
touch z
% make z
make: 'z' は更新済みです.

NO_PHONY に正規表現を書いておけば、それらは .PHONY に含まれません。

複数のターゲットをまとめて書いてたり、変数にしてる場合には対応できてないですけど、タスクランナーとして使う場合あまりやらないのでそこはまぁ良いでしょう。必要なら .PHONY に並べてあげるだけです。

便利。