2010/02/10

Makefileの書き方

今までC++はWindowsでしかやったことがなかったのでMakefileには馴染みがありませんでした
最近少しLinuxでC++を弄っているので簡単なMakefileの書き方を少し調べてみました


適当なソースファイルがあってmath.hをインクルードしている場合
gcc foobar.c -lm として libm.a をリンクしなければいけません
毎回これじゃ面倒、というのとソースファイルが多くなった場合
手作業でコンパイル、リンクをすべてのファイルに対してやるのは現実的じゃないですね
しかもMakefileを書くと自動で更新されたファイルのみ処理してくれます
ということで、簡単な例ですがMakefileを載せておきます


CC = gcc
LDLIBS = -lm
OBJS = foobar.o

all: target

target: $(OBJS)
$(CC) -o foobar $(OBJS) $(LDLIBS)

clean:
$(RM) foobar $(OBJS)


これを見ただけじゃよくわからないかもしれませんがfoobar.cとMakefileがあるディレクトリで
makeを打つとfoobarというバイナリが出力されます (エラーがなければね)
他にソースが増えたら OBJS = foobar.o hoge.o という具合に付け足せばOK

処理の流れを以下で説明します
1、makeとコマンドが実行されるとまず一番上の命令が実行されます
 この場合は all: target です
 allが命令、targetがallを実行するのに必要なもの、ととらえるといいと思います
 その為allを実行する前にまずtargetに実行が移ります
2、次は target: $(OBJS) です
 targetを実行するには$(OBJS)が必要、$(OBJS)は上で定義されているfoobar.oに展開されます
 まだfoobar.oが無いのでtargetを実行する前にfoobar.oを作らなければいけません
3、上記のMakefileの例ではfoobar.oを作るためのルールが書いていません
 しかしその為のルールはmakeにビルドインされているので問題なく実行されます
 Makefileのあるディレクトリで make -p | less と実行すると色々確認できます
 自分の環境では*.cから*.oを作る命令 %.o: %.c の中身は
 $(COMPILE.c) $(OUTPUT_OPTION) $< でした
4、ここでようやくfoobar.oが作成されたので target: $(OBJS) に戻り
 次の $(CC) -o foobar $(OBJS) $(LDLIBS) が実行され実行ファイルのfoobarが生成されます
5、targetの部分はこれで終わりallに戻りますが何も書いていないのでそのまま終了します

clean部分はmake cleanと指定することで実行されます
ここではmakeで生成されたファイルを削除する処理を書いておきます

0 件のコメント:

コメントを投稿