Boost 1.59.0をIntel C++ Compiler 2016 (ICC / ICL16) on Visual Studio 2015 (VC14)でビルドする

ICC / ICL16 (on VC14)でのBoost 1.59.0のビルドにかなり手間取ったので、自分用の備忘録です。

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

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

してやって、Bjamを生成します。しかし、ICL16でビルドするためには、*boost_1_59_0/tools/build/src/tools/intel-win.jam*を編集してやる必要があります（そのままでは正しくビルドできません）。
テキストエディタで当該ファイルを開き、471行目の、

```
.intel-autodetect-versions = 14.0 13.0 12.0 ;
```

を、

```
.intel-autodetect-versions = 16.0 14.0 13.0 12.0 ;
```
に編集します。さらに、476行目 `.iclvars-15.0-supported-vcs = "12.0 11.0 10.0 9.0" ;` の下に、以下の二行を挿入します。

```
.iclvars-16.0-supported-vcs = "14.0 12.0 11.0 10.0 9.0" ;
.iclvars-version-alias-vc14 = vs2015 ;
```

変更を保存して、テキストエディタを終了します。ここからの作業は、環境によって異なります。

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

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

```
C:\mylib64\boost_1_59_0>b2 --toolset=intel-16.0 --sINTEL_BASE_MSVC_TOOLSET=msvc-14.0 --stagedir="stage\ia32\icl16" --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=intel-16.0* で、ICC / ICL16を用いてビルドすることを指定しています。 
*--sINTEL_BASE_MSVC_TOOLSET=msvc-14.0* で、コマンドプロンプトがVisual Studio 2015 (VC14) modeであることを明示的に指定しています。*--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_59_0_icc_x86_151012.png](https://qiita-image-store.s3.amazonaws.com/0/58457/5af25989-3303-7546-3180-30f1ee28aee2.png)

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

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

```
C:\mylib64\boost_1_59_0>b2 --toolset=intel-16.0 --sINTEL_BASE_MSVC_TOOLSET=msvc-14.0 --stagedir="stage\x86_64\icl16" --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 (IA-32)の場合と同様に、いくつか失敗しています（下図）。

![Qiita_boost_1_59_0_icc_x86-64_151012.png](https://qiita-image-store.s3.amazonaws.com/0/58457/8c31a52c-321c-d909-0a98-9e41ee5ed098.png)

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