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 件のコメント:
コメントを投稿