1. MinGW環境について
GCCを自前でビルドしようという意気込みの方は、MinGW環境もすでにあるという前提で、細かい説明は省略します。
MinGW環境については、こちらもお読みいただくと参考になると思います。
MinGW環境のアップデート (2013/10/14)
MSYS環境のアップデート (2011/04/12)
MinGWのmingwrtとw32apiの代わりに、MinGW-w64を使います。
MinGW環境に、MinGW-w64を上書きインストールします。
MinGW-w64 for win32 のインストール
2014/05/25 追記
MinGW-w64も自分でビルドする場合は、こちらの記事も参考にしてください。
MinGW-w64のビルド (v3.1.0以降)
GCC 4.8のビルド手順は、gcc-4.7.2、MinGW-w64、winpthreadsの組み合わせで確認しました。
2013/10/14 追記
現在は、MinGW公式でgcc-4.8.1がリリースされています。
追加で、FlexとTexinfoをインストールします。
インストール済みの場合は、あらためてインストールする必要はありません。
以下のファイルを、
C:\msys\1.0\
に、解凍します。
MinGWとMSYSを mingw-get-inst-20120426.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. ライブラリのインストール
以下のライブラリは、あらかじめインストールしておいてください。
GCC 4.7まで必要だったPPLは、GCC 4.8では不要になりました。
最新版は、各ライブラリのページで確認してください。
winpthreads
zlib-1.2.8
libiconv-1.14
gmp-6.0.0a
mpfr-3.1.2
mpc-1.0.2
cloog-0.18.1、isl-0.12.2
必要なライブラリなどについては、こちらも参照してください。
Prerequisites for GCC
http://gcc.gnu.org/install/prerequisites.html
3. ソースコードの準備
GCC 4.8のソースコードは、このページから適当なサーバを選んでダウンロードしてください。
http://gcc.gnu.org/mirrors.html
この辺りから、
http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.8.3/
gcc-4.8.3.tar.bz2
を、ダウンロードします。
ファイルを適当な場所に保存して、解凍します。
ソースコードとビルド用のディレクトリは、分けておいた方が良いと思います。
私の場合は、こんな感じにしています。
/usr/local/src/gcc-4.8.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.8.3.tar.bz2
次に、
make-temp-fileパッチ
make-temp-file.diff
を適用します。
gcc-4.5.0用のパッチですが、そのまま使用します。
その他、
libstdc++-v3/configure
の19945行目辺りで、Sleep関数をチェックしている所の条件が、
if test x"$ac_has_nanosleep$ac_has_sleep" = x"nono"; then
になっていて、正しく判定されません。
「nono」を「no」に修正します。
$ cd gcc-4.8.3
$ patch -p1 < ../make-temp-file.diff
$ sed -i.orig 's/nono/no/g' libstdc++-v3/configure
4. GCC 4.8のビルド
ここまで準備ができましたら、GCC 4.8をビルドします。
ビルド用のディレクトリ(/usr/local/src/build/)で、configureを実行します。
--enable-threads
は、何も設定しない場合「Thread model: win32」になります。
MinGW-w64とwinpthreadsをインストールすると、
--enable-threads=posix
という設定でGCCをビルドできるようになり、「Thread model: posix」になります。
$ ../gcc-4.8.3/configure --prefix=/mingw --build=mingw32 --with-arch=i686 --with-tune=generic --enable-threads=posix --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-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
のところは、完成したGCCの-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します。
$ 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" OPTIMIZE_CXXFLAGS="-DIN_WINPTHREAD" LDFLAGS="-s" 2>err.log 1>out.log
そのままmakeだけすると、デバッグシンボル入りの巨大なバイナリになってしまうため、フラグを変えています。
メッセージをログに保存して、何か問題があった時に参照できるようにしています。
5. インストール
そのままmake installするのはちょっと危険です。
私の場合、TDMさんだったか誰かのインストールスクリプトを参考に、以下のように、実行環境とは別のディレクトリにインストールしています。
$ make DESTDIR=/develop/sandpit/dw2 install
MSYSから見ると、
/develop/sandpit/dw2/mingw/
実際のディレクトリは、
C:\msys\1.0\develop\sandpit\dw2\mingw\
に、インストールされます。
あとは、ディレクトリ構造を変えずに、そのままMinGW環境に上書きすれば完了です。
$ cp -rp /develop/sandpit/dw2/mingw /c/.
configureからmake installまでの流れは、けっこう時間がかかりますので、私はスクリプトで流しています。
参考までに、こちらに置いておきます。
gcc-4.8.3-build-dw2-generic-posix.sh
【補足】
とりあえず上記の手順で完成なのですが、出来上がったGCC 4.8で、個別ライブラリを全部コンパイル&インストールし直して、またGCC 4.8をビルドし直せば完璧です。
makeのコンパイルフラグについての補足です。
libgompやlibstdc++で、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)」が選択されるようにしました。
gcc-4.8.1から、libstdc++でもlibgompと同じようなエラーが出るようになったので、OPTIMIZE_CXXFLAGS="-DIN_WINPTHREAD" を追加しました。
【更新履歴】を見る