Makefileで既にそのtargetが存在しているかで分岐する

Makefileの中で、共通部分を取り出して汎用化し外出しにすることがよくあります。
外出しの部分を Makefile.inc に書いて、いろいろな Makefile をincludeするわけです。


このやりかたは便利なのですが最近1つ困っていました。
以下のようにMakefile.incで higepon target が定義されていて

Makefile.inc

higepon:
	@echo "higepon include"

Makefile

MakefileMakefile.inc を include しています。
そして higepon target の動作を意図的に上書きしています。

include Makefile.inc

higepon :
	@echo "higepon"

実行結果

nobita% make higepon
Makefile:4: 警告: ターゲット `higepon' へのコマンドを置き換えます
Makefile.include:6: 警告: ターゲット `higepon' への古いコマンドは無視されます
higepon

このとおり、一応意図どおりの "higepon" という出力が得られるのですが、毎回警告が出てうざいです。
特に Emacs の M-x compile を使っているので1つの警告でもかなり邪魔なのです。
意図的に上書きしているのに警告はいらないよ!


この問題点を解決するための方法を名無しさんに教えていただきました。
Makefileの記述 - 別のMakefileを部分的に無効にするという方法を利用します。
詳細は見てもらうとして以下のように書きます。

Makefile.inc

%を使います。
0文字マッチングが出来ない(?)みたいなので %igepon みたいな感じになっています。

%igepon: force
	@echo "higepon include"
force:	;

Makefile

先ほどと同じ。

実行結果

Makefilehigepon target が上書きされているので警告が出ません。

nobita% make higepon
higepon

ちなみにMakefilehigepon target を消して上書きを無効にすると。

nobita% make higepon
higepon include

Makefile.inc のターゲットが呼ばれます。


もっと良い方法をご存じの方がいましたらぜひツッコミをお願いします。