Travis CI で Boost.Python+Python3 のテストを行う
やはりネット上にあまり情報がなく、険しい道のりとなってしまったのでここにメモしておく。
.travis.yml
mog-cli/.travis.yml at master · mogproject/mog-cli
--- 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
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', url='https://github.com/mogproject/mog-cli', 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 件のコメント:
コメントを投稿