1.25.2015

C++/Python: Travis CI with Boost.Python and Python3

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

Related Posts

0 件のコメント:

コメントを投稿