//python/extensions:python.bzl

Python toolchain module extensions for use with bzlmod.

module ext python

Bzlmod extension that is used to register Python toolchains.

python.override(auth_patterns={}, available_python_versions=[], base_url='https://github.com/indygreg/python-build-standalone/releases/download', ignore_root_user_error=False, minor_mapping={}, netrc='', register_all_versions=False)

Tag class used to override defaults and behaviour of the module extension.

Added in version 0.36.0.

Attributes:
  • auth_patterns(dict[str, str]) (default {})

    An optional dict mapping host names to custom authorization patterns.

    If a URL’s host name is present in this dict the value will be used as a pattern when generating the authorization header for the http request. This enables the use of custom authorization schemes used in a lot of common cloud storage providers.

    The pattern currently supports 2 tokens: <login> and <password>, which are replaced with their equivalent value in the netrc file for the same host name. After formatting, the result is set as the value for the Authorization field of the HTTP request.

    Example attribute and netrc for a http download to an oauth2 enabled API using a bearer token:

    auth_patterns = {
        "storage.cloudprovider.com": "Bearer <password>"
    }
    

    netrc:

    machine storage.cloudprovider.com
            password RANDOM-TOKEN
    

    The final HTTP request would have the following header:

    Authorization: Bearer RANDOM-TOKEN
    

    optional

  • available_python_versions(list[str]) (default [])

    The list of available python tool versions to use. Must be in X.Y.Z format. If the unknown version given the processing of the extension will fail - all of the versions in the list have to be defined with python.single_version_override or python.single_version_platform_override before they are used in this list.

    This attribute is usually used in order to ensure that no unexpected transitive dependencies are introduced.

    optional

  • base_url(str) (default “https://github.com/indygreg/python-build-standalone/releases/download”)

    The base URL to be used when downloading toolchains.

    optional

  • ignore_root_user_error(bool) (default False)

    If False, the Python runtime installation will be made read only. This improves the ability for Bazel to cache it, but prevents the interpreter from creating .pyc files for the standard library dynamically at runtime as they are loaded.

    If True, the Python runtime installation is read-write. This allows the interpreter to create .pyc files for the standard library, but, because they are created as needed, it adversely affects Bazel’s ability to cache the runtime and can result in spurious build failures.

    optional

  • minor_mapping(dict[str, str]) (default {})

    The mapping between X.Y to X.Y.Z versions to be used when setting up toolchains. It defaults to the interpreter with the highest available patch version for each minor version. For example if one registers 3.10.3, 3.10.4 and 3.11.4 then the default for the minor_mapping dict will be:

    {
    "3.10": "3.10.4",
    "3.11": "3.11.4",
    }
    

    Changed in version 0.37.0: The values in this mapping override the default values and do not replace them.

    optional

  • netrc(str) (default “”)

    Location of the .netrc file to use for authentication

    optional

  • register_all_versions(bool) (default False)

    Add all versions

    optional

python.single_version_override(python_version, distutils=None, distutils_content='', patch_strip=0, patches=[], sha256={}, strip_prefix='python', urls=[])

Override single python version URLs and patches for all platforms.

Note

This will replace any existing configuration for the given python version.

Tip

If you would like to modify the configuration for a specific (version, platform), please use the single_version_platform_override tag class.

Added in version 0.36.0.

Attributes:
  • python_version(str)

    The python version to override URLs for. Must be in X.Y.Z format.

    mandatory

  • distutils(label) (default None)

    A distutils.cfg file to be included in the Python installation. Either distutils or distutils_content can be specified, but not both.

    optional

  • distutils_content(str) (default “”)

    A distutils.cfg file content to be included in the Python installation. Either distutils or distutils_content can be specified, but not both.

    optional

  • patch_strip(int) (default 0)

    Same as the –strip argument of Unix patch.

    optional

  • patches(list[label]) (default [])

    A list of labels pointing to patch files to apply for the interpreter repository. They are applied in the list order and are applied before any platform-specific patches are applied.

    optional

  • sha256(dict[str, str]) (default {})

    The python platform to sha256 dict. See python.single_version_platform_override.platform for allowed key values.

    optional

  • strip_prefix(str) (default “python”)

    The ‘strip_prefix’ for the archive, defaults to ‘python’.

    optional

  • urls(list[str]) (default [])

    The URL template to fetch releases for this Python version. See python.single_version_platform_override.urls for documentation.

    optional

python.single_version_platform_override(platform, python_version, coverage_tool=None, patch_strip=0, patches=[], sha256='', strip_prefix='python', urls=[])

Override single python version for a single existing platform.

If the (version, platform) is new, we will add it to the existing versions and will use the same url template.

Tip

If you would like to add or remove platforms to a single python version toolchain configuration, please use single_version_override.

Added in version 0.36.0.

Attributes:
  • platform(str)

    The platform to override the values for, must be one of:

    • aarch64-apple-darwin-freethreaded

    • aarch64-apple-darwin

    • aarch64-unknown-linux-gnu-freethreaded

    • aarch64-unknown-linux-gnu

    • armv7-unknown-linux-gnu-freethreaded

    • armv7-unknown-linux-gnu

    • i386-unknown-linux-gnu-freethreaded

    • i386-unknown-linux-gnu

    • ppc64le-unknown-linux-gnu-freethreaded

    • ppc64le-unknown-linux-gnu

    • riscv64-unknown-linux-gnu-freethreaded

    • riscv64-unknown-linux-gnu

    • s390x-unknown-linux-gnu-freethreaded

    • s390x-unknown-linux-gnu

    • x86_64-apple-darwin-freethreaded

    • x86_64-apple-darwin

    • x86_64-pc-windows-msvc-freethreaded

    • x86_64-pc-windows-msvc

    • x86_64-unknown-linux-gnu-freethreaded

    • x86_64-unknown-linux-gnu

    • x86_64-unknown-linux-musl-freethreaded

    • x86_64-unknown-linux-musl.

    mandatory

  • python_version(str)

    The python version to override URLs for. Must be in X.Y.Z format.

    mandatory

  • coverage_tool(label) (default None)

    The coverage tool to be used for a particular Python interpreter. This can override rules_python defaults.

    optional

  • patch_strip(int) (default 0)

    Same as the –strip argument of Unix patch.

    optional

  • patches(list[label]) (default [])

    A list of labels pointing to patch files to apply for the interpreter repository. They are applied in the list order and are applied after the common patches are applied.

    optional

  • sha256(str) (default “”)

    The sha256 for the archive

    optional

  • strip_prefix(str) (default “python”)

    The ‘strip_prefix’ for the archive, defaults to ‘python’.

    optional

  • urls(list[str]) (default [])

    The URL template to fetch releases for this Python version. If the URL template results in a relative fragment, default base URL is going to be used. Occurrences of {python_version}, {platform} and {build} will be interpolated based on the contents in the override and the known platform values.

    optional

python.toolchain(python_version, configure_coverage_tool=False, ignore_root_user_error=False, is_default=False)

Tag class used to register Python toolchains. Use this tag class to register one or more Python toolchains. This class is also potentially called by sub modules. The following covers different business rules and use cases.

Tip

In order to use a different name than the above, you can use the following MODULE.bazel syntax:

python = use_extension("@rules_python//python/extensions:python.bzl", "python")
python.toolchain(
    is_default = True,
    python_version = "3.11",
)

use_repo(python, my_python_name = "python_3_11")

Then the python interpreter will be available as my_python_name.

Attributes:
  • python_version(str)

    The Python version, in major.minor or major.minor.patch format, e.g 3.12 (or 3.12.3), to create a toolchain for.

    mandatory

  • configure_coverage_tool(bool) (default False)

    Whether or not to configure the default coverage tool provided by rules_python for the compatible toolchains.

    optional

  • ignore_root_user_error(bool) (default False)

    If False, the Python runtime installation will be made read only. This improves the ability for Bazel to cache it, but prevents the interpreter from creating .pyc files for the standard library dynamically at runtime as they are loaded.

    If True, the Python runtime installation is read-write. This allows the interpreter to create .pyc files for the standard library, but, because they are created as needed, it adversely affects Bazel’s ability to cache the runtime and can result in spurious build failures.

    optional

  • is_default(bool) (default False)

    Whether the toolchain is the default version

    optional