2012年03月26日

GCC 4.7のビルド

それでは、GCC 4.7をビルドします。

基本的には、GCC 4.6をビルドする手順と同じなのですが、追加ライブラリのPPLが、GCC 4.6でコンパイルしたものとGCC 4.7でコンパイルしたものでは互換性がないらしいです。
普通にGCC 4.6を使ってビルドしたGCC 4.7で、何かコンパイルしようとすると、cc1.exeがクラッシュします。

手順としては、GCC 4.6でPPL無しの仮GCC 4.7をビルドして、仮GCC 4.7で、PPLを含めたGCC 4.7をビルドします。

2013/05/29 追記
この記事を書いた当時、MinGW公式のGCCバイナリは4.6.xまでしかなかったのですが、現在はgcc-4.7.2のバイナリがあります。
MinGW公式のgcc-4.7.2でgcc-4.7.3をビルドする場合、
4. 仮GCC 4.7のビルド
5. 仮GCC 4.7のインストール
は、省略して進めてください。


1. MinGW環境について
GCCを自前でビルドしようという方は、MinGW環境もすでにあるという前提で、細かい説明は省略します。

MinGW環境については、こちらもお読みいただくと参考になると思います。
MinGW環境のアップデート (2011/04/12)
MSYS環境のアップデート (2011/04/12)

2012/05/12 追記
MinGWのmingwrtとw32apiの代わりに、MinGW-w64を使う方手順は、以下の記事を参照してください。
MinGW-w64 for win32 のインストール

MinGW-w64をインストールすると、winpthreadsというPthreadsライブラリが使用できます。
pthreads-w32と共存はできませんので、pthreads-w32に上書きします。
winpthreadsのインストール手順は、以下の記事を参照してください。
winpthreadsのコンパイル&インストール


追加で、FlexとTexinfoをインストールします。
インストール済みの場合は、あらためてインストールする必要はありません。

以下のファイルを、
C:\msys\1.0\
に、解凍します。

MinGWとMSYSを mingw-get-inst-20111118.exe などでインストールした場合、MSYSの場所は、
C:\MinGW\msys\1.0\
になっているかもしれませんので、以下、読み替えてください。

・flex-2.5.35-2
http://sourceforge.net/projects/mingw/files/MSYS/Extension/flex/flex-2.5.35-2/
flex-2.5.35-2-msys-1.0.13-bin.tar.lzma

・texinfo-4.13a-2
http://sourceforge.net/projects/mingw/files/MSYS/Base/texinfo/texinfo-4.13a-2/
texinfo-4.13a-2-msys-1.0.13-bin.tar.lzma

・regex-1.20090805-2
http://sourceforge.net/projects/mingw/files/MSYS/Base/regex/regex-1.20090805-2/
libregex-1.20090805-2-msys-1.0.13-dll-1.tar.lzma

Git for Windowsがインストール済みで、MSYSから使用できるようにパスを通していると、GCCのconfigureの時にGit for Windowsのbisonが応答しなくなって、固まる場合があります。
その場合は、MSYSにbisonをインストールしてください。

・bison-2.4.2-1
http://sourceforge.net/projects/mingw/files/MSYS/Extension/bison/bison-2.4.2-1/
bison-2.4.2-1-msys-1.0.13-bin.tar.lzma


2. ライブラリのインストール
以下のライブラリは、あらかじめインストールしておいてください。
この時点では、まだPPLとCLooGはインストールしなくても良いです。

最新版は、各ライブラリのページで確認してください。
pthreads-w32 release 2.9.1
winpthreads (MinGW-w64) ※pthreads-w32と共存できません。
zlib-1.2.7
libiconv-1.14
gmp-5.1.1
mpfr-3.1.2
mpc-1.0.1

必要なライブラリなどについては、こちらも参照してください。
Prerequisites for GCC
http://gcc.gnu.org/install/prerequisites.html


3. ソースコードの準備
GCC 4.7のソースコードは、このページから適当なサーバを選んでダウンロードしてください。
http://gcc.gnu.org/mirrors.html

この辺りから、
http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.7.3/
gcc-4.7.3.tar.bz2
を、ダウンロードします。

ファイルを適当な場所に保存して、解凍します。
ソースコードとビルド用のディレクトリは、分けておいた方がよいと思います。

