compiling for both python2 and python3

classic Classic list List threaded Threaded
8 messages Options
Reply | Threaded
Open this post in threaded view
|

compiling for both python2 and python3

Alexander Bürger
Hi,

I am trying to find a good way to compile a python module for a c++ library using boost-python for both python2 and python3 in the same compilation. So far, The only solution I found for using

FIND_PACKAGE(PythonInterp REQUIRED)
FIND_PACKAGE(PythonLibs REQUIRED)
FIND_PACKAGE(Boost REQUIRED COMPONENTS python # or python3)

with different python versions is to use one CMakeLists.txt per python version, each in a subdirectory, and with almost equal contents. I would appreciate suggestions for a better approach, with less duplication.

Best regards,

Alexander Bürger
MET Norway


--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake
Reply | Threaded
Open this post in threaded view
|

Re: compiling for both python2 and python3

Petr Kmoch
Hi Alexander.

No time for a full answer now, but a hint: it's possible to add_subdirectory() the same CMakeLists.txt multiple times, if you use a different binary dir each time. You can set some variables in the parent CMakeList and use them in the child one to generate slightly different projects from the same source.

Petr

On 22 June 2018 at 10:33, Alexander Bürger <[hidden email]> wrote:
Hi,

I am trying to find a good way to compile a python module for a c++ library using boost-python for both python2 and python3 in the same compilation. So far, The only solution I found for using

FIND_PACKAGE(PythonInterp REQUIRED)
FIND_PACKAGE(PythonLibs REQUIRED)
FIND_PACKAGE(Boost REQUIRED COMPONENTS python # or python3)

with different python versions is to use one CMakeLists.txt per python version, each in a subdirectory, and with almost equal contents. I would appreciate suggestions for a better approach, with less duplication.

Best regards,

Alexander Bürger
MET Norway


--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake



--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake
Reply | Threaded
Open this post in threaded view
|

Re: compiling for both python2 and python3

Alexander Bürger
Hi,

thanks, Petr, for the hint. I was not aware of the possibility to specify a binary directory, and I will investigate how that works.

Cheers,

Alexander Bürger
MET Norway

--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake
Reply | Threaded
Open this post in threaded view
|

Re: compiling for both python2 and python3

Isaiah Norton
In reply to this post by Alexander Bürger


On Fri, Jun 22, 2018 at 4:36 AM Alexander Bürger <[hidden email]> wrote:
Hi,

I am trying to find a good way to compile a python module for a c++ library using boost-python for both python2 and python3 in the same compilation. So far, The only solution I found for using

The headers CMake needs to find are different depending on the selected version, because the CPython API changed between 2 and 3. The ABI is also not guaranteed to be stable within 3.x minor versions unless you set Py_LIMITED_API (see e.g. https://stackoverflow.com/questions/28830653/build-boost-with-multiple-python-versions).

 

FIND_PACKAGE(PythonInterp REQUIRED)
FIND_PACKAGE(PythonLibs REQUIRED)
FIND_PACKAGE(Boost REQUIRED COMPONENTS python # or python3)

with different python versions is to use one CMakeLists.txt per python version, each in a subdirectory, and with almost equal contents. I would appreciate suggestions for a better approach, with less duplication.

Best regards,

Alexander Bürger
MET Norway

--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake

--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake
Reply | Threaded
Open this post in threaded view
|

Re: compiling for both python2 and python3

Juan E. Sanchez
I use the same source files to compile by setting
TARGET_INCLUDE_DIRECTORIES for two similar targets.  The included
Python.h provides the PY_MAJOR_VERSION macro to know if you are
compiling for python 2 or 3.

https://github.com/devsim/devsim/blob/master/src/pythonapi/CMakeLists.txt

https://github.com/devsim/devsim/blob/master/src/pythonapi/PythonCommands.cc

I avoid using FIND_PACKAGE, and code my own PYTHON or PYTHON3 variables,
like:
PYTHON_INCLUDE
PYTHON3_INCLUDE

in a specific cmake file for my configuration:

https://github.com/devsim/devsim/blob/master/cmake/centos_6.cmake

Regards,

Juan Sanchez

On 6/22/18 2:15 PM, Isaiah Norton wrote:

>
>
> On Fri, Jun 22, 2018 at 4:36 AM Alexander Bürger <[hidden email]
> <mailto:[hidden email]>> wrote:
>
>     Hi,
>
>     I am trying to find a good way to compile a python module for a c++
>     library using boost-python for both python2 and python3 in the same
>     compilation. So far, The only solution I found for using
>
>
> The headers CMake needs to find are different depending on the selected
> version, because the CPython API changed between 2 and 3. The ABI is
> also not guaranteed to be stable within 3.x minor versions unless you
> set Py_LIMITED_API (see e.g.
> https://stackoverflow.com/questions/28830653/build-boost-with-multiple-python-versions).
>
>
>     FIND_PACKAGE(PythonInterp REQUIRED)
>     FIND_PACKAGE(PythonLibs REQUIRED)
>     FIND_PACKAGE(Boost REQUIRED COMPONENTS python # or python3)
>
>     with different python versions is to use one CMakeLists.txt per
>     python version, each in a subdirectory, and with almost equal
>     contents. I would appreciate suggestions for a better approach, with
>     less duplication.
>
>     Best regards,
>
>     Alexander Bürger
>     MET Norway
>
>     --
>
>     Powered by www.kitware.com <http://www.kitware.com>
>
>     Please keep messages on-topic and check the CMake FAQ at:
>     http://www.cmake.org/Wiki/CMake_FAQ
>
>     Kitware offers various services to support the CMake community. For
>     more information on each offering, please visit:
>
>     CMake Support: http://cmake.org/cmake/help/support.html
>     CMake Consulting: http://cmake.org/cmake/help/consulting.html
>     CMake Training Courses: http://cmake.org/cmake/help/training.html
>
>     Visit other Kitware open-source projects at
>     http://www.kitware.com/opensource/opensource.html
>
>     Follow this link to subscribe/unsubscribe:
>     https://cmake.org/mailman/listinfo/cmake
>
>
>

--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake
Reply | Threaded
Open this post in threaded view
|

Re: compiling for both python2 and python3

Alexander Bürger
Hello Juan,

but there are also two boost-python versions required, one for python2 and one for python3. I think it is not a good idea to reimplement the FindBoost logic.

Cheers,

Alexander Bürger
MET Norway

--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake
Reply | Threaded
Open this post in threaded view
|

Re: compiling for both python2 and python3

Alexander Bürger
In reply to this post by Isaiah Norton
Hi Isaiah,

that's correct and basically the reason why I need to compile two different modules for python2 and python3. In addition, I assume that the python minor version does not change; with that, I get some help from the package manager.

Cheers,

Alexander Bürger
MET Norway

--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake
Reply | Threaded
Open this post in threaded view
|

Re: compiling for both python2 and python3

Juan E. Sanchez
In reply to this post by Alexander Bürger
Hi,

What happens if you call FindBoost once for python 2 and once for python
3?  Between invocations you could copy the boost variables to python
specific variants.

FindBoost( . . . .)
SET(Boost_LIBRARY_DIRS_PYTHON2 ${Boost_LIBRARY_DIRS})
FindBoost( . . . .)
SET(Boost_LIBRARY_DIRS_PYTHON3 ${Boost_LIBRARY_DIRS})


Regards,

Juan


On 6/25/18 1:24 AM, Alexander Bürger wrote:

> Hello Juan,
>
> but there are also two boost-python versions required, one for python2
> and one for python3. I think it is not a good idea to reimplement the
> FindBoost logic.
>
> Cheers,
>
> Alexander Bürger
> MET Norway
> ​
>
>

--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake