| On version numbers |
| ^^^^^^^^^^^^^^^^^^ |
| |
| The version number must be a valid `PEP 440 |
| <https://www.python.org/dev/peps/pep-0440>`_ version number. |
| |
| For example: |
| |
| .. code-block:: C++ |
| |
| #define PYBIND11_VERSION_MAJOR X |
| #define PYBIND11_VERSION_MINOR Y |
| #define PYBIND11_VERSION_MICRO Z |
| #define PYBIND11_VERSION_RELEASE_LEVEL PY_RELEASE_LEVEL_ALPHA |
| #define PYBIND11_VERSION_RELEASE_SERIAL 0 |
| #define PYBIND11_VERSION_PATCH Za0 |
| |
| For beta, ``PYBIND11_VERSION_PATCH`` should be ``Zb1``. RC's can be ``Zrc1``. |
| For a final release, this must be a simple integer. |
| |
| |
| To release a new version of pybind11: |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| |
| If you don't have nox, you should either use ``pipx run nox`` instead, or use |
| ``uv tool install nox``, ``pipx install nox``, or ``brew install nox`` (Unix). |
| |
| - Update the version number |
| |
| - Update ``PYBIND11_VERSION_MAJOR`` etc. in |
| ``include/pybind11/detail/common.h``. MICRO should be a simple integer. |
| |
| - Run ``nox -s tests_packaging`` to ensure this was done correctly. |
| |
| - Ensure that all the information in ``pyproject.toml`` is up-to-date, like |
| supported Python versions. |
| |
| - Add release date in ``docs/changelog.md`` and integrate the output of |
| ``nox -s make_changelog``. |
| |
| - Note that the ``nox -s make_changelog`` command inspects |
| `needs changelog <https://github.com/pybind/pybind11/pulls?q=is%3Apr+is%3Aclosed+label%3A%22needs+changelog%22>`_. |
| |
| - Manually clear the ``needs changelog`` labels using the GitHub web |
| interface (very easy: start by clicking the link above). |
| |
| - ``git add`` and ``git commit``, ``git push``. **Ensure CI passes**. (If it |
| fails due to a known flake issue, either ignore or restart CI.) |
| |
| - Add a release branch if this is a new MINOR version, or update the existing |
| release branch if it is a patch version |
| |
| - NOTE: This documentation assumes your ``upstream`` is ``https://github.com/pybind/pybind11.git`` |
| |
| - New branch: ``git checkout -b vX.Y``, ``git push -u upstream vX.Y`` |
| |
| - Update branch: ``git checkout vX.Y``, ``git merge <release branch>``, ``git push`` |
| |
| - Update tags (optional; if you skip this, the GitHub release makes a |
| non-annotated tag for you) |
| |
| - ``git tag -a vX.Y.Z -m 'vX.Y.Z release'`` |
| |
| - ``git grep PYBIND11_VERSION include/pybind11/detail/common.h`` |
| |
| - Last-minute consistency check: same as tag? |
| |
| - Push the new tag: ``git push upstream vX.Y.Z`` |
| |
| - Update stable |
| |
| - ``git checkout stable`` |
| |
| - ``git merge -X theirs vX.Y.Z`` |
| |
| - ``git diff vX.Y.Z`` |
| |
| - Carefully review and reconcile any diffs. There should be none. |
| |
| - ``git push`` |
| |
| - Make a GitHub release (this shows up in the UI, sends new release |
| notifications to users watching releases, and also uploads PyPI packages). |
| (Note: if you do not use an existing tag, this creates a new lightweight tag |
| for you, so you could skip the above step.) |
| |
| - GUI method: Under `releases <https://github.com/pybind/pybind11/releases>`_ |
| click "Draft a new release" on the far right, fill in the tag name |
| (if you didn't tag above, it will be made here), fill in a release name |
| like "Version X.Y.Z", and copy-and-paste the markdown-formatted (!) changelog |
| into the description. You can remove line breaks and optionally strip links |
| to PRs and issues, e.g. to a bare ``#1234`` without the hyperlink markup. |
| Check "pre-release" if this is an alpha/beta/RC. |
| |
| - CLI method: with ``gh`` installed, run ``gh release create vX.Y.Z -t "Version X.Y.Z"`` |
| If this is a pre-release, add ``-p``. |
| |
| - Get back to work |
| |
| - Make sure you are on master, not somewhere else: ``git checkout master`` |
| |
| - Update version macros in ``include/pybind11/detail/common.h`` (set PATCH to |
| ``0a0`` and increment MINOR). |
| |
| - Update ``pybind11/_version.py`` to match. |
| |
| - Run ``nox -s tests_packaging`` to ensure this was done correctly. |
| |
| - If the release was a new MINOR version, add a new ``IN DEVELOPMENT`` |
| section in ``docs/changelog.md``. |
| |
| - ``git add``, ``git commit``, ``git push`` |
| |
| If a version branch is updated, remember to set PATCH to ``1a0``. |
| |
| Conda-forge should automatically make a PR in a few hours, and automatically |
| merge it if there are no issues. Homebrew should be automatic, too. |
| |
| |
| Manual packaging |
| ^^^^^^^^^^^^^^^^ |
| |
| If you need to manually upload releases, you can download the releases from |
| the job artifacts and upload them with twine. You can also make the files |
| locally (not recommended in general, as your local directory is more likely |
| to be "dirty" and SDists love picking up random unrelated/hidden files); |
| this is the procedure: |
| |
| .. code-block:: bash |
| |
| nox -s build |
| nox -s build_global |
| twine upload dist/* |
| |
| This makes SDists and wheels, and the final line uploads them. |