私の場合は、こんな感じにしています。
/usr/local/src/gcc-4.7.3/
/usr/local/src/build/
(/usr/local/src/ は、Windows上では、C:\msys\1.0\local\src\ です。)

MSYSでは、
/usr/local/

/local/
は同じディレクトリなので、どちらでも良いです。

$ cd /usr/local/src/
$ tar xjf gcc-4.7.3.tar.bz2

次に、
make-temp-fileパッチ
make-temp-file.diff
を適用します。
gcc-4.5.0用のパッチですが、そのまま使用します。

$ cd gcc-4.7.3
$ patch -p1 < ../make-temp-file.diff


4. 仮GCC 4.7のビルド
ここまで準備ができましたら、PPL無しの、仮GCC 4.7をビルドします。

ビルド用のディレクトリ(/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.3/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

configureオプションについては、こちらを参照してください。
Installing GCC: Configuration
http://gcc.gnu.org/install/configure.html

--with-arch=i686 --with-tune=generic
のところは、-marchと-mtuneのデフォルト値が
-march=i686 -mtune=generic
になるので、自分の環境に合わせて、
--with-arch=core2 --with-tune=core2
とか、
--with-arch=athlon64 --with-tune=athlon64
などとすると良いかもしれません。

自分の環境でしか使用しない場合は、
--with-arch=native --with-tune=native
でも良いかもしれません。

--with-arch、--with-tuneオプション無しの場合は、--build=mingw32 が指定されていると、
-march=i386 -mtune=i386
がデフォルト値になります。


configureが終了したら、makeします。

2013/04/28 追記
CFLAGS_FOR_TARGETに「-DIN_WINPTHREAD」を追加しました。
詳細は【補足】の説明をお読み下さい。

$ make CFLAGS="-O2 -D__USE_MINGW_ACCESS" CFLAGS_FOR_TARGET="-O2 -D__USE_MINGW_ACCESS -DIN_WINPTHREAD" CXXFLAGS="-mthreads -O2" CXXFLAGS_FOR_TARGET="-mthreads -O2" LDFLAGS="-s" 2>err.log 1>out.log

そのままmakeだけすると、デバッグシンボル入りの巨大なバイナリになってしまうため、フラグを変えています。

メッセージをログに保存して、何か問題があった時に参照できるようにしています。


5. 仮GCC 4.7のインストール
そのままmake installするのはちょっと危険です。
私の場合、TDMさんだったか誰かのインストールスクリプトを参考に、以下のように、実行環境とは別のディレクトリにインストールしています。

$ make DESTDIR=/develop/sandpit/dw2 install

MSYSから見ると、
/develop/sandpit/dw2/mingw/

実際のディレクトリは、
C:\msys\1.0\develop\sandpit\dw2\mingw\
に、インストールされます。

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


6. PPL、CLooGのインストール
この時点で、仮GCC 4.7が使えるようになっているものとします。
「gcc -v」で確認できます。

PPLとCLooGは、GCC 4.6でコンパイル済みのものがあっても、仮GCC 4.7でコンパイルし直してから、インストールしてください。
ppl-1.0
cloog-0.18.0、isl-0.11.2


7. 本番GCC 4.7のビルド&インストール
本番の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++」としています。

2012/05/12 追記
--enable-threads
は、何も設定しない場合「Thread model: win32」になります。
MinGW-w64とwinpthreadsをインストールすると、
--enable-threads=posix
という設定でGCCをビルドできるようになり、「Thread model: posix」になります。

2012/07/02 追記
ppl-1.0以降、configureでPPLが見つけられないため、「--disable-ppl-version-check」を追加しました。

$ ../gcc-4.7.3/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 --disable-ppl-version-check --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 -DIN_WINPTHREAD" 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/.

以上で、終了です。


configureからmake installまでの流れは、けっこう時間がかかりますので、私はスクリプトで流しています。
参考までに、こちらに置いておきます。

・仮GCC 4.7用
gcc-4.7.3-build-dw2-generic-pre.sh
・本番GCC 4.7用
gcc-4.7.3-build-dw2-generic.sh
または、
・本番GCC 4.7用 (--enable-threads=posix) ※MinGW-w64とwinpthreadsが必要です。
gcc-4.7.3-build-dw2-generic-posix.sh


【補足】
とりあえず上記の手順で完成なのですが、出来上がった本番GCC 4.7で、個別ライブラリを全部コンパイル&インストールし直して、本番のGCC 4.7をビルドし直せば完璧です。

2013/04/28 追記
libgompで、winpthreadsのスタティックライブラリをリンクすると、こんなエラーが出ます。
.libs/critical.o:critical.c:(.text+0xc): undefined reference to `_imp__pthread_mutex_lock'
.libs/critical.o:critical.c:(.text+0x2c): undefined reference to `_imp__pthread_mutex_unlock'
(以下略)

winpthreadsのヘッダファイル「pthread.h」に以下の記述があります。

#if defined DLL_EXPORT
#ifdef IN_WINPTHREAD
#define WINPTHREAD_API __declspec(dllexport)
#else
#define WINPTHREAD_API __declspec(dllimport)
#endif
#else
#define WINPTHREAD_API
#endif

libgompをコンパイルする時のフラグに「-DDLL_EXPORT」が付いているせいで、winpthreadsの関数に「__declspec(dllimport)」が付けられるのがエラーの原因です。
とりあえず、CFLAGS_FOR_TARGETに「-DIN_WINPTHREAD」を追加して、「__declspec(dllexport)」が選択されるようにしました。

pthreads-w32の場合は、上記のような問題はありません。


【更新履歴】を見る
posted by あべちん at 20:25 | Comment(9) | TrackBack(0) | GCC自前ビルド
この記事へのコメント
あべちんさん
こんばんわー

GCC4.7のコンパイルを調整してみたら
仮GCCをコンパイルしてインストールした後に

pplをコンパイルをしようとすると
configureで

「libstdc++-6.dllはWINDOWS上で実行できないかエラーを含んでます」とでてしまいます

mingw-get-inst-20111118.exeで
まるっと入れてしまってるので変なものが入ってるのかな?・・・

もうちょっとMINGWの初期設定から調べてみます

以上だめ報告でした・・・_no
Posted by 蓄電 at 2012年03月27日 23:16
蓄電さん、こんにちは。管理人です。

試しに、まっさらな状態からmingw-get-inst-20111118.exeでMinGWとMSYSをインストールして、手順通りやってみましたが、最後までビルドできました。

mingw-get-inst-20111118.exeは、
Download latest repository catalogues
を選択。

MinGW Compiler Suite
C Compiler
C++ Compiler
MSYS Basic System
MinGW Developer ToolKit
にチェックしました。

Flex、Texinfo、Bisonは自動でインストールされたので、手動で追加する必要はありませんでした。

ちなみに、OSはWindows XP SP3です。

あと、何が違うんでしょうね?
Posted by あべちん at 2012年03月30日 19:41
追加です。

他に影響がありそうなのは、binutilsなどでしょうか?
最新のbinutilsは、2.22です。
Posted by あべちん at 2012年03月30日 20:07
あべちんさん

試してもらってまですみません
自分のほうは今週
忙しくてまったく時間が取れなかったので
週末試しためしたいと思います
GCC4.6.3はさくっと行くのに4.7がいかないっすね・・

環境としては
WINDOWS7(32BIT)です
また報告します
Posted by 蓄電 at 2012年03月31日 01:28
あべちんさん

こんばんわー

今日OSから入れなおして試したら
問題なくコンパイルできました
原因はわからないですが
何かがおかしかったようです
ありがとうございました


Posted by 蓄電 at 2012年03月31日 21:55
蓄電さん、こんばんは。管理人です。

何かの拍子に、ファイルが壊れたんでしょうかね?
成功してよかったです。
Posted by あべちん at 2012年04月02日 19:02
Please note: if you use mingw64 and winpthreads posix thread, you should also use --enable-libstdcxx-time=yes, or will lack some time functions. Please use winpthreads static build, because some one said there may be some crash issues in shared build.
Posted by 哈哈 pcxprj at 2012年05月30日 10:00
Hi, 哈哈 pcxprj
Thank you for your comments.

I added --enable-libstdcxx-time=yes to configure option, I tried to build.
However, the results did not change.
Maybe because MinGW does not have nanosleep function.
Please tell me if there is any other thing to note.

abechin
Posted by あべちん at 2012年06月03日 17:23
Yea. MinGW should lack some functions. I remembered Nanosleep is contained in winpthread lib. (MinGW64 CRT containes one winpthread dump lib)

At present, I use MinGW64 CRT and winpthread for better api support.
Posted by 哈哈 pcxprj at 2012年07月29日 01:37
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

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


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

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