RDKitをWindows環境でビルドする

# 背景
RDKitのインストール事例については、ほとんどAnacondaからの例しかない。この方法だと最終的にAnacondaのPythonからしか使えない。場合によっては、アプリケーションに組み込んで、C++やAnaconda以外のPython環境で使いたいこともある。そのためには、Anaconda以外のインストール方法つまり自力でのビルドが必要である。しかしながら、例えばWindowsで利用したいと思った場合、本家のサイトにビルドする手順が書かれているが、情報が古いため、2019年現在ではそのままではうまくビルドできないのである。

今回以下の環境においてビルドに成功したため、メモっておく。


# 環境
- Windows 10
- VisualStudio 2017
- CMake 3.12.0
- boost 1.65.1
- python3.6.8
- RDKit 2018_09_2


# 手順
## 1. Visual Studio 2017のインストール
これについては、多くの情報があると思われるため、手順は省略する。
どうインストールしたか忘れてしまった。当然ながら、C++は必要である。

## 2. CMakeのインストール
CMake 3.12.0-rc12をインストールしておく。
これも情報が沢山ころがっているだろうから省略する。

## 3. Boostのインストール
Boostとは、C++の便利な機能を集めたライブラリである。
ライセンスはBoostライセンスである。
https://dl.bintray.com/boostorg/release/1.65.1/source/
より、1_65_1をダウンロードする。
　
最新バージョンでないところがミソである。
boostのバージョンとRDKitのバージョンの組み合わせが異なるとうまくビルドできないことが多い。
　　
ダウンロード後、展開し「C:\boost_1_65_1」にコピーする。
容量は350MBとかなり大きいので展開するだけでも結構時間がかかる。
　　
ちなみにコピー直後のboostのディレクトリの中は以下のとおりである。
ビルドするとフォルダが勝手にできるため、失敗した後、再度やり直しをする際にどれを削除すればよいか覚えておくため、残しておく。
　
![image.png](https://qiita-image-store.s3.amazonaws.com/0/329816/acbab4e5-f165-a973-4195-b56d9edd0241.png)

##  4. Pytnon3.6のインストール
https://www.python.org/downloads/release/python-368/
よりPython3.6.8のWindows x86-64 executable installerをダウンロードし、
インストーラより、「C:\Python36」にインストールする。

インストール後、コマンドラインより以下のとおりnumpyもインストールする。

```
cd c:\Pytyon36
.\Scripts\pip.exe install numpy
```


## 5. RDKitのダウンロードと配備
https://github.com/rdkit/rdkit/releases/tag/Release_2018_09_2
から 2010_09_2をダウンロードする。
　
ダウンロード後、展開し、「C:\rdkit-Release_2018_09_2」にコピーする。

## 6. 環境変数の設定
以下の通り、環境変数を設定する。
C:\Python36
C:\rdkit-Release_2018_09_2\lib

## 7. Boostのビルド
メニューより「Visual Studio 2017」->「開発者コマンドプロンプト for VS 2017」を選択し、開いたプロンプト上で以下を順に実行する。
　

```
cd c:\boost_1_65_1
bootstrap.bat
b2  architecture=x86 address-model=64  threading=multi runtime-link=shared --build-type=minimal link=static --stagedir=stage/x86_x64 stage 
b2  architecture=x86 address-model=64  threading=multi runtime-link=shared --build-type=minimal link=shared --stagedir=stage/x86_x64 stage - install
```

　
実行後、C:\Boost\libに以下が生成されたかを確認する。
- libboost_python3-vc141-mt-1_65_1.lib
- libboost_numpy3-vc141-mt-1_65_1.lib
- libboost_random-vc141-mt-1_65_1.lib
- libboost_serialization-vc141-mt-1_65_1

これらは、Python3に関するライブラリであり、これが生成されていれば
boostとpython3がうまく連携できている証拠だ。
ぶっちゃけ、これらが生成されるかどうかが成否の最大の鍵を握るといってよい。
バージョンの組み合わせが悪いと、これが生成されないのだ。

## 8. CMakeでRDKit用ソリューション生成
コマンドプロンプトより以下を実行する。

```
cd C:\rdkit-Release_2018_09_2
mkdir build
cd build
cmake -DRDK_BUILD_PYTHON_WRAPPERS=ON -DBOOST_ROOT=C:\Boost\ -DRDK_BUILD_INCHI_SUPPORT=ON -DRDK_BUILD_AVALON_SUPPORT=ON  -G"Visual Studio 15 2017 Win64" ..
```

## 9. いよいよRDKitのビルド
C:\rdkit-Release_2018_09_2\buildのRDKit.slnをVisualStudio2017で起動し
VisualStudio上でソリューションをビルド。

ドキドキの瞬間である。うまくいったかと思いきや、MMPA.cppの100行目付近でエラーがでた。以下のDEBUG用のコードの箇所である。

```
#ifdef _DEBUG
    {
      std::string symbol =
          em.getAtomWithIdx(bonds_selected[bi].first)->getSymbol();
      int label = 0;
      em.getAtomWithIdx(bonds_selected[bi].first)
          ->getPropIfPresent(common_properties::molAtomMapNumber, label);
      char a1[32];
      if (0 == label)
        sprintf(a1, "\'%s\'", symbol.c_str(), label);
      else
        sprintf(a1, "\'%s:%u\'", symbol.c_str(), label);
      symbol = em.getAtomWithIdx(bonds_selected[bi].second)->getSymbol();
      label = 0;
      em.getAtomWithIdx(bonds_selected[bi].second)
          ->getPropIfPresent(common_properties::molAtomMapNumber, label);
      char a2[32];
      if (0 == label)
        sprintf(a2, "\'%s\'", symbol.c_str(), label);
      else
        sprintf(a2, "\'%s:%u\'", symbol.c_str(), label);

      std::cout << "(" << bonds_selected[bi].first << a1 << ","
                << bonds_selected[bi].second << a2 << ") ";
    }
#endif
```

したがって、ターゲットを「Release」にして再度ビルドを実施。
見事、ビルド成功！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/329816/234cd0d0-ffde-e4a7-65c4-9814838f4f0a.png)

