:::{default-domain} bzl :::
This is a human-friendly changelog in a keepachangelog.com style format. Because this changelog is for end-user consumption of meaningful changes, only a summary of a release‘s changes is described. This means every commit is not necessarily mentioned, and internal refactors or code cleanups are omitted unless they’re particularly notable.
A brief description of the categories of changes:
Changed: Some behavior changed. If the change is expected to break a public API or supported behavior, it will be marked as BREAKING. Note that beta APIs will not have breaking API changes called out.Fixed: A bug, or otherwise incorrect behavior, was fixed.Added: A new feature, API, or behavior was added in a backwards compatible manner.(bzlmod) or (docs).# gazelle:experimental_allow_relative_imports true directive ({gh-issue}2203).python.ParserOutput are now all public.__init__.py, __main__.py, or __test__.py files to be present in a directory to generate a BUILD.bazel file.bazel vendor vendor directory would fail if the constraints file contained environment markers. Fixes #2996.py.typed to indicate it supports type checking (#2503).local_runtime_repo now checks if the include directory exists before attempting to watch it, fixing issues on macOS with system Python (#3043).defaults configuration now supports any custom platform name.local_runtime_repo works with multiarch Debian with Python 3.8 (#3099).requirements.txt evaluation, use the newly added developer preview of the pip.default tag class. Only rules_python and root modules can use this feature. You can also configure custom config_settings using pip.default.:extracted_whl_files filegroup target of all the files extracted from the wheel. This can be used in lieu of {obj}whl_filegroup to avoid copying/extracting wheel multiple times to get a subset of their files.gazelle:python_generate_pyi_deps; when true, dependencies added to satisfy type-only imports (if TYPE_CHECKING) and type stub packages are added to pyi_deps instead of deps.gazelle:include_pytest_conftest. When not set (the default) or true, gazelle will inject any conftest.py file found in the same directory as a {obj}py_test target to that {obj}py_test target's deps. This behavior is unchanged from previous versions. When false, the :conftest dep is not added to the {obj}py_test target.gazelle:python_generate_proto; when true, Gazelle generates py_proto_library rules for proto_library. false by default.--bootstrap_impl=system_python is forced. This allows setting --bootstrap_impl=script in bazelrc for mixed-platform environments.compile_pip_requirements now generates a .test target. The _test target is deprecated and will be removed in the next major release. (#2794PyInfo.venv_symlinks replaces PyInfo.site_packages_symlinkspip_parse.--bootstrap_impl=script:compile_pip_requirements now works with itsys._base_executable value will reflect the underlying interpreter, not venv interpreter.//python/runtime_env_toolchains:all toolchain now works with it.--hash parameter. Fixes #2363.whl_library now infers file names from its urls attribute correctly.bazel test, be sure that temporary requirements file remains writable.compile_pip_requirements test rule works behind the proxyreleaselevel and serial for pre-release hermetic toolchains ({gh-issue}2837).execute_unchecked, execute_checked, and execute_checked_stdout now support log_stdout and log_stderr keyword arg booleans. When these are True (the default), the subprocess's stdout/stderr will be logged.RULES_PYTHON_ENABLE_PIPSTAR=1 environment variable to enable it.rules_python target that returns a PyInfo provider..netrc and auth_patterns auth when downloading uv. Work towards #1975.single_version_platform_override() API docs for more information.compile_pip_requirements. Useful when an intermediate dependency needs to be upgraded to pull in security patches.exec configuration toolchain now has the forwarded exec_interpreter now also forwards the ToolchainInfo provider. This is for increased compatibility with the RBE setups where access to the exec configuration interpreter is needed.xcrun xcodebuild --showsdks to find XCode root.3.8.20 versions of the Python 3.8 interpreter who has reached EOL. If users still need other versions of the 3.8 interpreter, please supply the URLs manually {bzl:obj}python.toolchain or {bzl:obj}python_register_toolchains calls.ignore_root_user_error from “ignore” to “warning”. This is now flipped back to ignoring the issue, and will only emit a warning when the attribute is set False.py_binary.srcs and {attr}py_test.srcs is no longer mandatory when main_module is specified (for --bootstrap_impl=script)--bootstrap_impl=script) Follow symlinks when searching for runfiles.chmod when downloading non-windows hermetic toolchain repositories on Windows. Fixes #2660.FAIL via the RULES_PYTHON_REPO_DEBUG_VERBOSITY environment variable.python_version flag. Fixes #2685.PYTHONPATH..pyc and .pyo files are also excluded from the interpreters repository files.PYTHONPATH.requires_file is treated as if it were omitted, resulting in a valid METADATA file.target_compatible_with to all targets they create. PR #2788.METADATA entries when python_full_version is used in the environment marker. Fixes #2319.python_version parameter and transition the requirement locking to the right interpreter version when using {obj}compile_pip_requirements rule. See #2819.sha256 values in the requirements.txt is no longer mandatory when enabling {attr}pip.parse.experimental_index_url feature. This means that rules_python will attempt to fetch metadata for all packages through SimpleAPI unless they are pulled through direct URL references. Fixes #2023. In case you see issues with rules_python being too eager to fetch the SimpleAPI metadata, you can use the newly added {attr}pip.parse.simpleapi_skip to skip metadata fetching for those packages.lock rule that is the replacement for the {obj}compile_pip_requirements. This may still have rough corners so please report issues with it in the #1975. Main highlights - the locking can be done within a build action or outside it, there is no more automatic test target (but it can be added on the user side by using native_test). For customizing the uv version that is used, please check the {obj}uv.configure tag class.PyInfo.site_packages_symlinks field added to allow specifying links to create within the venv site packages (only applicable with {obj}--bootstrap_impl=script) (#2156).$(PYTHON2_ROOTPATH) and $(PYTHON3_ROOTPATH) which are runfiles locations equivalents of $(PYTHON2) and `$(PYTHON3) respectively.py_library.pyi_srcs (.pyi files) in the wheel.py_library.pyi_srcs (.pyi files) in py_package.gazelle_python.yaml) will now include the YAML document start --- line. Implemented in #2656.ppc64le is now pointing to the right target in the platforms package.py_binary targets during partial updates in file generation mode. Fixed in #2619.ignore_root_user_error=True is now the default. Note that running as root may still cause spurious Bazel cache invalidation (#1169).python invocations in repository and module extension evaluation contexts will invoke Python interpreter with -B to avoid creating .pyc files.python.defaults has been added to allow users to set the default python version in the root module by reading the default version number from a file or an environment variable.//python/bin:python: convenience target for directly running an interpreter. {obj}--//python/bin:python_src can be used to specify a binary whose interpreter to use.bzlmod APIs without the need to patch rules_python. The documentation has been added to rules_python docs but usage of the extension may result in your setup breaking without any notice. What is more, the URLs and SHA256 values will be retrieved from the GitHub releases page metadata published by the uv project.LDFLAGS when building wheels from sdist.experimental_index_url (bazel downloader). Partially fixes #2363.RULES_PYTHON_ADDITIONAL_INTERPRETER_ARGS environment variable. Only applicable for {obj}--bootstrap_impl=script.interpreter_args attribute to py_binary and py_test, which allows pass arguments to the interpreter before the regular args.main_module attribute to py_binary and py_test, which allows specifying a module name to run (i.e. python -m <module>).py_proto_library is deprecated in favour of the implementation in https://github.com/protocolbuffers/protobuf. It will be removed in the future release.pip.override will now be ignored instead of raising an error, fixes #2550.RULES_PYTHON_DEPRECATION_WARNINGS env var.pip from 24.3.2 to 24.0.0 and packaging from 24.2 to 24.0.python_zip_file output with --bootstrap_impl=script works again (#2596).python_version attribute for specifying python versions introduced in v1.1.0gazelle_python_manifest now works correctly.--bootstrap_impl=script is fixed (#2572).tag_class does not have a populated doc value. Fixes (#2579).--bootstrap_impl=script: set {obj}--venvs_use_declare_symlink=no to have it not create symlinks at build time (they will be created at runtime instead). (Fixes #2489)pip.parse) From now we will make fewer calls to indexes when fetching the metadata from SimpleAPI. The calls will be done in parallel to each index separately, so the extension evaluation time might slow down if not using {bzl:obj}pip.parse.experimental_index_url_overrides.pip.parse) Only query SimpleAPI for packages that have sha values in the requirements.txt file.python_version attribute is still used to specify the Python version.pip to 24.3.1 and packaging to 24.2.//python/config_settings:transitions.bzl and its py_binary and py_test wrappers are deprecated. Use the regular rules instead.whl_library will now not have env marker information allowing bazel query to work in cases where the whl is available for all of the platforms and the sdist can be built. This fix is for both WORKSPACE and bzlmod setups. Fixes #2450.pip_parse.experimental_requirement_cycles and {bzl:obj}pip_parse.use_hub_alias_dependencies together now works when using WORKSPACE files.whl_library during the repository rule phase change. Fixes #2468.setup.py files by default. To restore this behavior, apply the # gazelle:python_ignore_files setup.py directive.PATH changes. Fixes #2551.include_stub_packages flag to modules_mapping. When set to True, this automatically includes corresponding stub packages for third-party libraries that are present and used (e.g., boto3 → boto3-stubs), improving type-checking support.experimental_index_url usage or the regular pip.parse usage. To select the free-threaded interpreter in the repo phase, please use the documented env variables. Fixes #2386..pyi files) and type-checking only dependencies added. See {obj}py_library.pyi_srcs and py_library.pyi_deps (and the same named attributes for py_binary and py_test).pyi_srcs to include *.pyi files.PyInfo has new fields to aid static analysis tools: {obj}direct_original_sources, {obj}direct_pyi_files, {obj}transitive_original_sources, {obj}transitive_pyi_files.find_requirements in //python:defs.bzl has been removed.Breaking:
//python/config_setting/... and the @platforms package instead.MACOS_NAME and the arch attribute in the PLATFORMS list, please update your code to respect the new values. The values now correspond to the values available in the @platforms// package constraint values.host_platform and interpreter constants are no longer created in the toolchain generated alias .bzl files. If you need to access the host interpreter during the repository_rule evaluation, please use the @python_{version}_host//:python targets created by {bzl:obj}python_register_toolchains and {bzl:obj}python_register_multi_toolchains macros or the {bzl:obj}python bzlmod extension.pip.parse.parse_all_requirements_files attribute has been removed. See notes in the previous versions about what to do.Other changes:
strip_prefix field for zstd archives.pip_parse.extra_hub_aliases now works in WORKSPACE files.--bootstrap_impl=script, a binary-specific (but otherwise empty) virtual env is used to customize sys.path initialization.uname to get the value of the host platform.uv binary for aarch64-apple-darwin. Fixes (2411).--bootstrap_impl=scipt) Using sys.executable will use the same sys.path setup as the calling binary. (2169).compile_pip_requirements no longer fails on Windows when --enable_runfiles is not enabled.compile_pip_requirements now correctly updates files in the source tree on Windows when --windows_enable_symlinks is not enabled.libpython target defined by a repository template. This enables stable ABI builds of Python extensions on Windows (by defining Py_LIMITED_API).py_test and py_binary targets no longer incorrectly remove the first sys.path entry when using {obj}--bootstrap_impl=scriptRULES_PYTHON_GAZELLE_VERBOSE=1.RULES_PYTHON_REPO_TOOLCHAIN_{VERSION}_{OS}_{ARCH} env variable setting. For example, this allows one to use freethreaded python interpreter in the repository_rule to build a wheel from sdist.muslc libc have been added for the latest toolchain versions for each minor Python version. You can control the toolchain selection by using the {bzl:obj}//python/config_settings:py_linux_libc build flag.PyRuntimeInfo.site_init_template and {obj}PyRuntimeInfo.site_init_template for specifying the template to use to initialize the interpreter via venv startup hooks.pypi_install_dependencies macro that has been included in {bzl:obj}py_repositories for a long time.DEFAULT_PYTHON_VERSION from interpreters.bzl file. If you need the version, please use it from the versions.bzl file instead.requirements.txt for the twine dependencies. Please use requirements_linux.txt instead.zstd support and remove attributes for customizing the zstd binary to be used for zstd archives in the {bzl:obj}python_repository repository_rule. This affects the {bzl:obj}python_register_toolchains and {bzl:obj}python_register_multi_toolchains callers in the WORKSPACE.bzlmod spoke repositories have changed as all of the given requirements.txt files are now parsed by default, to temporarily restore the behavior, you can use {bzl:obj}pip.parse.extra_hub_aliases, which will be removed or made noop in the future.@bazel_tools//tools/python:autodetecting_toolchain is being used (#2364).//python/config_settings:py_freethreaded to toggle the selection of the free-threaded toolchains.py_runtime.abi_flags attribute and {obj}PyRuntimeInfo.abi_flags field added.twine publishing rule.--no-build-isolation to allow non-hermetic sdist builds by default. Users wishing to keep this argument and to enforce more hermetic builds can do so by passing the argument in pip.parse#extra_pip_argspip.parse.whl_modifications now normalizes the given whl names and now pyyaml and PyYAML will both work.pip.parse spoke repository naming will be changed in an upcoming release in places where the users specify different package versions per platform in the same hub repository. The naming of the spoke repos is considered an implementation detail and we advise the users to use the hub repository directly and make use of {bzl:obj}pip.parse.extra_hub_aliases feature added in this release.whl_librarys (617).pip.parse.experimental_index_url is set, we need to still pass the extra_pip_args value when building an sdist.experimental_index_url is set by any module or not. To opt into this behavior, set pip.parse.parse_all_requirements_files, which will become the default in future releases leading up to 1.0.0. Fixes #2268. A known issue is that it may break bazel query and in these use cases it is advisable to use cquery or switch to download_only = Truetwine publishing rules have been updated to have a new convention: requirements_darwin.txt, requirements_linux.txt, requirements_windows.txt for each respective OS and one extra file requirements_universal.txt if you prefer a single file. The requirements.txt file may be removed in the future.//python/features.bzl#features.versionpip.parse.extra_hub_aliases can now be used to expose extra targets created by annotations in whl repositories. Fixes #2187.pip.parse now supports whl-only setup using download_only = True where users can specify multiple requirements files and use the pip backend to do the downloading. This was only available for users setting {bzl:obj}pip.parse.experimental_index_url, but now users have more options whilst we continue to work on stabilizing the experimental feature.config_setting values for all available toolchains instead of only the registered toolchains, which restores the previous behaviour that bzlmod users would have observed.--incompatible_python_disallow_native_rules no longer causes rules_python rules to fail (#2326).py_library no longer puts its source files or generated pyc files in runfiles; it's the responsibility of consumers (e.g. binaries) to populate runfiles with the necessary files. Adding source files to runfiles can be temporarily restored by setting {obj}--add_srcs_to_runfiles=enabled, but this flag will be removed in a subsequent releases.PyInfo.transitive_sources is now added to runfiles. These files are .py files that are required to be added to runfiles by downstream binaries (or equivalent).py_runtime.implementation_name now defaults to cpython (previously it defaulted to None).--@rules_python//python/config_settings:exec_tools_toolchain=disabled.python.override(minor_mapping) now merges the default and the overridden versions ensuring that the resultant minor_mapping will always have all of the python versions.--python_version flag will now be always set to the default python toolchain version value.pip.parse.extra_pip_args all the way to whl_library. What is more we will pass the extra_pip_args to whl_library for sdist distributions when using {attr}pip.parse.experimental_index_url. See #2239.RECORD fileRECORD file entry elements are now quoted if necessary when a wheel is created--hash=sha256:... flagscompile_pip_requirements passes env to the X.update target (and not only to the X_test target, a bug introduced in #1067).python_register_toolchains(register_toolchains=True) is respected (#1675).pyc_collection attribute now correctly enables (or disables) using pyc files from targets transitivelypip.override's file (#2294).rules_shell dev dependency and moved a sh_test target outside of the //:BUILD.bazel file. Fixes #2299.compress = (True|False) to allow disabling compression to speed up development.//python/config_settings:python_version_major_minor has been exposed for users to be able to match on the X.Y version of a Python interpreter.merge_py_infos() so user rules can merge and propagate PyInfo without losing information.3.8 -> 3.8.203.9 -> 3.9.203.10 -> 3.10.153.11 -> 3.11.103.12 -> 3.12.7coverage.py to 7.6.1.download_only flag to disable usage of sdists when {bzl:attr}pip.parse.experimental_index_url is set.PyInfo.transitive_implicit_pyc_files, {obj}PyInfo.transitive_implicit_pyc_source_files.--precompile_add_to_runfiles has been removed.--pyc_collection has been removed. The pyc_collection attribute now bases its default on {obj}--precompile.precompile=if_generated_source value has been removed.precompile_source_retention=omit_if_generated_source value has been removed.--python_version flag now also returns {obj}config_common.FeatureFlagInfo.patch_strip attribute that one should use when patching toolchains. Please set it if you are patching python interpreter. In the next release the default will be set to 0 which better reflects the defaults used in public bazel APIs.py_runtime.interpreter_version_info isn't specified, the {obj}--python_version flag will determine the value. This allows specifying the build-time Python version for the {obj}runtime_env_toolchains.py_cc_toolchain.libs and {obj}PyCcToolchainInfo.libs is optional. This is to support situations where only the Python headers are available.7.1.--no-index and add --no-build-isolation to the pip install command when installing a wheel from a local file, which happens when experimental_index_url flag is used.t.Fatal/t.Fatalf in tests.RUNFILES_MANIFEST_FILE-based invocations work when used with {obj}--bootstrap_impl=script. This fixes invocations using non-sandboxed test execution with --enable_runfiles=false --build_runfile_manifests=true. (#2186).Required-Dist when specifying requirements with markers in extra_requires in py_wheel rule.--bootstrap_impl=scriptgen_python_config_settings has been fixed to include the flag_values from the platform definitions.python.override, {bzl:obj}python.single_version_override and {bzl:obj}python.single_version_platform_override tag classes. See #2081.PyExecutableInfo, which contains executable-specific information useful for packaging an executable or or deriving a new one from the original.python_register_toolchains and related symbols.python_repository.patch_strip attribute for allowing values that are other than 1, which has been hard-coded up until now. If you are relying on the undocumented patches support in TOOL_VERSIONS for registering patched toolchains please consider setting the patch_strip explicitly to 1 if you depend on this value - in the future the value may change to default to 0.//python:none, a special target for use with {obj}py_exec_tools_toolchain.exec_interpreter to treat the value as None.http_archive symbol from python/repositories.bzl.download_only feature to aid debugging.3.8.19, 3.9.19, 3.10.14, 3.11.93.12 -> 3.12.4PYTHONSAFEPATH is inherited from the calling environment to allow disabling it (Requires {obj}--bootstrap_impl=script) (#2060).compile_pip_requirements now sets the USERPROFILE env variable on Windows to work around an issue where setuptools fails to locate the user's home directory.@rules_python//python/cc:current_py_cc_libs in host platform builds on macOS, by editing the LC_ID_DYLIB field of the hermetic interpreter‘s libpython3.x.dylib using install_name_tool, setting it to its absolute path under Bazel’s execroot.--bootstrap_impl=script (for non-zip builds). (#2043)--build_python_zip is set to false on Windows. See #1840.--build_python_zip + {obj}--bootstrap_impl=script (#2030).--bootstrap_impl=script. (#2064).@_builtins and @rules_python providers instead of only one. (#2114).//python/runtime_env_toolchains interpreter script so that it is runnable. (#2085).sdist downloaded by the bazel downloader when using experimental_index_url feature. Fixes #2091.gazelle_python_manifest.update manual to avoid unnecessary network behavior.python extension will no longer cause warnings by default. In order to see the warnings for diagnostic purposes set the env var RULES_PYTHON_REPO_DEBUG_VERBOSITY to one of INFO, DEBUG or TRACE. Fixes #1818.compile_pip_requirements supports multiple requirements input files as srcs.PYTHONSAFEPATH is inherited from the calling environment to allow disabling it (Requires {obj}--bootstrap_impl=script) (#2060).python_generation_mode_per_package_require_test_entry_point in order to better accommodate users who use a custom macro, pytest-bazel, rules_python_pytest or rules_py py_test_main in order to integrate with pytest. Currently the default flag value is set to true for backwards compatible behaviour, but in the future the flag will be flipped be false by default.3.12.4 using the 20240726 release.protobuf/com_google_protobuf dependency bumped to v24.4//python:autodetecting_toolchain) is deprecated. It is replaced by {obj}//python/runtime_env_toolchains:all. The old target will be removed in a future release.experimental_index_url the all_requirements, all_whl_requirements and all_data_requirements will now only include common packages that are available on all target platforms. This is to ensure that packages that are only present for some platforms are pulled only via the deps of the materialized py_library. If you would like to include platform specific packages, using a select statement with references to the specific package will still work (e.g.my_attr = all_requirements + select(
{
"@platforms//os:linux": ["@pypi//foo_available_only_on_linux"],
"//conditions:default": [],
}
)
all_requirements now use the same form as targets returned by the requirement macro.PyRuntimeInfo doesn't require passing the interpreter_version_info arg.isolated, quiet and timeout values to whl_library and drop the defaults from the lock file.experimental_target_platforms. Fixes #1996.//python/runtime_env_toolchains:all, which is a drop-in replacement for the “autodetecting” toolchain.python_label_convention and python_label_normalization directives. These directive allows altering default Gazelle label format to third-party dependencies useful for re-using Gazelle plugin with other rules, including rules_pycross. See #1939.entrypoint macro that was replaced by py_console_script_binary in 0.26.0.exec_tools_toolchain_type is disabled by default. To enable it, set {obj}--//python/config_settings:exec_tools_toolchain=enabled. This toolchain must be enabled for precompilation to work. This toolchain will be enabled by default in a future release. Fixes #1967.--build_python_zip argument. Fixes #1954.pip_install dependencies to pick up a new version of pip.py_binary, py_test, and py_library now depend on the //python:exec_tools_toolchain_type for build tools.bazel_skylib to 1.6.1.python and internal rules_python extensions have been marked as reproducible and will not include any lock file entries from now on.pypi/stdlib-list for standard library module verification.experimental_index_url. This is to mimic what uv is doing. We will print a warning instead.experimental_index_url to allowing to correctly fetch the wheels for the right platform. See the updated docs on how to use the feature. This is work towards addressing #735 and #260. The spoke repository names when using this flag will have a structure of {pip_hub_prefix}_{wheel_name}_{py_tag}_{abi_tag}_{platform_tag}_{sha256}, which is an implementation detail which should not be relied on and is there purely for better debugging experience.pythons_hub//:interpreters.bzl no longer has platform-specific labels which where left there for compatibility reasons. Move to python_{version}_host keys if you would like to have access to a Python interpreter that can be used in a repository rule context.visibility from NonEmptyAttr. Now empty(have no deps/main/srcs/imports attr) py_library/test/binary rules will be automatically deleted correctly. For example, if python_generation_mode is set to package, when __init__.py is deleted, the py_library generated for this package before will be deleted automatically.experimental_target_platforms includes the Python ABI. The default python version case within the select is also now handled correctly, stabilizing the implementation.pip.parse(annotations) attribute as it is unused and has been replaced by whl_modifications.experimental_index_url is not used by any of the modules in the dependency chain. To make the lock file identical on each os and arch, please use the experimental_index_url feature which will fetch metadata from PyPI or a different private index and write the contents to the lock file. Fixes #1643.yanked packages and print a warning instead of ignoring them. This better matches the behaviour of uv pip install.//python/config_settings:python_version flag setting.WORKSPACE requirement vendoring example. Fixes #1918.@rules_python//python/config_settings:precompile=enabled to enable it by default. A subsequent release will enable it by default. See the Precompiling docs and API reference docs for more information on precompiling. Note this requires Bazel 7+ and the Pystar rule implementation enabled. (#1761)precompile, precompile_optimize_level, precompile_source_retention, precompile_invalidation_mode, and pyc_collection//python:toolchain_type) has two new optional attributes: pyc_tag (tells the pyc filename infix to use) and implementation_name (tells the Python implementation name).//python:exec_tools_toolchain_type.PyInfo has two new attributes: direct_pyc_files and transitive_pyc_files, which tell the pyc files a target makes available directly and transitively, respectively.//python:features.bzl added to allow easy feature-detection in the future.requirements_* files together with extra_pip_args = ["--platform=manylinux_2_4_x86_64"], that was an invalid usage previously but we were not failing the build. From now on this is explicitly disallowed.python_visibility directive now supports the $python_root$ placeholder, just like the python_default_visibility directive does.--@rules_python//python/config_settings:bootstrap_impl=script. It will become the default in a subsequent release. (#691)PyRuntimeInfo has two new attributes: {obj}PyRuntimeInfo.stage2_bootstrap_template and {obj}PyRuntimeInfo.zip_main_template.//python:autodetecting_toolchain alias now uses it.musl or glibc, whether universal2 or arch-specific MacOS wheels are preferred and it also allows to select a particular libc version. All of this is done via the string_flags in @rules_python//python/config_settings. If there are no wheels that are supported for the target platform, rules_python will fallback onto building the sdist from source. This behaviour can be disabled if desired using one of the available string flags as well.whl_filegroup rule to extract files from a wheel file. This is useful to extract headers for use in a cc_library.MODULE.bazel.lock whl_library rule attributes are now sorted in the attributes section. We are also removing values that are not default in order to reduce the size of the lock file.coverage.py to 7.4.3.bazel_features to 1.9.1 to detect optional support non-blocking downloads.pip_tools to >= 7.4.03.8.18, 3.9.18 and 3.10.133.8 -> 3.8.193.9 -> 3.9.193.10 -> 3.10.143.11 -> 3.11.93.12 -> 3.12.3project or package generation modes, do not generate py_test rules when there are no test files and do not set main = "__test__.py" when that file doesn't exist.py_library graph. Fixes #1760.pip.parse extension is now possible, see the examples/pip_parse/MODULE.bazel for how to do it. See #1371.isort and black checks (see #1674).3.11.8, 3.12.2 using the 20240224 release.3.8.19, 3.9.19, 3.10.14, 3.11.9, 3.12.3 using the 20240415 release.python_visibility directive to control visibility of generated targets by appending additional visibility labels.python_default_visibility directive to control the default visibility of generated targets. See the docs for details.python_test_file_pattern directive. This directive tells gazelle which python files should be mapped to the py_test rule. See the original issue and the docs for details.data_files attributes in py_wheel rule (#1777)bzlmod installations now provide a twine setup for the default Python toolchain in rules_python for version 3.11.experimental_index_url, experimental_extra_index_urls and experimental_index_url_overrides to pip.parse for using the bazel downloader. If you see any issues, report in #1357. The URLs for the whl and sdist files will be written to the lock file. Controlling whether the downloading of metadata is done in parallel can be done using parallel_download attribute.include_dep. Also add documentation for annotations to gazelle/README.md.rules_python depends now on rules_cc 0.0.9use_hub_alias_dependencies has been added that is going to become default in the next release. This makes use of dep_template flag in the whl_library rule. This also affects the experimental_requirement_cycles feature where the dependencies that are in a group would be only accessible via the hub repo aliases. If you still depend on legacy labels instead of the hub repo aliases and you use the experimental_requirement_cycles, now is a good time to migrate.PyInfo is not the same as what is loaded from rules_python. The same is true of PyRuntimeInfo.(toolchains) Windows hosts always ignore pyc files in the downloaded runtimes. This fixes issues due to pyc files being created at runtime and affecting the definition of what files were considered part of the runtime.
(pip_parse) Added the envsubst parameter, which enables environment variable substitutions in the extra_pip_args attribute.
(pip_repository) Added the envsubst parameter, which enables environment variable substitutions in the extra_pip_args attribute.
(bzlmod) pip.parse now does not fail with an empty requirements.txt.
(py_wheel) Wheels generated by py_wheel now preserve executable bits when being extracted by installer and/or pip.
(coverage) During the running of lcov, the stdout/stderr was causing test failures. By default, suppress output when generating lcov. This can be overridden by setting ‘VERBOSE_COVERAGE’. This change only affect bazel 7.x.x and above.
(toolchain) Changed the host_toolchain to symlink all files to support Windows host environments without symlink support.
(PyRuntimeInfo) Switch back to builtin PyRuntimeInfo for Bazel 6.4 and when pystar is disabled. This fixes an error about target ... does not have ... PyRuntimeInfo. (#1732)
(py_wheel) Added requires_file and extra_requires_files attributes.
(whl_library) experimental_target_platforms now supports specifying the Python version explicitly and the output BUILD.bazel file will be correct irrespective of the python interpreter that is generating the file and extracting the whl distribution. Multiple python target version can be specified and the code generation will generate version specific dependency closures but that is not yet ready to be used and may break the build if the default python version is not selected using common --@rules_python//python/config_settings:python_version=X.Y.Z.
New Python versions available: 3.11.7, 3.12.1 using https://github.com/indygreg/python-build-standalone/releases/tag/20240107.
(toolchain) Allow setting x.y as the python_version parameter in the version-aware py_binary and py_test rules. This allows users to use the same rule import for testing with specific Python versions and rely on toolchain configuration and how the latest version takes precedence if e.g. 3.8 is selected. That also simplifies .bazelrc for any users that set the default python_version string flag in that way.
(toolchain) The runtime's shared libraries (libpython.so et al) can be accessed using @rules_python//python/cc:current_py_cc_libs. This uses toolchain resolution, so the files are from the same runtime used to run a target. If you were previously using e.g. @python_3_11//:libpython, then switch to :current_py_cc_libs for looser coupling to the underlying runtime repo implementation.
(repo rules) The environment variable RULES_PYTHON_REPO_DEBUG=1 can be set to make repository rules log detailed information about what they're up to.
(coverage) Add support for python 3.12 and bump coverage.py to 7.4.1.
incompatible_generate_aliases feature flags from pip_parse and gazelle got removed. They had been flipped to True in 0.27.0 release.incompatible_normalize_name and incompatible_normalize_version flags have been removed. They had been flipped to True in 0.27.0 release.X.Y python version notation. This improves cross module interoperability and allows to share wheels built by interpreters using different patch versions.(bzlmod pip.parse) Use a platform-independent reference to the interpreter pip uses. This reduces (but doesn't eliminate) the amount of platform-specific content in MODULE.bazel.lock files; Follow #1643 for removing platform-specific content in MODULE.bazel.lock files.
(wheel) The stamp variables inside the distribution name are no longer lower-cased when normalizing under PEP440 conventions.
(toolchains) python_register_toolchains now also generates a repository that is suffixed with _host, that has a single label :python that is a symlink to the python interpreter for the host platform. The intended use is mainly in repository_rule, which are always run using host platform Python. This means that WORKSPACE users can now copy the requirements.bzl file for vendoring as seen in the updated pip_parse_vendored example.
(runfiles) rules_python.python.runfiles.Runfiles now has a static Create method to make imports more ergonomic. Users should only need to import the Runfiles object to locate runfiles.
(toolchains) PyRuntimeInfo now includes a interpreter_version_info field that contains the static version information for the given interpreter. This can be set via py_runtime when registering an interpreter toolchain, and will done automatically for the builtin interpreter versions registered via python_register_toolchains. Note that this only available on the Starlark implementation of the provider.
(config_settings) Added //python/config_settings:is_python_X.Y config settings to match on minor Python version. These settings match any X.Y version instead of just an exact X.Y.Z version.
BREAKING (pip_install) the deprecated pip_install macro and related items have been removed.
BREAKING Support for Bazel 5 has been officially dropped. This release was only partially tested with Bazel 5 and may or may not work with Bazel 5. Subequent versions will no longer be tested under Bazel 5.
(runfiles) rules_python.python.runfiles now directly implements type hints and drops support for python2 as a result.
(toolchains) py_runtime, py_runtime_pair, and PyRuntimeInfo now use the rules_python Starlark implementation, not the one built into Bazel. NOTE: This only applies to Bazel 6+; Bazel 5 still uses the builtin implementation.
(pip_parse) The parameter experimental_requirement_cycles may be provided a map of names to lists of requirements which form a dependency cycle. pip_parse will break the cycle for you transparently. This behavior is also available under bzlmod as pip.parse(experimental_requirement_cycles={}).
(toolchains) py_runtime can now take an executable target. Note: runfiles from the target are not supported yet. (#1612)
(gazelle) When python_generation_mode is set to file, create one py_binary target for each file with if __name__ == "__main__" instead of just one py_binary for the whole module.
(gazelle) the Gazelle manifest integrity field is now optional. If the requirements argument to gazelle_python_manifest is unset, no integrity field will be generated.
(gazelle) The gazelle plugin helper was not working with Python toolchains 3.11 and above due to a bug in the helper components not being on PYTHONPATH.
(pip_parse) The repositories created by whl_library can now parse the whl METADATA and generate dependency closures irrespective of the host platform the generation is executed on. This can be turned on by supplying experimental_target_platforms = ["all"] to the pip_parse or the bzlmod equivalent. This may help in cases where fetching wheels for a different platform using download_only = True feature.
(bzlmod pip.parse) The pip.parse(python_interpreter) arg now works for specifying a local system interpreter.
(bzlmod pip.parse) Requirements files with duplicate entries for the same package (e.g. one for the package, one for an extra) now work.
(bzlmod python.toolchain) Submodules can now (re)register the Python version that rules_python has set as the default. (#1638)
(whl_library) Actually use the provided patches to patch the whl_library. On Windows the patching may result in files with CRLF line endings, as a result the RECORD file consistency requirement is lifted and now a warning is emitted instead with a location to the patch that could be used to silence the warning. Copy the patch to your workspace and add it to the list if patches for the wheel file if you decide to do so.
(coverage): coverage reports are now created when the version-aware rules are used. (#1600)
(toolchains) Workspace builds register the py cc toolchain (bzlmod already was). This makes e.g. //python/cc:current_py_cc_headers Just Work. (#1669)
(bzlmod python.toolchain) The value of ignore_root_user_error is now decided by the root module only. (#1658)
file generation mode can now also add __init__.py to the srcs attribute for every target in the package. This is enabled through a separate directive python_generation_mode_per_file_include_init.Make //python/pip_install:pip_repository_bzl bzl_library target internal as all of the publicly available symbols (etc. package_annotation) are re-exported via //python:pip_bzl bzl_library.
(gazelle) Gazelle Python extension no longer has runtime dependencies. Using GAZELLE_PYTHON_RUNTIME_DEPS from @rules_python_gazelle_plugin//:def.bzl is no longer necessary.
(pip_parse) The installation of pip_parse repository rule toolchain dependencies is now done as part of py_repositories call.
(pip_parse) The generated requirements.bzl file now has an additional symbol all_whl_requirements_by_package which provides a map from the normalized PyPI package name to the target that provides the built wheel file. Use pip_utils.normalize_name function from @rules_python//python:pip.bzl to convert a PyPI package name to a key in the all_whl_requirements_by_package map.
(pip_parse) The flag incompatible_generate_aliases has been flipped to True by default on non-bzlmod setups allowing users to use the same label strings during the transition period. For example, instead of @pypi_foo//:pkg, you can now use @pypi//foo or @pypi//foo:pkg. Other labels that are present in the foo package are dist_info, whl and data. Note, that the @pypi_foo//:pkg labels are still present for backwards compatibility.
(gazelle) The flag use_pip_repository_aliases is now set to True by default, which will cause gazelle to change third-party dependency labels from @pip_foo//:pkg to @pip//foo by default.
The compile_pip_requirements now defaults to pyproject.toml if the src or requirements_in attributes are unspecified, matching the upstream pip-compile behaviour more closely.
(gazelle) Use relative paths if possible for dependencies added through the use of the resolve directive.
(gazelle) When using python_generation_mode file, one py_test target is made per test file even if a target named __test__ or a file named __test__.py exists in the same package. Previously in these cases there would only be one test target made.
Breaking changes:
(pip) pip_install repository rule in this release has been disabled and will fail by default. The API symbol is going to be removed in the next version, please migrate to pip_parse as a replacement. The pip_parse rule no longer supports requirements attribute, please use requirements_lock instead.
(py_wheel) switch incompatible_normalize_name and incompatible_normalize_version to True by default to enforce PEP440 for wheel names built by rules_python.
(tools/wheelmaker.py) drop support for Python 2 as only Python 3 is tested.
Skip aliases for unloaded toolchains. Some Python versions that don't have full platform support, and referencing their undefined repositories can break operations like bazel query rdeps(...).
Python code generated from proto_library with strip_import_prefix can be imported now.
(py_wheel) Produce deterministic wheel files and make RECORD file entries follow the order of files written to the .whl archive.
(gazelle) Generate a single py_test target when gazelle:python_generation_mode project is used.
(gazelle) Move waiting for the Python interpreter process to exit to the shutdown hook to make the usage of the exec.Command more idiomatic.
(toolchains) Keep tcl subdirectory in Windows build of hermetic interpreter.
(bzlmod) sub-modules now don't have the //conditions:default clause in the hub repos created by pip.parse. This should fix confusing error messages in case there is a misconfiguration of toolchains or a bug in rules_python.
(bzlmod) Added .whl patching support via patches and patch_strip arguments to the new pip.override tag class.
(pip) Support for using PEP621 compliant pyproject.toml for creating a resolved requirements.txt file.
(utils) Added a pip_utils struct with a normalize_name function to allow users to find out how rules_python would normalize a PyPI distribution name.
Python version patch level bumps:
(deps) Upgrade rules_go 0.39.1 -> 0.41.0; this is so gazelle integration works with upcoming Bazel versions
(multi-version) The distribs attribute is no longer propagated. This attribute has been long deprecated by Bazel and shouldn't be used.
Calling //python:repositories.bzl#py_repositories() is required. It has always been documented as necessary, but it was possible to omit it in certain cases. An error about @rules_python_internal means the py_repositories() call is missing in WORKSPACE.
(bzlmod) The pip.parse extension will generate os/arch specific lock file entries on bazel>=6.4.
(bzlmod, entry_point) Added {obj}py_console_script_binary, which allows adding custom dependencies to a package's entry points and customizing the py_binary rule used to build it.
New Python versions available: 3.8.17, 3.11.5 using https://github.com/indygreg/python-build-standalone/releases/tag/20230826.
(gazelle) New # gazelle:python_generation_mode file directive to support generating one py_library per file.
(python_repository) Support netrc and auth_patterns attributes to enable authentication against private HTTP hosts serving Python toolchain binaries.
//python:packaging_bzl added, a bzl_library for the Starlark files //python:packaging.bzl requires.
(py_wheel) Added the incompatible_normalize_name feature flag to normalize the package distribution name according to latest Python packaging standards. Defaults to False for the time being.
(py_wheel) Added the incompatible_normalize_version feature flag to normalize the package version according to PEP440 standard. This also adds support for local version specifiers (versions with a + in them), in accordance with PEP440. Defaults to False for the time being.
New Python versions available: 3.8.18, 3.9.18, 3.10.13, 3.11.6, 3.12.0 using https://github.com/indygreg/python-build-standalone/releases/tag/20231002. 3.12.0 support is considered beta and may have issues.
(bzlmod) The entry_point macro is no longer supported and has been removed in favour of the py_console_script_binary macro for bzlmod users.
(bzlmod) The pip.parse no longer generates {hub_name}_{py_version} hub repos as the entry_point macro has been superseded by py_console_script_binary.
(bzlmod) The pip.parse no longer generates {hub_name}_{distribution} hub repos.
(whl_library) No longer restarts repository rule when fetching external dependencies improving initial build times involving external dependency fetching.
(gazelle) Improve runfiles lookup hermeticity.
pip.parse can no longer automatically use the default Python version; this was an unreliable and unsafe behavior. The python_version arg must always be explicitly specified.main arg is now correctly computed and usually optional.pip.parse no longer requires a call for whatever the configured default Python version is.@python_aliases renamed to `@python_versionspip.parse arg name renamed to hub_namepip.parse arg incompatible_generate_aliases removed and always true.pip.parse can be called multiple times with different Python versionspip.parse to reference the default python toolchain and interpreterwhl_modsDescription-Content-Type and Summary in METADATAProject-URLgenerate_hashes arg (default True) to control generating hashes