2012年03月03日

GCC 4.7をMinGWで自前ビルドしてみたらけっこう大変だったの巻

GCC 4.7.0がリリース間近ですね。
2012/03/03現在のGCC 4.7.0の最新版は、gcc-4.7.0-RC-20120302です。

ということで、gcc-4.7.0-RC-20120302をMinGWで自前ビルドしてみました。

基本的には、GCC 4.6をビルドする手順と同じなのですが、追加ライブラリのPPLが、GCC 4.6でコンパイルしたものとGCC 4.7でコンパイルしたものでは互換性がないらしいです。

普通にGCC 4.6を使ってビルドしたGCC 4.7で、何かコンパイルしようとすると、cc1.exeがクラッシュします。

試しに、ビルドする時に使ったGCC 4.6の「libstdc++-6.dll」を、できあがったGCC 4.7の「/mingw/bin/libstdc++-6.dll」に上書きしたら、GCC 4.7が動作するようになりました。

GCC 4.7のビルドに成功した手順は、以下の通りです。

必要なビルド環境などは、GCC 4.6の記事を参考にしてください。
GCC 4.6のビルド

1. 以下のライブラリを、コンパイル&インストールします。
GCC 4.6などを自前ビルドしたことがあって、インストール済みの場合は次の手順へ進んでください。
pthreads-w32 release 2.9.0
zlib-1.2.6
libiconv-1.13.1
gmp-5.0.4
mpfr-3.1.0
mpc-0.9


2. PPL無しの、仮GCC 4.7をビルドします。
ソースコードは、このあたりからダウンロードしてください。
ftp://ftp.dti.ad.jp/pub/lang/gcc/snapshots/4.7.0-RC-20120302/
gcc-4.7.0-RC-20120302.tar.bz2

make-temp-fileパッチ(別名、必要なのか分からないがなんとなくパッチ)も適用します。
make-temp-file.diff

私の場合、作業ディレクトリは、/usr/local/src/ にしています。
/local/src/ でも同じ場所です。

$ cd /usr/local/src/
$ tar xjf gcc-4.7.0-RC-20120302.tar.bz2
$ cd gcc-4.7.0-RC-20120302/
$ patch -p1 < ../make-temp-file.diff
$ cd ..
$ mkdir build
$ cd build/

ビルド作業は、/usr/local/src/build/ で実行します。
最初に、configureを実行します。

PPL無しにするため、「--enable-cloog-backend=isl --disable-cloog-version-check --with-host-libstdcxx=-lstdc++」の代わりに、「--without-ppl」としています。
仮GCC 4.7はgccとg++だけあれば良いので、「--enable-languages=c,c++」としています。

$ ../gcc-4.7.0-RC-20120302/configure --prefix=/mingw --build=mingw32 --with-arch=i686 --with-tune=generic --enable-threads --enable-languages=c,c++ --enable-libgomp --disable-sjlj-exceptions --with-dwarf2 --enable-version-specific-runtime-libs --disable-win32-registry --disable-werror --disable-nls --without-ppl --enable-lto --with-system-zlib --enable-libstdcxx-debug --enable-cxx-flags='-fno-function-sections -fno-data-sections' --enable-fully-dynamic-string --disable-libstdcxx-pch --disable-bootstrap

次に、makeします。
$ make -j3 CFLAGS="-O2 -D__USE_MINGW_ACCESS" CFLAGS_FOR_TARGET="-O2 -D__USE_MINGW_ACCESS" CXXFLAGS="-mthreads -O2" CXXFLAGS_FOR_TARGET="-mthreads -O2" LDFLAGS="-s" 2>err.log 1>out.log

err.logとout.logを見て、エラー無しでmakeが終了していたら、make installします。
いきなり上書きインストールしてしまわないように、/develop/sandpit/dw2 にインストールします。
$ make DESTDIR=/develop/sandpit/dw2 install

ここまでエラー無しで終了したら、いよいよMinGW環境に仮GCC 4.7をインストールします。
MinGW環境が「C:\MinGW\」の場合、以下のようにディレクトリごと上書きコピーします。
ドキドキ
$ cp -rp /develop/sandpit/dw2/mingw /c/.


3. PPL、CLooGを、仮GCC 4.7でコンパイル&インストールします。
GCC 4.6でコンパイル済みのものがあっても、仮GCC 4.7でコンパイルし直してください。
ppl-0.12
cloog-0.17.0


4. 本番のGCC 4.7をビルドします。
仮GCC 4.7をビルドした時の中間ファイルは、削除しておきます。
GCC 4.7のソースコードは、そのまま使用します。
buildでない別のディレクトリで、間違って「rm -rf *」しないでくださいね。
$ cd /usr/local/src/build/
$ rm -rf *

またconfigureを実行します。

仮GCC 4.7では「--without-ppl」としていましたが、本番では「--enable-cloog-backend=isl --disable-cloog-version-check --with-host-libstdcxx=-lstdc++」としています。
gccとg++だけでも良いのですが、objcとobj-c++も追加して、「--enable-languages=c,c++,objc,obj-c++」としています。

$ ../gcc-4.7.0-RC-20120302/configure --prefix=/mingw --build=mingw32 --with-arch=i686 --with-tune=generic --enable-threads --enable-languages=c,c++,objc,obj-c++ --enable-libgomp --disable-sjlj-exceptions --with-dwarf2 --enable-version-specific-runtime-libs --disable-win32-registry --disable-werror --disable-nls --enable-cloog-backend=isl --disable-cloog-version-check --with-host-libstdcxx=-lstdc++ --enable-lto --with-system-zlib --enable-libstdcxx-debug --enable-cxx-flags='-fno-function-sections -fno-data-sections' --enable-fully-dynamic-string --disable-libstdcxx-pch --disable-bootstrap

次に、make、make installします。
ここからは、仮GCC 4.7と同じ手順です。
$ make -j3 CFLAGS="-O2 -D__USE_MINGW_ACCESS" CFLAGS_FOR_TARGET="-O2 -D__USE_MINGW_ACCESS" CXXFLAGS="-mthreads -O2" CXXFLAGS_FOR_TARGET="-mthreads -O2" LDFLAGS="-s" 2>err.log 1>out.log
$ make DESTDIR=/develop/sandpit/dw2 install

ここまでエラー無しで終了したら、できあがったGCC 4.7をMinGW環境にインストールします。
$ cp -rp /develop/sandpit/dw2/mingw /c/.

以上で、終了です。

最後にできあがったGCC 4.7で、追加ライブラリから全部ビルドし直せば、さらに完璧です。


もう何10回も試してたどりついた手順なので(笑)、たぶん間違いないと思います。

GCC 4.5でGCC 4.6をビルドした時は、こんな問題は起こらなかったんですけどねー。

こんなの信用できんという方は、仮GCC 4.7を仲介しないで、GCC 4.6でPPL入りのGCC 4.7をいきなりビルドして、cc1.exeがクラッシュするのを見てみるのも楽しいかもしれません。
posted by あべちん at 23:01 | Comment(0) | TrackBack(0) | GCC自前ビルド
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/54279549
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック