Travis CI で Boost.Python+Python3 のテストを行う
やはりネット上にあまり情報がなく、険しい道のりとなってしまったのでここにメモしておく。
.travis.yml
mog-cli/.travis.yml at master · mogproject/mog-cli
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | --- language: python os: - linux - osx python: - "3.2" # - "3.3" # - "3.4" env: - CC=gcc-4.8 CXX=g++-4.8 before_install: # LINUX - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test; fi - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo apt-get -qq update; fi - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo apt-get -qq install g++-4.8; fi install: # LINUX - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo apt-get -qq install libboost-python-dev; fi - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo rm -f /usr/lib/libboost_python.so; fi - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo ln -s libboost_python-py32.so /usr/lib/libboost_python.so; fi - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo rm -f /usr/lib/libboost_python.a; fi - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo ln -s libboost_python-py32.a /usr/lib/libboost_python.a; fi # OSX - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew install boost-python --with-python3; fi - pip install coveralls script: - coverage run --source=src setup.py test after_success: - coveralls |
- Python 3.2 でのみ動作確認。3.3, 3.4 についてはまだ実現できていない。
- 環境変数 TRAVIS_OS_NAME を使ってマシンOSによって動作を分岐させる。
ここでは以下の理由から、ショートサーキット([ "$foo" = "bar" ] && something)を避けた。 - 正しいYAMLのフォーマットに従うためにクオートまたはエスケープが必要。
- リターンコードが 0 以外だと処理が止まってしまうので、最初の判定が偽だった場合にリターンコードを 0 で上書きしないといけない。
- OSX の場合の動作は未検証。
- before_install のタスクで g++-4.8 をインストール。これは std=c++11 オプションに対応するため。
環境変数 CC, CXX も併せて定義。 - install タスクで boost_python ライブラリをインストール。
Linux (Ubuntu ベース?) の場合、ライブラリはデフォルトで libboost_python-py27.so, libboost_python-27.a にリンクされているので、手動でリンクを張り直す。
setup.py
mog-cli/setup.py at master · mogproject/mog-cli
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | from setuptools import setup, find_packages, Extension import sys import platform SRC_DIR = 'src' def get_version(): sys.path[: 0 ] = [SRC_DIR] return __import__ ( 'mogcli' ).__version__ source_files = [ 'src/cmogcore/%s.cpp' % s for s in [ 'cmogcore' ]] if sys.version_info.major = = 3 and platform.dist()[ 0 ] = = 'fedora' : boost_library = 'boost_python3' else : boost_library = 'boost_python' setup( name = 'mog-cli' , version = get_version(), description = 'Command Line Interface for Playing Shogi Games' , author = 'mogproject' , author_email = 'mogproj@gmail.com' , install_requires = [ ], tests_require = [ ], package_dir = {'': SRC_DIR}, packages = find_packages(SRC_DIR), include_package_data = True , test_suite = 'tests' , entry_points = """ [console_scripts] mog-cli = mogcli.mogcli:main """ , ext_modules = [ Extension( name = 'cmogcore' , sources = source_files, include_dirs = [ '/usr/local/include/boost' ], library_dirs = [ '/usr/lib' , '/usr/local/lib' ], libraries = [boost_library], extra_compile_args = [ '-std=c++11' , '-pthread' , '-Wall' ], extra_link_args = [ '-pthread' ], ) ], ) |
- プラットフォームによって、ライブラリの名前を boost_python, boost_python3 と使い分ける点だけ注意。
References
- c++ - Hello world with boost python and python 3.2 - Stack Overflow
- Make error: cannot find -lboost_python · Issue #376 · JohnLangford/vowpal_wabbit
0 件のコメント:
コメントを投稿