Clang 3.5とgcc 4.9.2（Linux Mint）でBoost 1.57.0をビルドする

先日、WindowsでBoost 1.57.0をビルドしましたが、今回は、Linux Mint 17 “Qiana” Cinnamon (64-bit)でBoost 1.57.0のビルドを試します。使用するコンパイラは、Clang 3.5とgcc 4.9.2です。たぶんUbuntuでも、同様の手順でインストールできるかと思います。

当然ですが、コンソールでの作業になります。

とりあえず、*boost_1_57_0.tar.bz2* をダウンロードして、適当なディレクトリに解凍し、そのディレクトリに移動します。

```
$ wget http://sourceforge.net/projects/boost/files/boost/1.57.0/boost_1_57_0.tar.bz2
$ tar -jxvf boost_1_57_0.tar.bz2 -C oss
$ cd oss/boost_1_57_0
```

次に、Boost.Regexに対するicuサポートのために必要なライブラリを取得します。

```
$ sudo apt-get update
$ sudo apt-get install build-essential g++ python-dev autotools-dev libicu-dev build-essential libbz2-dev
```

これ以降の作業は、使用するコンパイラによって異なります。

# Clang 3.5の場合
まず、Bjamを生成します。

```
$ ./bootstrap.sh --with-toolset=clang --with-libraries=all
```

今回はすべてのライブラリをビルドしたいので、`--with-libraries=all` を指定しています。次に、Boost.MPIをビルド対象にしたいので、user-config.jamを編集します。

```
$ user_configFile=`find $PWD -name user-config.jam`
$ echo "using mpi ;" >> $user_configFile
$ cp $user_configFile ~
```

そして、以下のコマンドを打ち込み、Boostを実際にBjamでビルドします。

```
$ ./b2 toolset=clang --with=all -link=static,shared runtime-link=shared threading=multi variant=release --stagedir="stage/clang" instruction-set=(microarchitecture type) -j(thread num)
```

