GCCのSVN trunkをビルドする方法
GCC 7がC++17のコア言語機能を完全に実装したので、ようやく参考書のサンプルコードが検証できるようになった。
C++ Standards Support in GCC - GNU Project - Free Software Foundation (FSF)
しかし、GCC 7はまだリリースされていない。少し試すだけならばwandboxが使えるが、本格的に使うにはローカルにほしい。
そこで、GCCを自前でビルドすることにした。ビルドは以下の手順に従う。
Installing GCC - GNU Project - Free Software Foundation (FSF)
GCCのコンパイルに必要なソフトウェア
Prerequisites for GCC - GNU Project - Free Software Foundation (FSF)
GCCのコンパイル環境を整えるには、有名なGNU/Linuxディストリビューションを使うのが最も手っ取り早い。筆者はUbuntuを使っている。
GCCはC++98で書かれているためにC++98コンパイラーが必要になる。ある程度最近の安定版バージョンのGCCを使うのが最も手っ取り早い方法だ。
POSIX互換シェルが必要だ。これにはGNU bashを使えばよい。
awkが必要だ。GNU awkの最近のバージョンを使っておけば問題ない。
GNU binutilsが場合によっては必要だ。とはいえ、GNU binutilsが入っていない環境でGCCを使いたいとは思わないだろう。
gzip, bzip2, GNU make, GNU tar, Perlが必要だ。
GCCはオプショナルではあるが、デフォルトで4つのライブラリを使う。GNU GMP、MPFR, MPC, islだ。DebianとUbuntuでは以下のようにして入手できる。
apt-get install libgmp-dev libmpfr-dev libmpc-dev libisl-dev
この4つのライブラリは、主要なGNU/Linuxディストロならば十分に最近のバージョンがパッケージ化されているだろうが、GCCのソースコードには./contrib/download_prerequisitesというスクリプトがある。これを実行すると、4つのライブラリのソースコードをダウンロードしてGCCのビルド時にビルドして使うようにもできる。
flexが必要だ。GCCのリリース版のソースコードには、.lファイルからflexで生成したファイルは含まれているのだが、SVN trunkには含まれていない。configureスクリプトはflexが存在しないことを警告してくれないのでハマる。
GCCのソースコードのダウンロード
Downloading GCC - GNU Project - Free Software Foundation (FSF)
GCCのソースコードは様々な方法でダウンロードできる。最新のSVN trunkのソースコードを入手するにはSubversionを使うのが最も手っ取り早い。
svn checkout svn://gcc.gnu.org/svn/gcc/trunk gcc-trunk
一度チェックアウトしたソースコードから最新版への差分をダウンロードするには、svn updateを使う。
他にも、gitミラーやtarで固められたスナップショットもある。
Configure
Installing GCC: Configuration - GNU Project - Free Software Foundation (FSF)
GCCのビルドは、configureスクリプトを実行してMakefileを生成してmakeするという古典的な方法で行われる。configureスクリプトの実行は、GCCのソースディレクトリとは別の場所で行うことが強く推奨されている。そこでそのようにする。
svn checkout svn://gcc.gnu.org/svn/gcc/trunk gcc-trunk
mkdir gcc-build
cd gcc-build
../gcc-trunk/configure オプション
configureスクリプトには、いくつかのオプションを渡す。
今回、GCCをビルドする目的はC++17のコア言語機能を試すことだ。したがって、言語はCとC++しか必要がない。GCCはCとC++の他にも、Ada, Fortran, go, 醜悪なobjective-C, 太古の忌まわしきObjective-C++に加えて、LTOとJITも言語としてサポートしている。
言語をCとC++に限定するには、
--enable-languages=c,c++
をオプションに指定する。
この2017年では、ほとんどの読者はx86-64アーキテクチャのコンピューター上で自由なOSを実行しているはずだ。x86-64アーキテクチャは複数のビルドターゲットがある。GCCでは、32bitコードをm32、64bitードをm64、アドレスは32bitだがその他は64bitなコードをmx32としている。今回の目的はC++17のコア言語を試すことなので、複数ターゲットのコードを吐くことにしか興味がない。なので、multilibを無効にする。
--disable-multilib
GCCのビルドは、他のよくあるソフトウェアと違い、ややこしい。というのも、GCCはかつてCで、今はC++で書かれているからだ。システムのC++コンパイラーでGCCをビルドしたとして、システムのC++コンパイラーが壊れている場合、ビルドしたGCCも壊れてしまう。この問題を発見するため、GCCのビルドは3-stage bootstrapと呼ばれる方法で行われる。
- システムのコンパイラーでstage-1 GCCをビルドする
- stage-1 GCCでstage-2 GCCをビルドする
- stage-2 GCCでstage-3 GCCをビルドする
- stage-2とstage-3を比較して挙動に差がないことを確認する
- stage-3コンパイラーでランタイムライブラリをビルドする
今回はC++17コンパイラーを手っ取り早く試す目的なので、3-stage bootstrapは無効化する
--disable-bootstrap
結果として、configureスクリプトは以下のように実行する
configure --enable-languages=c,c++ --disable-bootstrap --disable-multilib
GCCのビルド
Installing GCC: Building - GNU Project - Free Software Foundation (FSF)
configureが成功したならば、configureを実行したディレクトリにMakefileが生成されているので、あとはmakeするだけでよい。
最適化を有効にして並列コンパイルもできる。
make BOOT_CFLAGS='-O' -j4
GCCのインストール
Installing GCC: Final installation - GNU Project - Free Software Foundation (FSF)
無事にビルドが終わればインストールできる。
make install
デフォルトではインストール先が/usr/local/下になっているので権限が必要だ。
筆者の体験では、flexをインストールしていない状態でconfigureが通り、makeに失敗した後、flexをインストールした後も途中からのmakeは失敗した。
ドワンゴ広告
ドワンゴは本物のC++プログラマーを募集しています。
CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0