Skip to main content

Test CPPLib integration

Project description

C++ and Python Library

This is a template repository used to create C++/Python libraries. This is for individual who want to write a standalone C++ library that can also be bound to Python using Pybind11 for better performance. This repository additionally takes care of the intricate world of building binary wheels automatically and publishing to PyPI, including linux and windows. I have tried my best to use good tools and practices in this repo to provide a clean codebase for others to start their project on. What you see in this repo is not all my work, but lessons/code I have learned after observing others work.

Key Features

  • C++ Library is independent of Python Extension, i.e. can be dropped into pure C++ projects.
  • Cross platform using Modern CMake.
  • Benchmark (Nanobench) and Testing (doctest) built in.
  • Good handling of thirdparty dependencies using CMake FetchContent.
  • Documentation for both C++ and Python created using Sphinx, Doxygen, Breathe, and Exhale. The documentation is unified into one website.
  • Integration of CMake into setup.py so that pip install works for python users wanting to build manually (CMake must be installed still).
    • Note that the C++ Library and even the python extension can still be built with standard CMake procedures, see Build with CMake
  • Automatic building of python binary wheels using github actions, see Workflow

This repo relies upon using Modern CMake to build both the C++ and Python Extension libraries. I find that integrating it all in CMake leads to a much nicer developer experience. External users building the library will need CMake installed which may be a consideration before using this template repo as a starting point. However, this repo has a github workflow setup to automatically build python binary wheels for you and upload to PyPI for a variety of python versions/OS/architectures! Please see workflows

Instructions For Using Template

  1. git clone https://github.com/JeremyBYU/cpp-pybind-skel.git

Rename Files

You will want to rename files and library names with a simple find and replace using your IDE/editor. Lets say you named your project SimpleImageFilters with an associates short acronym of SIF . Then simply find and replace in this repository the following (case sensitivity matters):

  • CPPLib -> SimpleImageFilters - C++ Top Namespace and CMake Project Name
  • CPPLIB -> SIMPLEIMAGEFILTERS - Same but uppercase, used in CMake
  • CPPL -> SIF - Acronym used in CMake alias for project
  • cpplib -> simpleimagefilters - Python Library Extension Name

A helper python script, rename_project.py is provided if desired. I would recommend using it because it saves a lot of time.

Note: you don't have to use the naming convention proposed above and may use any you would like. I think the most important thing is simply that the Python extension target is different then C++ library target.

Build Project Manually

You can build the project manually in two ways: one in pure CMake, the other using python setup.py.

Build Manually With CMake

Building happens entirely with CMake. This is meant really only for the library developers who are working on C++ and Python in an edit-compile cycle.

C++

  1. mkdir cmake-build && cd cmake-build
  2. cmake .. - Note - For windows also add -DCMAKE_GENERATOR_PLATFORM=x64
  3. cmake --build . -j$(nproc) --config Release

Build options:

CPPL_BUILD_BENCHMARKS:BOOL=ON // CPPL - Build Benchmarks
CPPL_BUILD_EXAMPLES:BOOL=ON // CPPL - Build Examples
CPPL_BUILD_PYMODULE:BOOL=ON // CPPL -Build Python Module
CPPL_BUILD_TESTS:BOOL=ON // CPPL - Build Tests
CPPL_BUILD_WERROR:BOOL=OFF // CPPL - Add Werror flag to build (turns warnings into errors)
CPPL_WITH_OPENMP:BOOL=ON // CPPL - Build with OpenMP Support

Python

This is meant for advanced python users who are actively developing the extension.

  1. Install conda or create a python virtual environment (Why?). I recommend conda for Windows users.
  2. Perform CMake build as described above
  3. cd cmake-build && cmake --build . --target python-package --config Release
  4. cd lib/python_package && pip install -e .

You can build a binary wheel that you can distribute to users with your exact same platform by

  1. cmake --build . --target pip-package --config Release

The wheel should then be at cmake-build\lib\python_package\pip_package. Note you can alternatively build using Python setup.py

Build Manually with Python

The root directory setup.py file has been modified to build with CMake. This is meant for python users that need to build manually (for some reason) but are not actively developing or changing the code.

  1. Install conda or create a python virtual environment (Why?). I recommend conda for Windows users.
  2. pip install . - Call from root directory

That should be it!

Install with Python

If you only care about installing the python extension you can install from the binary wheels generated by the github action workflows. The binary wheels are uploaded to PyPi. Therefore, after configuring the workflow and tagging a version, you can install as:

  1. pip install cpplib - Change cpplib to whatever your python extension will end up being.

