Boost 1.57.0をVS 2013 (VC12)と、Intel C++ Compiler 2015 (ICC / ICL15)でビルドする

Boost C++ Librariesは、事実上のC++（準）標準ライブラリですが、その最新バージョンであるBoost 1.57.0が公開されました。と言うわけで、今回も延々とビルドを行います。環境は、Windows 8.1 x64 です。

**2014年11月10日　大幅に修正しました。**

当然ですが、コマンドプロンプトでの作業になります。

とりあえず、[Boost C++ Libraries](http://www.boost.org/) のサイトから、  *boost_1_57_0.7z* か *boost_1_57_0.zip* をダウンロードしてきます（別に *boost_1_57_0.tar.bz2* や *boost_1_57_0.tar.gz* でも構いませんが、まあWindowsということで）。そして、適当なディレクトリにBoostのアーカイブファイルを解凍してやります（私は `C:\mylib64` に解凍しました）。次に、*コマンド プロンプト* を開き、Boostが解凍されたディレクトリで、

```
C:\mylib64\boost_1_57_0>bootstrap.bat
```

してやって、Bjamを生成します。ここからの作業は、使用するコンパイラと環境によって異なります。
 
# Visual Studio 2013 (VC12) の場合

## x86 (IA-32)のライブラリをビルドしたい場合

スタートメニューから *Visual Studio 2013* - *Visual Studio ツール* とたどり、*VS2013 x86 Native Tools コマンド プロンプト* を起動して、BjamでBoostをビルドします。コンパイルオプションは、長いですが以下としています。

```
C:\mylib64\boost_1_57_0>b2 --toolset=msvc-12.0 --stagedir="stage\ia32\vc12" --without-python --without-mpi --build-type=complete variant=debug,release address-model=32 instruction-set=(microarchitecture type) -j(thread num)
```

今回は、Boost.PythonとBoost.MPIはビルドしないので、ビルド対象から除いてあります。
*--toolset=msvc-12.0* で、VC12を使用してビルドすることを指定しています。
*--stagedir=* の後には、ビルド済みのライブラリを配置するディレクトリを指定します。
*--build-type=complete variant=debug,release* で、スタティックリンクとダイナミックリンク両方のバイナリを、debugとreleaseでそれぞれビルドするよう指定しています（つまり、4通りのバイナリが生成されます）。
*address-model=32* で、32ビット（x86 (IA-32)）用のライブラリを生成するよう明示的に指定しています。
*(microarchitecture type)* には、Boostを使用するコンピュータのCPUのマイクロアーキテクチャを指定します。今回は *sandy-bridge* と *haswell* でそれぞれビルドします。
*(thread num)* には、並列ビルドに使用するスレッド数を指定します。論理プロセッサ数 + 1の数を指定すると、最もパフォーマンスが良くなるようです。

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

![Qiita_boost_1_57_0_msvc12_x86_141110.jpg](https://qiita-image-store.s3.amazonaws.com/0/58457/082b7663-3e0f-6de6-1791-dd002c8c562c.jpeg)

## x86-64のライブラリをビルドしたい場合

スタートメニューから *Visual Studio 2013* - *Visual Studio ツール* とたどり、*VS2013 x64 Native Tools コマンド プロンプト* （ *VS2013 x64 Cross Tools コマンド プロンプト* でも構いません。x86環境で、x86-64環境用のライブラリをビルドしたい場合は必ず、 *VS2013 x64 Cross Tools コマンド プロンプト* を使って下さい）を起動し、以下のコンパイルオプションを使用してビルドします。

```
C:\mylib64\boost_1_57_0>b2 --toolset=msvc-12.0 --stagedir="stage\x86_64\vc12" --without-python --without-mpi --build-type=complete variant=debug,release address-model=64 instruction-set=(microarchitecture type) -j(thread num)
```
*address-model=64* で、64ビット（x86_64）用のライブラリを生成するように明示的に指定しています。また、x86とx86_64（及びVCとICC / ICL）でライブラリのディレクトリを分けたいので、x86の場合とは別の *stagedir* を指定しています。

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

![Qiita_boost_1_57_0_msvc12_x86_64_141110.jpg](https://qiita-image-store.s3.amazonaws.com/0/58457/12c9214f-eec8-8a7e-2c17-7190a7f4b5ff.jpeg)

# Intel C++ Compiler 2015 (ICC / ICL15)の場合

## x86 (IA-32)のライブラリをビルドしたい場合

スタートメニューから *Intel Parallel Studio XE 2015* - *Compiler and Performance Libraries* - *Command Prompt with Intel Compiler XE v15.0* とたどり、*IA-32 Visual Studio 2013 mode* でコマンドプロンプトを起動し、以下のコンパイルオプションを使用してビルドします。

```
C:\mylib64\boost_1_57_0>b2 --toolset=intel-15.0 --sINTEL_BASE_MSVC_TOOLSET=msvc-12.0 --stagedir="stage\ia32\icl15" --without-python --without-mpi --build-type=complete variant=debug,release address-model=32 instruction-set=(microarchitecture type) -j(thread num)
```

*--toolset=intel-15.0* で、ICC / ICL15を用いてビルドすることを指定しています。 
*--sINTEL_BASE_MSVC_TOOLSET=msvc-12.0* で、コマンドプロンプトがVisual Studio 2013  (VC12) modeであることを明示的に指定しています。
*stagedir* にも注意してください。

このオプションで実際にビルドしてみるといくつか失敗しています（下図）。ただし、実用上は問題がないように思います。オプションでなく、コンパイラの問題のような気がします。

![Qiita_boost_1_57_0_icl15_x86_141110.jpg](https://qiita-image-store.s3.amazonaws.com/0/58457/b5c5ab42-29ed-654f-ea43-9656c6b7d841.jpeg)

## x86-64のライブラリをビルドしたい場合
 
スタートメニューから *Intel Parallel Studio XE 2015* - *Compiler and Performance Libraries* - *Command Prompt with Intel Compiler XE v15.0* とたどり、*Intel 64 Visual Studio 2013 mode* でコマンドプロンプトを起動し、以下のコンパイルオプションを使用してビルドします。

```
C:\mylib64\boost_1_57_0>b2 --toolset=intel-15.0 --sINTEL_BASE_MSVC_TOOLSET=msvc-12.0 --stagedir="stage\x86_64\icl15" --without-python --without-mpi --build-type=complete variant=debug,release address-model=64 instruction-set=(microarchitecture type) -j(thread num)
```
*address-model=64* を指定していることと、 *stagedir* の指定以外はx86 (IA-32)の場合と同じです。このオプションで実際にビルドしてみると、x86の場合と同様にいくつか失敗しています（下図）。

![Qiita_boost_1_57_0_icl15_x86_64_141110.jpg](https://qiita-image-store.s3.amazonaws.com/0/58457/937ef9c9-2f3c-b7d5-df2b-6cd6cec8a681.jpeg)

以上でビルドは完了です。お疲れ様でした。