August 28, 2006makeでソースとバイナリを違うディレクトリに[Computer]
先日、室内飛行機の自律飛行プロジェクトの成果物としてH8/3694のフレームワークを公開しましたが、その際、自動コンパイル(ビルド)をどのように構成するかで少し悩みました。 オープンソース系の大きなプロジェクト(apacheなど)をみると、ソースとそのコンパイル結果であるバイナリは同じ場所に展開されるのが常套手段のようです。これはコンパイラが分割コンパイルをサポートしており、ビルドを行うのにメジャーなプログラムであるmakeがこのような方法を簡単に実現できるためだと思います。 TARGET = hoge
SRCS = $(shell ls *.c) OBJS = $(SRCS:.c=.o) all : $(TARGET) %.o : %.c $(TARGET) : $(OBJS) clean : .PHONY: all clean このスクリプトを使ってmakeを実行すると、(ソース).cは同じディレクトリに分割コンパイルされて(ソース).oというバイナリとして生成されます。そして(ソース).oが合わさって最終的にhogeという目的のブツが手に入ります。 ところがソースを書くのに別にeclipseなどの統合開発環境(IDE)を使用している場合、ソースとバイナリが同じディレクトリにあると、使用上鬱陶しいことがあります(例えばファイルを選択する際など)。eclipseならフィルターで消すことができますが、根本的な解決にはならないので、Visual Studioのようにバイナリを別ディレクトリに生成した方がよいのではないかと考えました。 続きをどうぞ。 そのような場合は、次のようなMakefileを書けばうまくいきます。 TARGET = hoge
SRCS = $(shell ls *.c) OBJS = $(SRCS:.c=.o) BUILD_DIR = build_by_$(CC) all : $(BUILD_DIR) $(patsubst %,$(BUILD_DIR)/%,$(TARGET)) $(BUILD_DIR) : $(BUILD_DIR)/%.o : %.c $(BUILD_DIR)/$(TARGET) : $(patsubst %,$(BUILD_DIR)/%,$(OBJS)) clean : .PHONY: all clean ここでpatsubstという組込み関数が活躍しています。これは文字列を編集する関数の一つで、makeの機能です。詳細はgmakeのマニュアル Functions for Transforming Textをどうぞ。他にも色々な組込み関数があるようです。 こうすると生成されるものは全てbuild_by_$(CC)の中にでてくるので、管理がしやすくなるのではないでしょうか。リビルドの前処理はそのディレクトリを消せばいいだけですし、CVSやSVNといったプロジェクト管理ツールとの併用もしやすくなると思います。 なおH8/3694のフレームワークではさらに凝って、別ディレクトリにバイナリを生成することを多段makeで実現しています。ダウンロードはこちらから。 コメント
コメントする
|
スポンサード リンク
|