Windows 7 (64bit)上でE-Cell4のPython拡張をビルドする

**以下の情報は時代遅れです。最新の情報は[こちら](https://github.com/ecell/ecell4#installation)を参照してください。**

# 準備

E-Cell4はwin32ブランチをチェックアウトして用いる. 必要なら各自Gitをインストールして使う: https://github.com/ecell/ecell4

以下がビルドに利用したもの:

- Microsoft Visual C++ Compiler for Python 2.7: http://www.microsoft.com/en-us/download/details.aspx?id=44266
- Python 2.7.10 (64bitではダメぽ): https://www.python.org/ftp/python/2.7.10/python-2.7.10.msi
- virtualenv 1.11.6のtar.gzファイル: https://pypi.python.org/packages/source/v/virtualenv/virtualenv-1.11.6.tar.gz#md5=f61cdd983d2c4e6aeabb70b1060d6f49
- GSL 1.13 for Windows: http://r2d3.geldreich.net/downloads/gsl-1.13-windows-binaries.zip
- Boost 1.59.0 Source Code: http://sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.zip/download
- HDF5-1.8.15 Pre-built Binary (32-bit): http://www.hdfgroup.org/ftp/HDF5/current/bin/windows/extra/hdf5-1.8.15-patch1-win32-vs2012-shared.zip
- \<stdint.h\> for Visual Studio: http://www.vector.co.jp/soft/win95/prog/se432866.html

## Python3を用いる場合

 - Visual C++ 2010 Express: http://go.microsoft.com/fwlink/?LinkId=190491&clcid=0x411
 - Python 3.4.3(x86): https://www.python.org/ftp/python/3.4.3/python-3.4.3.msi
 - GSL(msvc2010用) : http://www.icub.org/download/packages/windows/msvc10/gsl-1.14-bin-msvc10.zip
 - Boost 1.58.0 Source Code: http://sourceforge.net/projects/boost/files/boost/1.58.0/boost_1_58_0.zip/download
 - HDF5-1.8.16 Pre-built Binary (32-bit): http://www.hdfgroup.org/ftp/HDF5/current/bin/windows/extra/hdf5-1.8.16-win32-vs2012-shared.zip

# ビルドの方法

1. PythonとVisual C++を普通にインストール.

2. GSL, stdint, Boostは適当な場所に解凍しておく.

3. hdf5-1.8.14-win32-vs2012-shared.zipは展開して, HDF5-1.8.14-win32.exeを実行してインストール. インストールする場所やパスを通すか否かは任意.

4. C:\\path\\to\\ecell4\\ecell4\\core\\config.h.win32をC:\\path\\to\\ecell4\\ecell4\\core\\config.hという名前で保存する. もしくは以下の内容でC:\\path\\to\\ecell4\\ecell4\\core以下にconfig.hを作成:

    ```cpp
#ifndef __ECELL4_CONFIG_H
#define __ECELL4_CONFIG_H
#define HAVE_BOOST_UNORDERED_MAP_HPP 1
#define HAVE_BOOST_FUNCTIONAL_HASH_HPP 1
#endif /* __ECELL4_CONFIG_H */
```

5. C:\\path\\to\\ecell4\\ecell4\\egfrd\\config.h.win32をC:\\path\\to\\ecell4\\ecell4\\egfrd\\config.hという名前で保存する. 

6. virtualenv-1.11.6.tar.gzを展開し, Pythonが実行できる状態で:

    ```
C:\path\to\virtualenv-1.11.6> python virtualenv.py C:\path\to\myenv
```

    C:\\path\\to\\myenvはどこでも良いが, パスに空白が含まれている(ユーザー名など)とうまくいかないので注意.

7. C:\\path\\to\\myenvに移動し, 以下のようにして, CythonとNumeric Pythonをインストールする:

    ```
C:\path\to\myenv> Scripts\activate.bat
(myenv) C:\path\to\myenv> pip install cython
(myenv) C:\path\to\myenv> pip install numpy
```

8. virtualenv環境下で:

    scipyを利用するmake_sjy_table.py, make_cjy_table.pyを呼ぶ代わりに別で作成したSphericalBesselTable.hppとCylindricalBesselTable.hppを入手してC:\path\to\ecell4\ecell4\egfrdディレクトリ下に置いても良い.

    ```
(myenv) C:\path\to\myenv> cd C:\path\to\ecell4\python
(myenv) C:\path\to\ecell4\python> python setup.py build_ext -IC:\path\to\boost_1_55_0;C:\path\to\gsl\include;C:\path\to\HDF5_Group\HDF\1.8.14\include;C:\path\to\stdint-20070624 -LC:\path\to\gsl\lib;C:\path\to\HDF5_Group\HDF\1.8.14\lib install
(myenv) C:\path\to\ecell4\python> python samples\simple.py
```

# Wheelパッケージ

1. パッケージの作成は上に続けて:

    ```
(myenv) C:\path\to\ecell4\python> pip install wheel
(myenv) C:\path\to\ecell4\python> python setup.py bdist_wheel
```

    これでC:\\path\\to\\ecell4\\python\\dist以下にWHLができているはず.

2. 以下をダウンロードして展開

    https://www.dropbox.com/s/79jrmw1vtv61e6t/ecell4-0.0.0-cp27-none-win32-whl.zip

3. 展開してできたecell4-0.0.0-cp27-none-win32-whlディレクトリ以下で:

    ```
(myenv) C:\path\to\ecell4-0.0.0-cp27-none-win32-whl> pip install ecell4-0.0.0-cp27-none-win32.whl
```

4. 実行時にdllが必要となるため, 前述の通りHDF5のバイナリをインストールし, 必要であればパスを通しておく.

    ````
(myenv) C:\path\to\ecell4-0.0.0-cp27-none-win32-whl> set PATH=%PATH%;C:\path\to\HDF5_Group\HDF\1.8.13\bin

5. 以下で実行できるか試す. うまくいけばtest.h5が作成されるはず:

    ```
(myenv) C:\path\to\ecell4-0.0.0-cp27-none-win32-whl> python simple.py
```

6. IPython Notebookを導入し, 起動する:

    ```
(myenv) C:\path\to\myenv> pip install ipython[notebook]
(myenv) C:\path\to\myenv> ipython notebook
```

# 気になっている点

1. HDF5のビルド時にパッケージを作る必要があるのか? ALL_BUILDをビルドするだけでもdllは出来ているがそれではうまく動かなかった. パッケージを作るためにNSISをインストールする必要があり, 無駄に見える. まあ再配布はしやすいので良いが.

2. hdf5_hl, hdf5_hl_cppは必要なのか? -> 必要ない.

3. ビルド時に大量に出るWarning. 主に暗黙の型キャストに関するものだと思われ. いつか潰したい.

4. <stdint.h>について. 別にインストールするのメンドイ. なんとかならんのか, これは.

5. config.hがいまいち. Boostのunordered_mapは実装があまり良くないので, Visual C++用の代替を考えたい. -> 多分, std::tr1が使える.

6. IPythonはpipで使えるようになる. IPython Notebookもpyzmq, jinja2, tornadeをpipからインストールするとできるが, これらにはビルドが必要なものがあるかも. Wheelでできると良いが確認していない. AnacondaのIPythonはMinGW32なので多分使えないと思われる.

# HDF5の自前ビルドについて

必要なもの:

- CMake 3.0.0: http://www.cmake.org/files/v3.0/cmake-3.0.0-win32-x86.exe
- NSIS 2.46: http://prdownloads.sourceforge.net/nsis/nsis-2.46-setup.exe?download
- HDF5 1.8.13 Source Code: http://www.hdfgroup.org/HDF5/release/obtainsrc.html

1.  HDF5をVisual C++ 2008で自前でビルドする. まずファイルを解凍し, 続いてビルド用の別のディレクトリを新規に作成しておく(hdf5-1.8.13-BUILD).

2.  スタートメニューなどからCMake 3.0.0>CMake (cmake-gui)を起動する. "Where is the source code:"にC:\\path\\to\\hdf5-1.8.13を, "Where to build the binaries"にC:\\path\\to\\hdf5-1.8.13-BUILDを指定. 下のConfigureボタンを押す. ダイアログが開いて, "Specify the generator for this project"と問われるので, "Visual Studio 9 2008"で"Use default native compilers"を選択して"Finish".

3.  自動的にEntryが表示されるがこの中から, BUILD_SHARED_LIBS, HDF5_BUILD_CPP_LIB, HDF5_PACKAGE_EXTLIBSをTrueにする. それ以外はそのままで良い. その後, Generateボタンを押す.

4.  C:\\path\\to\\hdf5-1.8.13-BUILDへ移動し, HDF5.slnをVisual C++ 2008で開く. ダイアログで色々警告されるがとりあえず無視. 上ツールバー中央のソリューション構成が"Debug"になっていたら"Release"に変更する.

5.  左のエクスプローラからALL_BUILDを右クリックし, ビルド. その後で, PACKAGEを右クリックし, ビルドする. C:\\path\\to\\hdf5-1.8.13-BUILD以下に_CPack_Packages\\win\\NSIS\\HDF5-1.8.13-winが出来ていてbin以下にhdf5.dllが出来ていればOK(hdf5_D.dllなどとなっていたら前述のソリューション構成を確認すること).

# パッチについて

以下, 古い情報. 現在はwin32ブランチとmasterの差分を見ること.

https://github.com/ecell/ecell4/compare/win32

(旧)パッチについて.

https://gist.github.com/kaizu/00e480fb3285b1296485

1. なぜか, gsl_pow_2, gsl_pow_3がリンク時に落ちる. gsl_pow_intだと使える. 意味ないか.

2. typeofが使えない問題. GetType, typeidを使えとあるが良く分からず. gslに変更が無ければ別に問題ないのでとりあえず型をハードコードしておいた.

3. erf, erfcがmath.hにない問題. boost/math/special_functions/erf.hppを代わりに利用. gslに統一すべきか?

4. cbrtがmath.hにない問題. powで代わりに実装. せめてinlineに.

5. rintがmath.hにない問題. 自前で実装しても良さそうだが, boost/numeric/interval/detail/msvc_rounding_control.hppがその辺をうまく切り替えてくれているようなのでそちらを参照させた.

6. M_PIがmath.hをインクルードしても使えない問題. _USE_MATH_DEFINESを宣言する必要がある. types.hppからmath.hをインクルードするようにしている.

7. gslcblasのライブラリ名が異なる. gslcblas->cblas.

8. `__PRETTY_FUNCTION__`使えない問題. ただのエラーメッセージなので`__FUNCTION__`を使えば良い.

9. 不要なtypenameを消した. これは普通にコミットして良い気がする. 後で確認.

10. vsnprintfがstdじゃない問題.

11. sqrt(3)が通らない問題. sqrt(3.0)にすれば良い. マージする.

12. Windowsにはregex.hがない問題. Boostのregexはバイナリが必要になるのでさけてUnix標準のregex.hを使うようにしたが, そもそもWindowsはUnixじゃないのでregex.hがない. 一方でVisual C++には標準でregexが実装されており, APIはBoostのregexと全く同じである模様(というかstd::tr1)だったので単にnamespace等を解決したらとりあえず通った. 結果のテストが必要.

13. python/setup.pyでdll名が若干異なるのを修正. コンパイラオプション"/w"で警告の非表示と, "/EHsc"で例外処理モデルの設定. 前者は非必須.

# 参考リンク

http://homepage2.nifty.com/nonnon/Chinamini/20110001/20110307.html

http://david.geldreich.free.fr/dev.html

http://www.kijineko.co.jp/node/63

http://msdn.microsoft.com/ja-jp/library/1deeycx5%28v=vs.90%29.aspx

http://www.hdfgroup.org/ftp/HDF5/current/src/unpacked/COPYING

http://qiita.com/toruuetani/items/b0000e9f5c89a350d4f8