序
gnu make と gcc (の-MND オプション)の組み合わせで開発していると時々遭遇するであろう No rule to make target `~'
というエラーを簡単に回避する手段を見付けたので共有します。
(ネットを探しても誰も紹介してないようなので…)
まずは結論
makefileに
%.h: ;
%.c: ;
または
%.h:
-
%.c:
-
と書き足して下さい。
機序
簡潔に言えばmakeに 「ヘッダ/ソースファイルが無い場合何もするな」 と指示しているだけです。
ヘッダやソースの存在チェックはコンパイラに任せれば良く、makeでチェックする必要はありません。
(makeがチェックするとコンパイラが依存関係(*.d)を更新する機会を奪ってしまいます)
そもそも No rule to make target `~'
というエラーは「ファイル(が見付からない場合)の ルールが無い」 と言ってる訳ですから、ルール(依存ファイルなし/コマンドなし)を明示すりゃ良いのです。
補足
%.h:
-
このルールを見て何も生成していないがエラーにならないのか?と疑問に思った方も居ると思いますが、makeはコマンド実行前にターゲットと依存ファイルの有無とタイムスタンプをチェックしているだけで、ターゲットがきちんと生成されたかどうかはチェックしていません。
(コマンドの戻り値や他のルールの依存ファイルに指定することで間接的にチェックすることはできます。)