Build Boost z wieloma wersjami Pythona

Używam kilku wersji Pythona na moim komputerze : 2.6.6, 2.7.6 i 2.7.9. Kiedy kompiluję Boost z boost-python, muszę dać Pythona do użycia w argumencie. Jeśli chcę kompatybilności, Czy muszę kompilować Boost dla każdej wersji Pythona ? (jest dość ogromny !) A może jest sposób na użycie tylko jednej kompilacji Boost z kilkoma wersjami Pythona ?

Author: Caduchon, 2015-03-03

1 answers

Oficjalny cykl programowania Pythona nie opisuje stabilności binarnego interfejsu aplikacji (ABI) pomiędzy wydaniami. W przypadku wydań poprzedzających wydanie Pythona 3.2 nie ma gwarancji zgodności z ABI. Dla wersji 3.2 i nowszych, PEP 384 definiuje stabilny ABI, gdzie podzbiór API Pythona/C gwarantuje zachowanie kompatybilności ABI. Aby użyć tego podzbioru, należy zdefiniować Py_LIMITED_API podczas budowania Boost.Python i moduły rozszerzeń.

Podczas gdy przede wszystkim zależy od typów API Python / C i funkcjonalności używanych bezpośrednio w kodzie użytkownika lub poprzez Boost.Python, ogólnie:

  • dla wydaÅ„ głównych, takich jak Python 2 i Python 3, Boost.Python i Kod użytkownika muszÄ… być rekompilowane
  • dla wydaÅ„ podrzÄ™dnych, takich jak Python 2.6 i Python 2.7, Boost.Python i Kod użytkownika mogÄ… wymagać rekompilacji
  • dla wydaÅ„ na poziomie mikro, Boost.Python i Kod użytkownika rzadko potrzebujÄ… recompiled

We wszystkich przypadkach, gdzie Boost.Python wymaga rekompilacji, żadna inna biblioteka Boost nie powinna być rekompilowana. Podczas budowania wielu wersji Boost.Pythona, zweryfikuj czystą kompilację. Bez czystej budowy, Boost.Python może budować, ale nie łączy się poprawnie. Na przykład, symbol PyClass_Type nie powinien być odwoływany w Pythonie 3 Boost.Python buduje, ale bez czystej kompilacji, poprzednie artefakty mogą wypełniać bibliotekę:

$ ./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

Uwaga pomimo tego, że 3noclean build został zbudowany przeciwko Pythonowi 3, poprzednia build, która używała Pythona 2, miała artefakty, które zanieczyszczały bibliotekę 3noclean. Należy również pamiętać, że impuls.Python i Kod użytkownika mogą wymagać przekompilowania, aby dopasować architekturę CPU Pythona i konfiguracje unicode UCS-2 lub UCS-4.

 28
Author: Tanner Sansbury,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-06 06:28:39