Skip to content
/ python-native Public template

Test to build a multi-platforms Native Python 3 package using pip

License

Notifications You must be signed in to change notification settings

Mizux/python-native

Repository files navigation

Github-CI:
Build Status Build Status Build Status
Build Status Build Status

Introduction

| Requirement | Codemap | Dependencies | Build | CI | Appendices | License |

This is an example of how to create a Modern CMake C++/Python Project.

This project aim to explain how you build a Python 3.6+ native wheel package using Python3 and a setup.py.
e.g. You have a cross platform C++ library (using a CMake based build) and a Python wrapper on it thanks to SWIG.
Then you want to provide a cross-platform Python packages to consume it in a Python project...

This project should run on GNU/Linux, MacOS and Windows.

Requirement

You'll need:

  • "CMake >= 3.18".
  • "Python >= 3.6" and python module 'pip' (ed "setuptools" and "wheel" will be auto installed on demand).

Codemap

The project layout is as follow:

Dependencies

To complexify a little, the CMake project is composed of three libraries (Foo, Bar and FooBar) with the following dependencies:

Foo:
Bar:
FooBar: PUBLIC Foo PRIVATE Bar

Build Process

To Create a native dependent package which will contains two parts:

  • A bunch of native libraries for the supported platform targeted.
  • The Python code depending on it.

note: Since Pypi.org support multiple packages, we will simply upload one package per supported platform.

Local Package

The pipeline for linux-x86-64 should be as follow:
Local Pipeline Legend

Building local native Package

Thus we have the C++ shared library libFoo.so and the SWIG generated Python wrappers e.g. pyfoo.py in the same package.

Here some dev-note concerning this setup.py.

  • This package is a native package containing native libraries.

Then you can generate the package and install it locally using:

python3 setup.py bdist_wheel
python3 -m pip install --user --find-links=dist pythonnative

If everything good the package (located in <buildir>/python/dist) should have this layout:

{...}/dist/pythonnative-X.Y.9999-cp3Z-cp3Z-<platform>.whl:
\- pythonnative
   \- __init__.py
   \- .libs
      \- libFoo.so
      \- ...
   \- foo
      \- __init__.py
      \- pyFoo.py
      \- _pyFoo.so
...

note: <platform> could be manylinux2014_x86_64, macosx_10_9_x86_64 or win-amd64.

tips: since wheel package are just zip archive you can use unzip -l <package>.whl to study their layout.

Appendices

Few links on the subject...

Resources

Project layout:

  • The Pitchfork Layout Revision 1 (cxx-pflR1)

CMake:

Python:

Misc

Image has been generated using plantuml:

plantuml -Tsvg docs/{file}.dot

So you can find the dot source files in docs.

License

Apache 2. See the LICENSE file for details.

Disclaimer

This is not an official Google product, it is just code that happens to be owned by Google.