GCCをクロスビルドする

linux上で「mingw用バイナリを吐くgcc」をビルドする方法を調べた。
#正確には「linux(i386)ホスト上でmingw(32bit)用のバイナリを作る」gccがビルドしたかった


方法を説明したサイトはかなりいろいろあるけど見つけた中で一番簡単だったのはこれ。*1
> http://ffmpeg.zeranoe.com/blog/?p=383#more-383

以下のスクリプトを実行するだけでその場にgcc一式がビルドされる。すばらしく簡単。

# @Linuxホスト
cd /path/to/mingw-dev/
wget http://zeranoe.com/scripts/mingw_w64_build/mingw-w64-build-3.6.4
bash mingw-w64-build-3.6.4 [--build-type=win32]

ちなみに、mingw-w64 はそういうプロダクト名であって64bit版のmingwでは無い(32bit版もある)ようだ。ひどい。

使い方

gccを直接使う場合
# @Linuxホスト
/path/to/mingw-dev/i686-w64-i686/bin/i686-w64-mingw32-gcc hoge.c
# @Windows.Mingw
./a.exe
autoconfを使う場合

--host を指定する。
大分非直感な気がするが、「コンパイルして得られたプログラムが動く」ホストを指定するものらしい。
じゃあ --target は何かというと、「「コンパイルされたコンパイラ」が出力するバイナリ」が動く環境を指定する…ようだ(自信無し)。

./configure --host=i686-w64-mingw32
make

configureの出すメッセージに ...whether we use cross compiler? ... yes みたいな行があれば、クロスコンパイラが指定出来てる気がする。


依存関係のある場合はCFLAGSとLDFLAGSで指定できる。

CFLAGS="-L/path/to/mingw/lib" LDFLAGS="-lgmp" ./configure --host=i686-w64-mingw32
make

感想

自分で1から手動ビルドする場合、オプションが長大だったり、パッチを当てたりする必要があり予想より大分大変そうだ。*2
ターゲットがmingwならどうせwindows上で作業すればどうにかなるはずのシロモノなので、慣れてないならそっちで頑張った方が分かり易いかも知れない。

*1:但しバイナリパッケージで済むなら多分それが最も楽っぽい

*2:大学でマイコンを弄くった時にも触っていたはずなんだけど、あれはバイナリをどこからか持って来たんだったかな…?