すべてのライブラリをビルドしたいので、`--with=all` を指定しています。
*(microarchitecture type)* には、Boostを使用するコンピュータのCPUのマイクロアーキテクチャを指定します。今回は *sandy-bridge* と *haswell* でそれぞれビルドします。
`link=static,shared threading=multi runtime-link=shared` で、マルチスレッドで、スタティックリンクとダイナミックリンクのライブラリを生成することを指定しています。
`variant=release` でリリースビルドのライブラリをビルドすることを指定しています。
*--stagedir=* 以下には、ビルドしたライブラリを配置するディレクトリを指定します（Boostに関しては、ビルドしたライブラリを`/usr/local` に配置するのは避けたほうがいいらしいです。sincrinc 様の投稿記事が参考になりました。ありがとうございます： [CentOS 6.0 gcc 4.7.2にBoost 1.5.0をインストール](http://qiita.com/sincrinc/items/bcde85868bb03717cabd)）。
*(thread num)* には、並列ビルドに使用するスレッド数を指定します。論理プロセッサ数 + 1の数を指定すると、最もパフォーマンスが良くなるようです。

このオプションで実際にビルドしてみると、問題なくビルドできています（下図）。

![Qiita_boost_1_57_0_clang_LinuxMint_141118.png](https://qiita-image-store.s3.amazonaws.com/0/58457/ae7cafad-cebf-a62e-e281-210cfaceb257.png)

次に、ライブラリのパスを通します。

```
$ sudo sh -c 'echo $HOME/oss/boost_1_57_0/stage/clang/lib >> /etc/ld.so.conf.d/local.conf'
$ sudo ldconfig
```

きちんとパスが通っているか、

```
$ ldconfig -p | grep boost
```

で確認してやります。正しく通っているようです（下図）。

![Qiita_boost_1_57_0_clang_LinuxMint_141118_2.png](https://qiita-image-store.s3.amazonaws.com/0/58457/4bbb0a4b-a570-a28c-54b3-59164c6325e9.png)

最後に、インクルードファイルのパスを通します。

```
$ echo export CPLUS_INCLUDE_PATH=$HOME/oss/boost_1_57_0:\$CPLUS_INCLUDE_PATH >> ~/.bashrc
```

きちんとビルドできているか確認するために、拙作の単純なカレンダーのプログラム（Boost.Gregorian使用）をビルドできるか試してみます。

```
$ wget https://gist.githubusercontent.com/dc1394/6aa6b33ef55653dadca6/raw/7e0a6c6fabfe75189b8f52a97a099547c3e4b954/MyCalendarWithBoost.cpp
$ clang++ MyCalendarWithBoost.cpp
```

無事にコンパイルできれば、ビルドとインストールに成功しています。お疲れ様でした。ちなみに、`clang++ -std=c++11 MyCalendarWithBoost.cpp` だとコンパイルに失敗しますが、これはClangのバグらしいです（参考：[Debian Bug report logs - #744792 clang-3.4: unusable with libstdc++ from gcc 4.9](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=744792%E2%80%8B)）。

# gcc 4.9.2の場合
私の環境では、gcc 4.9.2がインストールされていませんでした。よってまず、gcc 4.9.2をインストールするため、ターミナルで以下のコマンドを打ち込みます（以下のサイトを参考にさせていただきました。ありがとうございます：[Install GCC GNU 4.9.1 on Ubuntu 14.04](http://www.sysads.co.uk/2014/07/install-gcc-gnu-4-9-1-on-ubuntu-14-04/)）。

```
$ sudo add-apt-repository ppa:ubuntu-toolchain-r/test
$ sudo apt-get update
$ sudo apt-get install gcc-4.9
$ sudo update-alternatives --remove-all gcc
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 20
$ sudo update-alternatives --config gcc
```

Clangの場合と同様に、次のコマンドを打ち込み、Bjamを生成します。

```
$ ./bootstrap.sh --with-toolset=gcc --with-libraries=all
```

次に、Bjamにコンパイラにgcc 4.9.2を使用することを伝え、またBoost.MPIをビルド対象にしたいので、user-config.jamを編集します。

```
$ user_configFile=`find $PWD -name user-config.jam`
$ echo "using gcc : 4.9 : /usr/bin/gcc-4.9 ;" >> $user_configFile
$ echo "using mpi ;" >> $user_configFile
$ cp $user_configFile ~
```

そして、以下のコマンドを打ち込み、Boostを実際にBjamでビルドします。

```
$ ./b2 toolset=gcc-4.9 cxxflags="-std=c++11" --with=all -link=static,shared runtime-link=shared threading=multi variant=release --stagedir="stage/gcc" instruction-set=(microarchitecture type) -j(thread num)
```

オプションの指定は、Clangの場合と同様ですので、説明は省略します。このオプションで実際にビルドしてみると、いくつか失敗しています（下図）。が、実用上は問題ないと思います（たぶん）。

![Qiita_boost_1_57_0_gcc-4_9_LinuxMint_141118.png](https://qiita-image-store.s3.amazonaws.com/0/58457/143166ef-e811-d4dd-cd0f-77b463184497.png)

Clangの場合と同様に、ライブラリのパスを通します。

```
$ sudo sh -c 'echo $HOME/oss/boost_1_57_0/stage/gcc/lib >> /etc/ld.so.conf.d/local.conf'
$ sudo ldconfig
```

きちんとパスが通っているか、Clangの場合と同様の手順で確認します。正しく通っているようです（下図）。

![Qiita_boost_1_57_0_gcc-4_9_LinuxMint_141118_2.png](https://qiita-image-store.s3.amazonaws.com/0/58457/73fe6bcd-60b9-14c0-4772-934e2c63f1cc.png)

最後に、インクルードファイルのパスを通します。手順は、Clangの場合と全く同じなので省略します。Clangによるビルドのときにパスを通していれば、この作業は不要（というより、同じ内容が二重に書き込まれるので、しないほうが良い）です。

きちんとビルドできているか確認するために、拙作の単純なカレンダーのプログラム（Boost.Gregorian使用）をビルドできるか試してみます。

```
$ wget https://gist.githubusercontent.com/dc1394/6aa6b33ef55653dadca6/raw/7e0a6c6fabfe75189b8f52a97a099547c3e4b954/MyCalendarWithBoost.cpp
$ g++ -std=c++11 MyCalendarWithBoost.cpp
```

無事にコンパイルできれば、ビルドとインストールに成功しています。お疲れ様でした。