2017-01-17

GCCのSVN trunkをビルドする方法

GCC 7がC++17のコア言語機能を完全に実装したので、ようやく参考書のサンプルコードが検証できるようになった。

C++ Standards Support in GCC - GNU Project - Free Software Foundation (FSF)

しかし、GCC 7はまだリリースされていない。少し試すだけならばwandboxが使えるが、本格的に使うにはローカルにほしい。

[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と呼ばれる方法で行われる。

  1. システムのコンパイラーでstage-1 GCCをビルドする
  2. stage-1 GCCでstage-2 GCCをビルドする
  3. stage-2 GCCでstage-3 GCCをビルドする
  4. stage-2とstage-3を比較して挙動に差がないことを確認する
  5. 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

3 comments:

Anonymous said...

結局新しいGCCはインストールできたのでしょうか?

Anonymous said...

ビルドしたGCCどう?

Anonymous said...

debian experimentalならリリース前からgcc7もclang-4.0もパッケージングされてるが…
まあもれなくexperimentalなlibcもついてくるんだけどVMだかchrootに入れれば。
ubuntuだとppaに頼ることになるのかな