MinGW(gcc 4.6.2)とBoost 1.48を使ってcfg1.7.0をビルドする

いままで軟弱にVS+BoostProでcfgをビルドしてましたが,漢なら黙ってmsysだろと言われていそうな気がしたのでやりましたよ*1

まずはMinGWでBoost1.48をビルド

Boostを展開して,

$ bootstrap.sh

でうまくいくかなと思ったら,sys/wait.hが無いと言われました。*2
bootstrapではb2.exeやbjam.exeを作るところなので,他の環境でもいいだろうということで,今回はVS9のコマンドラインから

>bootstrap.bat

で作成しました。
続いて,msysからbjam.exeを使って

$ bjam -sTOOLS=mingw --toolset=gcc --stagedir="./stage/mingw" --without-python --without-mpi --build-type=complete variant=release link=static threading=multi runtime-link=static release debug stage -j2

しばしコーヒーブレイクします。
カレントディレクトリの./stage/mingw/libにMinGW用のBoostライブラリができあがります。

BOOSTのライブラリは

作成したライブラリをみると,libboost_(ライブラリ名)-mgw46-mt-s-1_48.aのような名前になっていると思います。

cfgのMakefile.config

cfgフォルダに移って
./configureでMakefile.configを作成します。

boostをmsysのhomeディレクトリで作成し,ライブラリディレクトリがstage/mingw/libにある場合
作成したMakefile.configファイルを以下のように修正します。

LIBBOOST_SUFFIX=-mgw46-mt-s-1_48
BOOST_VERSION=1_48
BOOST_DIR=/home/hoge/boost_1_48_0
LIBBOOST_DIR=/home/hoge/boost_1_48_0/stage/mingw/lib
OPTIONS=

私の使っているmsysではMakefileでOSTYPEをmsysで認識していません。
リンク時にエラーが出る場合はcfgフォルダのMakefileを修正すればできるはずです。

MinGWのDLLから逃れるためには

上までのステップでmsys環境でcfgが動作しますが,それ以外の環境で動かそうとするとDLLが足りないというメッセージがでます。
ので,DLLがいらないように静的リンクをするようにcfg/Makefileの以下の部分を書き換えます。

cfg: $(OBJFILES) $(LIBFILES)
	$(CXX) $(CXXFLAGS)  -std=c++0x -DBOOST_THREAD_USE_LIB -static-libgcc -static-libstdc++ -o cfg $(OBJFILES) -L$(LIBBOOST_DIR) $(LIBFILES) $(BOOST_LIBFILES)

これでcfg.exeの完成です。

*1:実は中で要請があったのです

*2:いまだにMinGWで無いのはなぜなんだろう