---
hide-toc: true
---
# PyPI-Bonjour 🥖
Tutorial on publishing to PyPI.
---
## Changelog
The `pypi-bonjour` package gradually adds more functionality over different versions.
### v0.0.1: the hello-world example
This version publishes the barebone skeleton code to `pypi`, which includes:
- the source code with the single pure Python function `hello_world` (in contrast with pybinded functions)
- a `pyproject.toml` file for enabling `pip install` of the package
- the GitHub workflow that publishes the package to `pypi` upon release publish
See this [video](https://youtu.be/J0ClmuAbiMA?si=83Xe7eJW5LNUr5yP) by Prof.Qiusheng Wu for an introduction to PyPI packaging.
### v0.0.2: add dependencies
This version adds NumPy as one of the dependencies.
### v0.0.3: add pybind11-binded C++ function
This version adds a function that is `pybind11`-binded from C++ from Python without the use of CMake. See [here](https://pybind11.readthedocs.io/en/stable/compiling.html#modules-with-setuptools) for an intro regarding using `pybind11` with `setuptools`.
See this [video](https://youtu.be/80j-MRtHMek?si=f-o5LCoFGKja3P59) by anthonywritescode for an introduction to `manylinux`. Building these `manylinux` wheels requires the installation of a docker image and building the wheels inside that docker image. This process is automated by `cibuildwheel`. Furthermore, to enable the build for different architectures on a computer, one should download QEMU for architecture emulation
```bash
python3 -m pip install cibuildwheel
sudo apt-get install qemu-system # for Ubuntu, see https://www.qemu.org/download for more details
```
To build the wheels only for `CPython` (what is `PyPy`...), non-alpine Linux (what is `musllinux`...), `x86_64` and `aarch64` platforms, use the following command:
```bash
export CIBW_SKIP="pp* *musllinux*"
export CIBW_ARCHS="x86_64 aarch64"
cibuildwheel
```
These can also be added to the `pyproject.toml` file
```toml
[tool.cibuildwheel]
skip = "pp* *musllinux*"
archs = "x86_64 aarch64"
```
Then, run `cibuildwheel` in the root directory. These commands will generate the built distributions in the `wheelhouse` directory, which can then be uploaded to PyPI using the command
```bash
twine upload wheelhouse/*
```
Note that the source distribution (only the source code) is still missing. To generate it and upload it to PyPI, run the commands
```bash
python3 -m build --sdist
twine upload dist/*
```
The final result is [here](https://pypi.org/project/pypi-bonjour/0.0.3/#files). Note that the GitHub actions are not set up yet, so the action that this release triggered did not successfully upload the wheels to PyPI.
### v0.0.4: added build and publish to PyPI GitHub workflow
For details see [`build_publish_pypi.yml`](https://github.com/BolunDai0216/pypi-bonjour/blob/main/.github/workflows/build_publish_pypi.yml).
### v0.0.5: added C++ projects that are built by CMake
Added a `CMakeLists.txt` file to build the Python bindings using `pybind11` and `cmake`. The `setup.py` file is updated according to the [official `pybind11` + `cmake` example](https://github.com/pybind/cmake_example/blob/master/setup.py), if you prefer a video that goes through this process see [this one](https://youtu.be/H2wOlriHGmM?si=lF9kVxETq_msUT7a) by Facile Tutorials.
### v0.0.6: added external C++ dependencies
Added functions that use `Eigen`. This involves installing `Eigen` in the `CIBW_BEFORE_ALL` script. However, there are certain limitations to CentOS [that need to be taken care of](https://stackoverflow.com/questions/74345206/centos-7-docker-yum-installation-gets-stuck).
## Contact
If you have any questions, please feel free to contact [Bolun Dai](mailto:bd1555@nyu.edu).
```{toctree}
:caption: 'Content:'
:hidden:
:maxdepth: 2
tutorial
```