備忘録: Linux上のMinGWクロスコンパイル環境でBoostを導入

LevanaのWindows用バイナリをビルドする為に、MSYS/MinGWを使ってましたが、
どうにもシェルを互換動作させる為のオーバーヘッドが大きいみたいで、
make中はOSの反応が著しく低下するし、時間もかかりすぎて効率悪いし、
そもそも必要無い限りはWindows立ち上げない人間なので、もうちょっといい方法を考えねば、と思いました。
MinGWは、Linux上でも動かすことができるので、いっそのことビルドもLinuxでやっちゃいましょう。
Gentoo Linux上でcrossdevを使ってmingw32を導入したまではいいものの、Boostの導入に思いの外つまずいたので、
今後の為に備忘録とっておきます。


クロスコンパイルの為の環境は/usr/mingw32/usrがプレフィックスで、
コンパイラやリンカなどの必須バイナリ名にも、mingw32-というプレフィックスがついています。
こういった特殊なファイル配置の場合でも、autoconfの使えるwxWidgetsなどはさほど苦労せず入れられたんですが、
bjamなるBoostの導入システムがかなりの曲者です。Boostが優れたライブラリだけに惜しすぎる。


とりあえずソースの準備はebuildを使えばラクラクです。

$ sudo su
# ebuild /usr/portage/dev-libs/boost/boost-1.41.0-r3.ebuild prepare

(ビルド環境準備)

# cd /var/tmp/portage/dev-libs/boost-1.41.0-r3/work/boost_1_41_0/


bjam(うちの場合はbjam-1_41)が入ってると仮定しますが、ここでそのままbjam走らせたり、
prefixの設定をしても、適切なコンパイラ(mingw32-g++)を呼んでくれないし、
どうにも設定の方法がなさそうなので、gccにシンボリックリンクを張ってやりたいところですが、
もっと汎用性のあるgcc-configを使ってみましょう。

# gcc-config -l
 [1] mingw32-4.4.4 *
 [2] x86_64-pc-linux-gnu-4.4.4 *

むぅ。クロスコンパイル環境とネイティブ環境は共存できて、プレフィックス無しのgccを名乗らせてくれないので、
思い切ってクロスコンパイル環境をディスってネイティブ環境と思い込ませてやりましょう。
これでgcc-configはクロスコンパイル環境をネイティブ環境だと勘違いしてくれます。

# sed -i "s/CTARGET/#CTARGET/" /etc/env.d/gcc/mingw32-4.4.4
# gcc-config mingw32-4.4.4
 * Switching native-compiler to mingw32-4.4.4 ...                [ ok ]
# source /etc/profile
# gcc -v
Using built-in specs.
Target: mingw32
Configured with: /var/tmp/cross/mingw32/portage/cross-mingw32/gcc-4.4.4-r2/work/gcc-4.4.4/configure
--prefix=/usr --bindir=/usr/x86_64-pc-linux-gnu/mingw32/gcc-bin/4.4.4
--includedir=/usr/lib/gcc/mingw32/4.4.4/include --datadir=/usr/share/gcc-data/mingw32/4.4.4
--mandir=/usr/share/gcc-data/mingw32/4.4.4/man --infodir=/usr/share/gcc-data/mingw32/4.4.4/info
--with-gxx-include-dir=/usr/lib/gcc/mingw32/4.4.4/include/g++-v4 --host=x86_64-pc-linux-gnu
--target=mingw32 --build=x86_64-pc-linux-gnu --disable-altivec --disable-fixed-point --with-ppl
--with-cloog --enable-nls --without-included-gettext --with-system-zlib --disable-werror
--enable-secureplt --disable-libmudflap --disable-libssp
--with-python-dir=/share/gcc-data/mingw32/4.4.4/python --enable-checking=release
--disable-libgcj --enable-languages=c,c++,fortran --with-sysroot=/usr/mingw32 --disable-bootstrap
--with-bugurl=http://bugs.gentoo.org/ --with-pkgversion='Gentoo 4.4.4-r2 p1.3, pie-0.4.5'
Thread model: win32
gcc version 4.4.4 (Gentoo 4.4.4-r2 p1.3, pie-0.4.5)


心置きなくMinGWでビルドできるようになりましたが、Windows用バイナリを作りたいことをbjamに知らせるために、
適切なオプション指定で、ようやくビルドできるようになります。

# cd /var/tmp/portage/dev-libs/boost-1.41.0-r3/work/boost_1_41_0/
# bjam-1_41 toolset=gcc target-os=windows threadapi=win32 --prefix=/usr/mingw32/usr \
> --link=static --runtime-link=static --without-python release stage

(ビルド処理)

# bjam-1_41 toolset=gcc target-os=windows threadapi=win32 --prefix=/usr/mingw32/usr \
> --link=static --runtime-link=static --without-python release install

(インストール処理)

めでたし、めでたし?


あぁ、ちゃんとgcc-configで環境を戻しておかないと、
標準C++ライブラリに依存したプログラムが動かなくなるので注意です。

# gcc-config x86_64-pc-linux-gnu-4.4.4
 * Switching native-compiler to x86_64-pc-linux-gnu-4.4.4 ...             [ ok ]