## 10. ビルド後の調整
C:\rdkit-Release_2018_09_2\build\の下の各Releaseフォルダにpydファイルが生成されるので、
それを逐一C:\rdkit-Release_2018_09_2\rdkitの下にコピーしていく。（他に良いやり方があるかも）

どれをどうコピーすればよいかは、AnacondaによりインストールされたRDKitのフォルダ
<仮想環境のパス>\Lib\site-packages\rdkit
等を参考にした。（書くのが面倒なため省略）。

## 11. 環境変数の設定再び
以下を設定
- RDBASEにC:\rdkit-Release_2018_09_2を設定
- PYTHONPATHにC:\rdkit-Release_2018_09_2を追加
- PathにC:\Boost\libを追加

## 12. 確認
C:\Python36にインストールしたPythonより確認を行う。

```
c:\Python36>python
Python 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from rdkit import rdBase, Chem
>>> from rdkit.Chem import AllChem, Draw
>>> print('rdkit version: {}'.format(rdBase.rdkitVersion))
rdkit version: 2018.09.2
>>> Chem.MolToSmiles(Chem.MolFromSmiles('C1=CC=CN=C1'))
'c1ccncc1'
```

動いてるっぽい。これでガンガン化合物システムを開発できるぞ！

# 参考
- http://www.rdkit.org/docs/Install.html
-  https://codeyarns.com/2013/11/14/how-to-build-rdkit-on-windows/
-  Install RDKit on Windows
   (http://ms-cheminfo.com/?q=node/24)
- http://blog.livedoor.jp/ag_plusplus/archives/68661201.html
- RDKitをc++で動かす ～git cloneからHello methaneまで～
  (https://qiita.com/yanagi3150/items/0866abfd629cce7fec12)
- PythonからC++を呼び出してnumpyを使う
  (http://tadaoyamaoka.hatenablog.com/entry/2017/05/25/234934)

# メモ
本手順は、2018_03_2版でも成功を確認済。