Makefileでヘッダーの依存関係を自動で解決する
今まで、Makefile書かないといけないようなある程度大きなプログラムを書くときに、ヘッダーの依存関係をMakefileに自分で打ち込んでいて、なかなか大変だったのでどうにか自動化できないのかなーって思って調べたら目から鱗だった話。
「ある程度大きなプログラム」とは、複数のソース・ヘッダファイルから構成されていて、環境に依存せず単一の実行ファイルを生成するようなプログラムのことを指しています。
ライブラリをビルドしてインストールとかはできないのであしからず。
さっそくヘッダの依存関係についてですが、gccのオプションを使って解決できました。
gccは-MMオプションをつけることで、インクルードしているヘッダのうち、プログラム中でパス指定しているヘッダをリストアップしてくれます。
あとはshell芸を駆使してMakefileの文法に従って依存関係をファイルに出力して、-includeすれば依存関係を自動で解決できます。
というわけで、あんまり大きくなければ、だいたいなんにでも使えるMakefileを書いてみました。
SRC_DIRにソースコードの入ったディレクトリを、INC_DIRにヘッダの入ったディレクトリを指定しておくと、カレントディレクトリと同名の実行ファイルを生成します。
ということで、C/C++で中規模プログラムを書くときは、こうしておけば最初のマクロ定義(せいぜいCFLAGSとLDFLAGSくらい)を少し書き換えれば、Makefileを書く煩わしさから解放されます。
これだと配布用パッケージを作ってるときとか、OSとCPUアーキテクチャごとに違うコンパイルをしないといけないような場合にはもう少し工夫が必要です。
「Makefile書くのめんどくさいしIDE使うわ」っていうのはそれはそう。
最近ブログ記事の下書きがめちゃくちゃ溜まってて、消化できない(書くのがめんどくさい)
この記事も下書きを書き始めたのは1年くらい前なんですよね。