1.26.2015

C++/Python: Running Travis CI with Boost.Python and Python 3.2/3.3/3.4

C++/Python: Python3.2, 3.3, 3.4 の全てで Boost.Python プロジェクトの Travis CI を回す

 

前回(mog project: C++/Python: Travis CI with Boost.Python and Python3)の続き。

Boost をソースからインストールすることで、Python 3.2, 3.3, 3.4 に対応した
Boost.Python のテストを Travis CI 上で回すことができるようになった。

 

.travis.yml

mog-cli/.travis.yml at master · mogproject/mog-cli

---
language: python

os:
  - linux
  - osx

python:
  - "3.2"
  - "3.3"
  - "3.4"

env:
  global:
    - BOOST_VERSION=1.57.0
  matrix:
    - 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 ${CXX}; fi

install:
  # LINUX
  - if [ "$TRAVIS_OS_NAME" = "linux" ]; then scripts/install_boost_python.sh; fi
  - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo ln -s /tmp/boost_${BOOST_VERSION//[.]/_}/boost /usr/local/include/boost; fi
  - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo ln -s /tmp/boost_${BOOST_VERSION//[.]/_}/stage-python${TRAVIS_PYTHON_VERSION}/lib/* /usr/local/lib/; fi
  - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo ldconfig; fi

  # OSX
  - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew install boost-python --with-python3; fi

  - pip install coveralls

script:
  - python3 setup.py build
  - coverage run --source=src setup.py test

after_success:
  - coveralls
  • before_install タスクで g++-4.8 をインストールするのは前回と同じ
  • Linux(Ubuntu)向けのBoostインストール処理は別のシェルスクリプトに切り出した
    • Travis CI の制限により、シェルの実行に sudo を付けることはできない
    • /tmp 配下でビルドを実行し、/usr/local へのリンクは sudo を付けて実行
    • 環境変数 TRAVIS_PYTHON_VERSION で Python のバージョンを取得可能
  • ライブラリをリンクしたら、root 権限での ldconfig 実行が必須
    • これを行わないと boost_python3 ライブラリが not found 状態となり、
      Python 実行時にロードエラーが発生する

ldconfig 実行前に ldd を実行した例。

# ldd ./cmogcore.cpytho-32mu.so
        linux-vdso.so.1 =>  (0x00007fff3b1fd000)
        libboost_python3.so.1.57.0 => not found
        libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ff4ca726000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff4ca50e000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ff4ca2f1000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff4c9f32000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff4c9c35000)
        /lib64/ld-linux-x86-64.so.2 (0x00007ff4cac5f000)

 

Boost インストール スクリプト

mog-cli/install_boost_python.sh at master · mogproject/mog-cli

  • sourceforge から対象バージョンの Boost のソースをダウンロードし、/tmp 配下に展開
  • user-config.jam ファイルの作成
    • g++-4.8 をここで指定する
  • bootstrap.sh を実行し、Boost.Python のみをビルド対象とする
    • ここで Python のバージョンを --with-python に指定するのが重要
  • b2 スクリプトを実行
    • 時間短縮のため、threading=single  link=shared のみに限定している
      (フルセットは threading=single,multi  link=shared,static) 
    • 余計なメッセージを抑制するため、-Wno-unused-local-typedefs オプションを追加
    • HomeBrew の boost-python Formula を参考にした
  • /tmp/boost_1_57_0/boost 配下にヘッダーファイルが存在し、
    /tmp/boost_1_57_0/stage-python3.x/lib 配下に共有ライブラリが生成される

 

Related Posts

References

0 件のコメント:

コメントを投稿