.. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. .. _updating_python_deps: 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.