Updating BuildStream’s Python dependencies

BuildStream’s Python dependencies are listed in multiple requirements files present in the requirements directory.

All .txt files in this directory are generated from the corresponding .in file, and each .in file represents a set of dependencies. For example, requirements.in contains all runtime dependencies of BuildStream. requirements.txt is generated from it, and contains pinned versions of all runtime dependencies (including transitive dependencies) of BuildStream.

When adding a new dependency to BuildStream, or updating existing dependencies, it is important to update the appropriate requirements file accordingly. After changing the .in file, run the following to update the matching .txt file:

make -C requirements

Adding support for a new Python release

When a new stable release of Python 3 appears, we must explicitly declare our support for it in the following places.

tox.ini

The tox.ini file defines the environments where the BuildStream test suite runs. Every py{3.x,3.y} list must be updated to contain the new version number such as 311 for CPython 3.11.

Use tox -e py311-nocover to run the test suite with the new version of Python.

pyproject.toml

Bump cython version

New releases of Cython must be depended on with new versions of Python in lock step.

When supporting a new Python version, it is important to bump the minimal dependency on Cython to a new enough version which also supports the new version of Python.

Wheel details

We produce binary “wheel” packages for each supported version of Python. The cibuildwheel build tool will build for all released versions of Python so no change is needed in the config.

However, if you want to test wheel building with a prerelease version of Python you will need to set CIBW_PRERELEASE_PYTHONS=1 in the cibuildwheel environment.

.github/compose/ci.docker-compose.yml

Each binary package is tested in a container, using the pypa/manylinux images.

You need to add a new docker-compose service here – copy the latest one and update the version number where it appears.

.github/workflows/ci.yml and .github/workflows/release.yml

There is a separate CI job to run each of the above tests. Update the matrix config for the test_wheels jobs in ci.yml and release.yml to add the new Python version.

Removing support for a Python release

tox.ini

You will need to update the py{3.x,3.y} lists to remove the old version. In the envlist section, make sure the oldest version still has coverage enabled while the other versions are marked -nocover.

pyproject.toml

The cibuildwheel tool will produce wheels for all versions of Python supported upstream.. If we drop support for a version before upstream do, update the tool.cibuildwheel.skip list to skip all platform tags for that version. The glob cp36-* would skip all CPython 3.6 builds, for example.

.github/compose/ci.docker-compose.yml

Remove the corresponding service.

.github/workflows/ci.yml and .github/workflows/release.yml

Update the matrix config for the test_wheels jobs in ci.yml and release.yml to remove the old Python version.

ABI compatibility for binary Python packages

The Python binary packages declare system requirements using platform compatibility tags.

For linux-gnu systems we use manylinux_x_y platform tags to specify a minimum GLIBC version. The platform tag is controlled in pyproject.toml with the tool.cibuildwheel.manylinux-x86_64-image key. It must correspond with the version of GLIBC used in buildbox-integration to produce static buildbox binaries that are included in the package. The cibuildwheel tool uses auditwheel to ensure the correct platform tag is declared.