web-dev-qa-db-ja.com

複数のPythonバージョンでBoostをビルドする

私は自分のコンピューターでPythonのいくつかのバージョンを使用しています:2.6.62.7.6および2.7.9。 Boost-pythonを使用してBoostをコンパイルするときは、引数で使用するPythonを指定する必要があります。互換性が必要な場合は、各Pythonバージョン?(それはかなり巨大です!)または、複数のpythonバージョンでBoostの1つのビルドのみを使用する方法はありますか?

18
Caduchon

公式Python 開発サイクル は、リリース間のアプリケーションバイナリインターフェイス(ABI)の安定性については説明していません。Python 3.2では、ABIの互換性は保証されません。3.2以降では、 PEP 384安定したABI を定義します。ここで、Python/CAPIのサブセットはABIの互換性を維持することが保証されています。 。このサブセットを使用するには、Boost.Pythonおよび拡張モジュールをビルドするときにPy_LIMITED_APIを定義する必要があります。

これは主に、ユーザーコードで直接使用されているPython/C APIのタイプと機能、またはBoost.Pythonを介して使用されている機能に依存しますが、一般的には次のようになります。

  • Python 2やPython 3などのメジャーレベルのリリースの場合、Boost.Pythonとユーザーコードを再コンパイルする必要があります
  • Python 2.6やPython 2.7などのマイナーレベルのリリースの場合、Boost.Pythonとユーザーコードを再コンパイルする必要がある場合があります
  • マイクロレベルのリリースの場合、Boost.Pythonとユーザーコードを再コンパイルする必要はほとんどありません。

Boost.Pythonを再コンパイルする必要があるすべての場合において、他のBoostライブラリを再コンパイルする必要はありません。 Boost.Pythonの複数のバージョンをビルドする場合は、 掃除 ビルドが発生します。クリーンビルドがないと、Boost.Pythonはビルドできますが、正しくリンクできません。たとえば、PyClass_TypeシンボルはPython 3 Boost.Pythonビルドで参照されるべきではありませんが、クリーンビルドがないと、以前のビルドアーティファクトがライブラリに入力される可能性があります。

$ ./bootstrap.sh --with-python=/usr/bin/python2
...
Detecting Python version... 2.7
$ ./b2 --with-python --buildid=2 # produces libboost_python-2.so
$ ./bootstrap.sh --with-python=/usr/bin/python3 --with-python-root=/usr
...
Detecting Python version... 3.3
$ ./b2 --with-python --buildid=3noclean # produces libboost_python-3noclean.so
$ ./b2 --with-python --clean
$ ./b2 --with-python --buildid=3 # produces libboost_python-3.so

$ nm -D stage/lib/libboost_python-2.so | grep PyClass_Type
                 U PyClass_Type
$ nm -D stage/lib/libboost_python-3noclean.so | grep PyClass_Type
                 U PyClass_Type
$ nm -D stage/lib/libboost_python-3.so | grep PyClass_Type

3nocleanビルドがPython 3に対してビルドされたとしても、Python 2を使用していた以前のビルドには、3nocleanライブラリを汚染するアーティファクトがあったことに注意してください。 Boost.Pythonとユーザーコードは、PythonのCPUアーキテクチャとUCS-2またはUCS-4ユニコード構成に一致するように再コンパイルする必要がある場合があることに注意してください。

37
Tanner Sansbury

Boost 1.67以降、boostをビルドして、プロセスの一部としてクリーンアップまたは再構築することなく、指定したPythonのバージョンごとに個別のバージョンのlibboost_pythonを生成することができます。

たとえば、tools/build/src/user-config.jamを編集して、システム上のPythonのバージョンを含めます。

using python : 2.7 : /opt/python/cp27-cp27mu/bin/python : /opt/python/cp27-cp27mu/include/python2.7 : /opt/python/cp27-cp27mu/lib ;
using python : 3.5 : /opt/python/cp35-cp35m/bin/python : /opt/python/cp35-cp35m/include/python3.5m : /opt/python/cp35-cp35m/lib ;
using python : 3.6 : /opt/python/cp36-cp36m/bin/python : /opt/python/cp36-cp36m/include/python3.6m : /opt/python/cp36-cp36m/lib ;
using python : 3.7 : /opt/python/cp37-cp37m/bin/python : /opt/python/cp37-cp37m/include/python3.7m : /opt/python/cp37-cp37m/lib ;

次に、ビルドステップで./b2 python=2.7,3.5,3.6,3.7を実行します。

一部のダウンストリームパッケージでは、ブーストpythonライブラリがlibboost_python.so for Python 2.xおよびlibboost_python3.so for Python3.x。これらのプログラムを正しくリンクするには、-lboost_python27-lboost_python35などを明示的に指定する必要がある場合があります。

7
garlon4