本の虫

著者:江添亮
ブログ: http://cpplover.blogspot.jp/
メール: boostcpp@gmail.com
Twitter: https://twitter.com/EzoeRyou
GitHub: https://github.com/EzoeRyou

アマゾンの江添のほしい物リストを著者に送るとブログ記事のネタになる

筆者にブログのネタになる品物を直接送りたい場合、住所をメールで質問してください。

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