Skip to content

Instantly share code, notes, and snippets.

@kozo2
Forked from kaizu/ecell4-win32-howto.rst
Last active August 29, 2015 14:04
Show Gist options
  • Save kozo2/6db3afb7e12a57895e83 to your computer and use it in GitHub Desktop.
Save kozo2/6db3afb7e12a57895e83 to your computer and use it in GitHub Desktop.

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

準備

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

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

ビルドの方法

  1. Python, CMake, NSIS, Visual C++を普通にインストール.
  2. GSL, stdint, Boostは適当な場所に解凍しておく.
  3. 現状, HDF5は自前でビルドしなければならない. まずファイルを解凍し, 続いてビルド用の別のディレクトリを新規に作成しておく(hdf5-1.8.13-BUILD).

スタートメニューなどから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".

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

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

左のエクスプローラから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などとなっていたら前述のソリューション構成を確認すること).

  1. 以下の内容でC:\path\to\ecell4\ecell4\core以下にconfig.hを作成:

    #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 */
    
  2. 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はどこでも良いが, パスに空白が含まれている(ユーザー名など)とうまくいかないので注意.

  1. 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
    
  2. virtualenv環境下で:

    (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-1.8.15-BUILD\_CPack_Packages\win\NSIS\HDF5-1.8.13-win\include;C:\path\to\stdint-20070624 -LC:\path\to\gsl\lib;C:\path\to\hdf5-1.8.15-BUILD\_CPack_Packages\win\NSIS\HDF5-1.8.13-win\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> pip setup.py bdist_wheel
    

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

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

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

  1. 展開してできた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
    
  2. 実行時にdllが必要となるため, 同じディレクトリ下で実行するか, 以下のようにしてパスを通しておく:

    (myenv) C:\path\to\ecell4-0.0.0-cp27-none-win32-whl> set PATH=%PATH%;C:\path\to\ecell4-0.0.0-cp27-none-win32-whl
    
  3. 以下で実行できるか試す. うまくいけばtest.h5が作成されるはず:

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

気になっている点

  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なので多分使えないと思われる.

パッチについて

以下, 古い情報. 現在は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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment