cygwinのパッケージでは2016年2月6日現在で、GCC 4.9.3か5.3.0がインストールできますが、事情があって4.7系をcygwinで使いたくセルフコンパイルしてみました。
最近のGCCはビルドするのに
・GMP
・MPFR
・M4
・MPC
等のライブラリに依存しているのでこれらのパッケージも先にインストールしておく必要があります。
今回私がビルドしたのはGCC4.7.2
https://ftp.gnu.org/gnu/gcc/gcc-4.7.2/gcc-4.7.2.tar.gz
です。
ライブラリのインストールなどは除いて、GCC本体のコンパイルは最短で、
の僅か6ステップで済みます。
$wget https://ftp.gnu.org/gnu/gcc/gcc-4.7.2/gcc-4.7.2.tar.gz
$tar xzfv gcc-4.7.2.tar.gz
$cd gcc-4.7.2
$./configure
$make
$make install
$wget https://ftp.gnu.org/gnu/gcc/gcc-4.7.2/gcc-4.7.2.tar.gz; tar xzfv gcc-4.7.2.tar.gz; cd gcc-4.7.2;./configure;make;make install
とすればワンライナーです。
が、
それは建前だけの話で現実には世の中はもう少し厳しくて、
最悪、
あ~コンパイル通らねぇしなんだよこのエラーは!?もういいや!しょうがねぇVMにUbuntuでもインストールしてそっちでなんとかするか。
ってなることが多いです。
今回は強引ではありますがmake installまでいけたので./configure~make installまでの注意点をあげておきます。
1.configure
今回私はC,C++が使いたかったので
としました。
$./configure --disable-nls --enable-languages=c,c++ --disable-werror
ちなみに上記のライブラリがインストールされていないとこの段階で停止します。
※エラーが出た場合は、cygwinのインストーラを使って依存するライブラリがインストールされているか確認がしてみましょう。
特に問題なければ5~10分程でconfigureは終わり、Makefileが生成されます。
2.make
./configureが終われば
を実行するだけなのですが、最近のGCCはそんなに簡単に成功しません
$make
- build error: undefined reference to `libc_name_p'
私の環境ではこのようなエラーで停止しました。
解決策を求めてググっているとGCC4.5で発生する同様のエラーのパッチの情報が上がっていました。
cfns: fix mismatch in gnu_inline attributes - Patchwork
エラーの発生しているファイルも同じ
gcc/cp/cfns.gperf
gcc/cp/cfns.h
の2ファイルです。
要するに2ファイルのhash関数の宣言部分に
を追加しなさいということのようです。
#ifdef __GNUC_STDC_INLINE__
__attribute__ ((__gnu_inline__))
#endif
パッチに修正後再度ビルドをかけると機嫌よくコンパイルが進みましたが、またもやエラーが発生しました。
どうもcompareという処理でエラーが発生しているようでした。
色々調べたのですが、この問題はなかなか解決しません。
なのでちょっと強引なやり方ですが、ビルド自体は正常にできているようなのでMakefileからcompareと呼び出し元をコメントアウトして再びmakeを実行してみます。
********** ビルドすること数十分 ****************
ついにmakeが正常に終了しました。
3.make install
無事にビルドが完了したらmake installするだけです。
ちなみにインストール先は何も./configureでprefixを指定しなければ/usr/local以下にインストールされます。
[感想]
今回はgcc4.7.2のビルドをしてみましたがgnuからダウンロードして無事make installできるまで調査やらも含めると3日程度かかりました。
※ビルド自体にも時間もかかりますし・・・
GCCは使うまでに時間がかかるので今後はセルフ・クロスに関わらずClangの出来に期待したいですね。
※そういえばitronのtoppersプロジェクトではGCCを使うことを前提にしていますがまともに環境構築できたためしがありません。いつもGCCをターゲット用にビルドする時点で挫折してしまいます。
ちなみに私のPCはcore i7/windows7 64bitなので普段はcygin_x86_64のcygwinを使っているのですが、64bit版のcygwinでは./configureすらうまく動きませんでした。
直接的な原因はconfigure内で使っているsedコマンドが意図したとおりに動いていないためのようでしたが、sed単体で動かしてみても特におかしな動きをしているわけでもなく
またx86版のcygwinではそのような現象は発生しませんでした。
cygwinは便利ですが、ちょくちょくこういう謎のトラブルに悩まされるのが残念なところです。