Workflows

Several github action workflows are included in this repository. The first is the binary wheel creation and uploading to pypi.

Binary Wheel

This workflow file generates the binary wheels and uploads to PyPI. You will need to configure your github repository with a token access to publish to PyPI and PyPITest. Please read here about what is expected. Note that this workflow only run on the master branch, and publishing only occurs on tagged releases.

Tests

Automatic testing is also done using this test workflow file

Documentation

C++ classes and functions are documented in their header files. Associated Python functions/classes which are bound with Pybind11 are re-documented. This is for two reasons:

  1. The function/class API might actually be slightly different in arguments and return types (e.g., list vs. std::vector) and more detail/nuance may be desired in one form of the other.
  2. I have no idea how to share them.

For Python, I am using this method to inject further documentation into functions/classes which was developed by Intel at Open3D. They provide a function that can transform an input map of arg/description pairs and convert to Googles Python Docstring format.

Documentation Website Generation

Documentation building has been taken from Open3D with some small modification. Python and C++ documentation is generated using Sphinx into the same website. The C++ API is actually integrated into sphinx using breathe/exhale. Please see docs/builddocs.rst.

Release Steps

These are the release steps that I perform to create a release.

  1. Make all necessary changes
  2. python scripts/manage_versions.py --bump patch
  3. pip install .
  4. cd src_docs && python make_docs.py && cd ..
  5. commit changes
  6. python scripts/manage_versions.py --tag
  7. git push origin dev --tags

FAQ

Q: ERROR: Could not install packages due to an EnvironmentError

A: Remove the build directory

Acknowledgements

I have learned a lot by listening/watching/reading about C++. I can't list them all but the following links had the most influence in developing this repo.

  • Open3D - Much of this repo comes from following their practices. After having made many C++/Python projects I find this code structure to be the best for hybrid projects.
  • Modern CMake - An invaluable resource which has taught me about CMake.
  • Mapbox hpp-skel - A great starting point for header-only libraries. Almost everything MapBox makes is gold to me.
  • Parselmouth - A great resource on using github workflows!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cpplib-1.0.4.tar.gz (31.9 kB view details)

Uploaded Source

Built Distributions

cpplib-1.0.4-cp39-cp39-win_amd64.whl (132.6 kB view details)

Uploaded CPython 3.9 Windows x86-64

