[オープンソース] Makefileを公開しよう

最近 id:yaneuraoさんが PSPであそぼう エントリを精力的に書かれていて非常に面白い。
PSPC++プログラミングするための環境を整えたりしているのだが、こんなマニアックでディープな技術がblogで読めるというのはかなりすごいことだと思います。


さてその中で id:yaneurao:20050630のエントリーがちょっと気になりました。
いわゆる make についての説明と、やねうらおさんの独自 Makefileが公開されているという内容でした。
makeは、大規模なソースツリーを、ビルドするときに使うと便利なツールで、Unix系でアプリケーションをコンパイルしたことがある人ならご存知だと思う。
いわゆる

make
make install

というお約束のアレである。
また Javaに詳しい方なら Ant のご先祖様というと分かりやすいかもしれない。


やねうらおさんは

最近のプログラミング環境においてはmakefileを書く機会も減っているので書けない人も多いだろう。

と鋭い指摘をされています。
私も今では、Mona でバリバリ make を活用しているので違和感はなくなったのですが、最初のころは間違った使い方をしていたり、いろいろな人から効率的な Makefileの書き方を教わったりと結構苦労した覚えがあります。
2,3年前にこの記事を読むことができたらなぁと正直思いました。


Mona は非常にオープンで、ソースコードも公開しているし誰でも中身を見ようとすれば見られるので、あえてノウハウの公開をすることはしていなかったのですが、やねうらおさんのエントリーを見て考え方を改めました。


blogや日記にノウハウがまとめて書かれているのと、ただソースコードが公開されているのでは雲泥の差があり。
前者の方がはるかに後学の方々の役に立つだろうなと。


というわけで私がよく使う Makefileのサンプルを紹介します。

TARGET  = ./firstfit$(EXEEXT)
SOURCES = main.cpp MemoryManager.cpp

CXXFLAGS = -Wall -g
INCLUDE  = -idirafter .

OBJECTS = $(SOURCES:.cpp=.o)

all : $(TARGET)

$(TARGET): $(OBJECTS)
	$(CXX) $(OBJECTS) -o $(TARGET)


.SUFFIXES: .cpp .o
.cpp.o:
	$(CXX) $(CXXFLAGS) $(INCLUDE) -c $<

depend:
	$(CXX) -MM $(INCLUDE) $(CXXFLAGS) $(SOURCES) > dependencies

clean :
	rm -f $(OBJECTS) $(TARGET)

include dependencies

この Makefile は main.cpp , MemoryManager.cppをビルドして、firstfit.exeを作るためのものです。

make depend # dependencies 生成
make # ビルド

と使用します。


ポイントは2つ。

  • .cpp と .o を同一のフォルダに格納します。
  • .cpp と .h 等の依存関係を -MMオプションで自動生成します。
    • つまり依存関係を手で書く必要がありません


非常に簡単な例ですが、これを基本として応用していけば効率的なビルドを行うMakefileが書けるようになると思います。


なお Makeについてもっと知りたい場合は

make 改訂版 (A nutshell handbook)

make 改訂版 (A nutshell handbook)


を読むと良いでしょう。


「おれもMakefile公開するぜ!!」的な、Makefile Battonを期待していますw
オープンソースコミュニティの大御所の方々がノウハウを公開してくれたらうれしいなぁ。