著作一覧 |
Makefileを書くときの教訓を得たのでメモ。
今、ext.hをincludeしているa.hをincludeしているa0.c, a1.cがあるとして、extという外部ライブラリの関数を陽に呼び出しているのがa0.cだけだとする。
そこで、依存関係としてa0.cについてはext.h, a.hとしているが、a1.cについてはa.hだけを依存関係としてMakefileを書いたとする。
ここでextのバージョンアップに伴ってmakeし直すと、Makefile内でext.hに依存しているのはa0.cだけなので、a0.objは再コンパイルされる。が、a1.cはそのままとなる。
確かにextの関数の変化への追随や陽に使っている定数の値変更とかだけならそれで良い(a1.cを再コンパイルしないからmakeもちょっと速くなる)のだが、ext.hの中でstdioなどのCのライブラリ関数やマクロを再定義しているシンボルがあるかどうかは、別の話だ。その場合は、a1.cもext.hの変更に追随して再コンパイルしなければまずい。
というわけで、includeしているヘッダをすべて把握するか(でも追加されて、それが影響する可能性もあるわけなので)、大雑把に陽にincludeしているヘッダについては常に依存関係があるものと想定してMakefileは書くべきだ。とか、今頃になって気付いていたりして。
ジェズイットを見習え |