cpplib-1.0.4-cp39-cp39-manylinux2010_x86_64.whl (217.3 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.12+ x86-64

cpplib-1.0.4-cp38-cp38-win_amd64.whl (132.4 kB view details)

Uploaded CPython 3.8 Windows x86-64

cpplib-1.0.4-cp38-cp38-manylinux2010_x86_64.whl (217.4 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ x86-64

cpplib-1.0.4-cp37-cp37m-win_amd64.whl (133.0 kB view details)

Uploaded CPython 3.7m Windows x86-64

cpplib-1.0.4-cp37-cp37m-manylinux2010_x86_64.whl (214.4 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.12+ x86-64

cpplib-1.0.4-cp36-cp36m-win_amd64.whl (132.8 kB view details)

Uploaded CPython 3.6m Windows x86-64

cpplib-1.0.4-cp36-cp36m-manylinux2010_x86_64.whl (214.7 kB view details)

Uploaded CPython 3.6m manylinux: glibc 2.12+ x86-64

File details

Details for the file cpplib-1.0.4.tar.gz.

File metadata

  • Download URL: cpplib-1.0.4.tar.gz
  • Upload date:
  • Size: 31.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.0 CPython/3.8.6

File hashes

Hashes for cpplib-1.0.4.tar.gz
Algorithm Hash digest
SHA256 0831846990d2f2cbdfc724f85c0f614cf474d37daa0762578a386e5cece67cdb
MD5 ecd18fabbd341790fb6973b22c0a13f4
BLAKE2b-256 3e4a18f21d41f3b5e63cf0b8187300400fc5e1df9395d8e4e341b8bc182dec91

See more details on using hashes here.

File details

Details for the file cpplib-1.0.4-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: cpplib-1.0.4-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 132.6 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.0 CPython/3.8.6

File hashes

Hashes for cpplib-1.0.4-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 3cd852330e286986464c4a54af86b6c2701ba2542f8fb05726e27aa91f57a025
MD5 f75bbf85d22ee6d1a16053fe5b46a269
BLAKE2b-256 151f50156dcfa98bff73680a4224fbe3210ffeca2b0a1ba10654527421f03097

See more details on using hashes here.

File details

Details for the file cpplib-1.0.4-cp39-cp39-manylinux2010_x86_64.whl.

File metadata

  • Download URL: cpplib-1.0.4-cp39-cp39-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 217.3 kB
  • Tags: CPython 3.9, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.0 CPython/3.8.6

File hashes

Hashes for cpplib-1.0.4-cp39-cp39-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 30506c4de222dc38e3e28ec287338ee177e1028f9d2727d6babffc14f1508fcf
MD5 c455e2fa76353451f53bde3988b61a0e
BLAKE2b-256 b588f61c808ded41a21fbdf0b02f33fbdfe63c408586350b45b6b431d4ac2dde

See more details on using hashes here.

File details

Details for the file cpplib-1.0.4-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: cpplib-1.0.4-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 132.4 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.0 CPython/3.8.6

File hashes

Hashes for cpplib-1.0.4-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 f0617e4bac54f02c722bc0ec8d7b2e49d30d8d652e8d74db7cd416efbf706628
MD5 844525e8225bd59dd8206422ed428c35
BLAKE2b-256 1efdf3fdcc8b1d3f09ee3a2f85eec631edf7da74cd4ce8c4f819bbe6963af7fb

See more details on using hashes here.

File details

Details for the file cpplib-1.0.4-cp38-cp38-manylinux2010_x86_64.whl.

File metadata

  • Download URL: cpplib-1.0.4-cp38-cp38-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 217.4 kB
  • Tags: CPython 3.8, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.0 CPython/3.8.6

File hashes

Hashes for cpplib-1.0.4-cp38-cp38-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 712869ccb5daedd0fbc2d4a90c384f57677f04cfb00c3c72dbaddca4b955cc19
MD5 3bfa99e07009bf19f4e3627d7cdc0278
BLAKE2b-256 17a12f930e982a2d86c645d03f72052b05f43da648366087a41b8555caafc457

See more details on using hashes here.

File details

Details for the file cpplib-1.0.4-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: cpplib-1.0.4-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 133.0 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.0 CPython/3.8.6

File hashes

Hashes for cpplib-1.0.4-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 5bc99e1935cd4c3378a13986c2f0e4c46e09841977da2a8196a8c3867f60e1a7
MD5 f8d68f76ab542228ba4cd88cee9baa35
BLAKE2b-256 97b2773f64e7ad11ab1ee37300ba8a63c9322f6d82352f3753173028cdf3f5fd

See more details on using hashes here.

File details

Details for the file cpplib-1.0.4-cp37-cp37m-manylinux2010_x86_64.whl.

File metadata

  • Download URL: cpplib-1.0.4-cp37-cp37m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 214.4 kB
  • Tags: CPython 3.7m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.0 CPython/3.8.6

File hashes

Hashes for cpplib-1.0.4-cp37-cp37m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 8785e008293214c289d241a3dd1a4404015d4ebe5cad7cf0799eff26c5187b6a
MD5 480f52ef57c7fa0a0cc0cb6f95181e2c
BLAKE2b-256 5dfb1438224f786a28db99df0d417077712e9c8703fb4ede4f51176bf2953461

See more details on using hashes here.

File details

Details for the file cpplib-1.0.4-cp36-cp36m-win_amd64.whl.

File metadata

  • Download URL: cpplib-1.0.4-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 132.8 kB
  • Tags: CPython 3.6m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.0 CPython/3.8.6

File hashes

Hashes for cpplib-1.0.4-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 322a87f38fe93c065eb77f394edb35c974e6a56ea847b14ab1b62162fe040080
MD5 32ed2760fdea28d26c2fdbe0247973a2
BLAKE2b-256 5b43183f8feaa20cd84dc7364e64d2150548d4077c5cf68c0b046880f35f8a8e

See more details on using hashes here.

File details

Details for the file cpplib-1.0.4-cp36-cp36m-manylinux2010_x86_64.whl.

File metadata

  • Download URL: cpplib-1.0.4-cp36-cp36m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 214.7 kB
  • Tags: CPython 3.6m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.0 CPython/3.8.6

File hashes

Hashes for cpplib-1.0.4-cp36-cp36m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 908248ea6266d80811970c45d5ccfbba453aeaf2d221fbd9d8cf6f5f99030af8
MD5 d438074b50357293eda870994bb06333
BLAKE2b-256 3be1afb6131e5a38fb9e2566d8bcdd080008d6f5679d9d571ab4fa8f1d6c80e4

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page