Makefileを勉強

いまどきはMakefileなんか触る人は少ないのでしょうけど。

発端はALSAを勉強し終わってので、OpenGLALSAを使ったプログラムをやりたくなって。

ソースファイルが5、6個できてしまうなぁと考えているうちにいい機会だからMakefileを使ったフレームワークを作っておこうと。

そして、取り合えず目標を二つ。
1.依存関係はg++に出力してもらい、それを使ってコンパイルする
2.ソースとオブジェクトファイルは別々に
3.ソースファイルはグラフィック用とかサウンド用とかに別々のディレクトリにする

依存関係をg++に出力してもらうには、例えば

g++ -MM Graphics.cpp

とコマンドする。
これを使うと、上手く依存関係を出力してもらえる(Makefile用に)。

ちなみに依存関係として考えないで!っていうのは<>で囲んであげると探さない(例えばXやalsaのヘッダーファイル)。

さっきのコマンドで出力されるのは

Graphics.o: Graphics.cpp Graphics.h

ヘッダーファイルはGraphics.cppファイル内に"Graphics.h"という記述があるから

そして、この出力を例えばGraphics.dとか適当な名前でファイルに出力

以上の事をMakefileで書くなら

sources := Graphics.cpp

dependfile := $(patsubst %.cpp,%.d,$(sources))
all : $(dependfile)
%.d : %.cpp
	$(CC) -MM -Iカレントディレクトリ等 $^ > $@

これで、何とか.dファイルのベースとなるcppファイルに対して依存関係を出力し、何とか.dファイルに出力してくれる。

source変数は各ディレクトリ毎に変えてあげればいいです。


ソースファイルを別々にした場合は、各ディレクトリ毎に上記のようなMakefileを作ってあげて、それらの上位ディレクトリのMakefile

all :
	make -C main/
	make -C graphics/

という感じで、下位のディレクトリを呼び出してあげればいいです。

オブジェクトとソースを別々にするには、各ソースに関しての依存関係を記述してあるファイルを一ヶ所にまとめて、それを一気にMakeしてあげるといいでしょう。

その際はvpathでcppファイルのある場所を各ソースディレクトリにしてあげます。
(ちなみに、この方法だと同じ名前のcppファイルを作れないので注意が必要!)