rules_python Changelog
This is a human-friendly changelog in a keepachangelog.com style format.Because this changelog is for end-user consumption of meaningful changes, onlya summary of a release’s changes is described. This means every commit is notnecessarily mentioned, and internal refactors or code cleanups are omittedunless they’re particularly notable.
A brief description of the categories of changes:
Changed: Some behavior changed. If the change is expected to break apublic API or supported behavior, it will be marked asBREAKING. Note thatbeta 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 compatiblemanner.Particular sub-systems are identified using parentheses, e.g.
(bzlmod)or(docs).
Unreleased
Removed
(toolchain) Remove all of the python 3.8 toolchain support out of the box. Users needto pass the
TOOL_VERSIONSthat include 3.8 toolchains or use thebzlmodAPIs to addthem back. This means any hubpip.parsecalls that target3.8will be ignored fromnow on. (#2704)(toolchain) Remove all of the python 3.9 toolchain versions except for the
3.9.25.This version has reached EOL and will no longer receive any security fixes, please update to3.10or above. (#2704)(toolchain)
ignore_root_user_errorhas now been flipped to be always enabled andthechmodof the python toolchain directories have been removed. From now onrules_pythonalways adds thepycfiles to the glob excludes and in order to avoid any problems when usingthe toolchains in the repository phase, ensure that you pass-Bto the python interpreter.(#2016)
Changed
Fixed
(gazelle) Remove
py_binarytargets with invalidsrcs. This includes filesthat are not generated or regular files.(runfiles) Fix incorrect Python runfiles path assumption - the existingimplementation assumes that it is always four levels below the runfilesdirectory, leading to incorrect path checks(#3085).
(toolchains) local toolchains now tell the
sys.abiflagsvalue of theunderlying runtime.(toolchains) various local toolchain fixes: add abi3 header targets,fixes to linking, Windows DLL detection, and defines for free threadedruntimes.
(toolchains) The
python_headerstarget is now compatible withlayering_check.(performance) 90% reduction in py_binary/py_test analysis phase cost.(#3381).
(gazelle) Fix
gazelle_python_manifest.testso that it accesses manifest files viarunfilepath handling rather than directly (#3397).(core rules) For the system_python bootstrap, the runfiles root is added tosys.path.
Added
(toolchains)
3.9.25Python toolchain from20251031 release.
1.7.0 - 2025-10-11
Removed
(core rules) Support for Bazel’s long deprecated “extra actions” has beenremoved(#3215).
Changed
(deps) bumped rules_cc dependency to
0.1.5.(bootstrap) For
--bootstrap_impl=system_python,PYTHONPATHis nolonger used to add import paths. The sys.path order has changed from[apppaths,stdlib,runtimesite-packages]to[stdlib,apppaths,runtimesite-packages].(bootstrap) For
--bootstrap_impl=system_python, the sys.path order haschanged from[apppaths,stdlib,runtimesite-packages]to[stdlib,apppaths,runtimesite-packages].(pip) Publishing deps are no longer pulled via
experimental_index_url.(#2937).(toolchains)
py_runtimeandPyRuntimeInforeject Python 2 settings.Settingpy_runtime.python_version="PY2"or non-NonePyRuntimeInfo.py2_runtimeis an error.(pypi)
pipstarflag has been implemented forWORKSPACEand can be flipped to be enabled usingRULES_PYTHON_ENABLE_PIPSTAR=1environment variable. If you do, pleaseadd a comment to#2949 if you run into anyproblems.With this release we are deprecatingpip.parse.experimental_target_platformsandpip_repository.experimental_target_platforms. For users usingWORKSPACEandvendoring therequirements.bzlfile, please re-vendor so that downstream is unaffectedwhen the APIs get removed. If you need to customize the way the dependencies getevaluated, seeour docs on customizingRequires-Distresolution.(toolchains) Added Python versions 3.15.0a1, 3.14.0, 3.13.9, 3.12.12, 3.11.14, 3.10.19, and 3.9.24from the20251014 release.
(deps) (bzlmod) Upgraded to
bazel-skylibversion1.8.2
Fixed
(rules) The
PyInfoconstructor was setting the wrong value forhas_py3_only_sources- this is now fixed.(bootstrap) The stage1 bootstrap script now correctly handles nested
RUNFILES_DIRenvironments, fixing issues where apy_binarycalls anotherpy_binary(#3187).(bootstrap) For Windows, having many dependencies no longer results in maxlength errors due to too long environment variables.
(bootstrap)
--bootstrap_impl=scriptnow supports the-Sinterpretersetting.(venvs)
--venvs_site_packages=yesno longer errors when packages withoverlapping files or directories are used together.(#3204).(venvs)
--venvs_site_packages=yesworks for packages that dynamicallylink to shared libraries(#3228).(venvs)
--venvs_site_packages=yesincludespthfiles at the root of thesite-packages folder(#3339).(uv)
//python/uv:lock.bzl%locknow works with a local platformruntime.(pypi)
linux_riscv64is added to the platforms list in_pip_repository_impl,which fixesa build issue for tensorflow on riscv64.(toolchains) WORKSPACE builds now correctly register musl and freethreadedvariants. Setting
--py_linux_libc=musland--py_freethreaded=yesnowactivate them, respectively.(#3262).(rules)
py_console_script_binaryis now compatible with symbolic macros(#3195).
Added
(runfiles) The Python runfiles library now supports Bazel’s
--incompatible_compact_repo_mapping_manifestflag.(bootstrap)
--bootstrap_impl=system_pythonnow supports themain_moduleattribute.(bootstrap)
--bootstrap_impl=system_pythonnow supports theRULES_PYTHON_ADDITIONAL_INTERPRETER_ARGSenvironment variable.(rules) The
py_binary,py_test, andpy_wheelrules now have aconfig_settingsattribute to control build flags within the build graph.Custom settings can be added usingconfig.add_transition_settinginMODULE.bazelfiles, orpy_repositories(transition_settings=...)inWORKSPACEfiles. See theHow to use a common set of dependencies with multiple PyPI versions guide on using commondependencies with multiple PyPI versions` for an example.(toolchains) Stable ABI headers support added. To use, depend on
//python/cc:current_py_cc_headers_abi3. This allows Windows buildsa way to depend on headers without the potentially Python unstable ABIobjects from the regular//python/cc:current_py_cc_headerstargetbeing included.Adds
//python/cc:current_py_cc_headers_abi3,py_cc_toolchain.headers_abi3, andPyCcToolchainInfo.headers_abi3.//python:features.bzl%features.headers_abi3can be used tofeature-detect the presense of the above.
(toolchains) Local toolchains can use a label for the interpreter to use.
(pypi) Support for environment marker handling and
experimental_index_urlhandling forWindows ARM64 for Python 3.11 and later(#2276).
1.6.3 - 2025-09-21
Fixed
(pypi) We now use the Minimal Version Selection (MVS) algorithm to selectthe right wheel when there are multiple wheels for the target platform(e.g.
musllinux_1_1_x86_64andmusllinux_1_2_x86_64). If the userwants to set the minimum version for the selection algorithm, use thepip.defaults.whl_platform_tagsattribute to configure that. Ifmusllinux_*_x86_64is specified, we will choose the lowest availablewheel version. Fixes#3250.
1.6.0 - 2025-08-23
Changed
(gazelle) update minimum gazelle version to 0.36.0 - may cause BUILD file changes
(gazelle) update minimum rules_go version to 0.55.1
(gazelle) remove custom go-tree-sitter module BUILD file
(gazelle) For package mode, resolve dependencies when imports are relativeto the package path. This is enabled via the
#gazelle:python_experimental_allow_relative_importstrue directive (#2203 issue).(gazelle) Types for exposed members of
python.ParserOutputare now all public.(gazelle) Removed the requirement for
__init__.py,__main__.py, or__test__.pyfiles to bepresent in a directory to generate aBUILD.bazelfile.(toolchain) Updated the following toolchains to build20250808 to patch CVE-2025-47273:
3.9.23
3.10.18
3.11.13
3.12.11
3.14.0rc1
(toolchain) Python 3.13 now references 3.13.6
(gazelle) Switched back to smacker/go-tree-sitter, fixing#2630
(pypi) From now on the list of default platforms only includes
linux_x86_64,linux_aarch64,osx_x86_64,osx_aarch64andwindows_x86_64. If you are on other platforms, you need touse thepip.defaultto configure it yourself. If you are interested in graduating theplatform, consider helping set us up CI for them and update the documentation.(ci) We are now testing on Ubuntu 22.04 for RBE and non-RBE configurations.
(core)
#!/usr/bin/envbashis now used as a shebang in the stage1 bootstrap template.(gazelle:docs) The Gazelle docs have been migrated fromgazelle/README.md togazelle/docs and are now available on the primary documentation siteat https://rules-python.readthedocs.io/en/latest/gazelle/docs/index.html
Fixed
(toolchains)
local_runtime_reponow respects changes to theDEVELOPER_DIRandXCODE_VERSIONrepo env vars, fixing stale cache issues on macOS with system (i.e. Xcode-supplied) Python(#3123).(pypi) Fixes an issue where builds using a
bazelvendorvendor directorywould fail if the constraints file contained environment markers. Fixes#2996.(pypi) Wheels with BUILD.bazel (or other special Bazel files) no longerresult in missing files at runtime(#2782).
(runfiles) The pypi runfiles package now includes
py.typedto indicate itsupports type checking(#2503).(pypi) The pipstar
defaultsconfiguration now supports any custom platformname.(pypi) The selection of the whls has been changed and should no longer resultin ambiguous select matches (#2759 issue) and should be much more efficientwhen running
bazelquerydue to fewer repositories being included(#2849 issue).Multi-line python imports (e.g. with escaped newlines) are now correctly processed by Gazelle.
(toolchains)
local_runtime_repoworks with multiarch Debian with Python 3.8(#3099).(pypi) Expose pypi packages only common to all Python versions in
all_requirements(#2921).(repl) Normalize the path for the
REPLstub to make it possible to use thedefault stub template from outsiderules_python(#3101 issue).(gazelle) Fixes gazelle adding sibling module dependencies to resolveabsolute imports (Python 2’s behavior without
absolute_import). Previousbehavior can be restored using the directive#gazelle:python_resolve_sibling_importstrue(pypi) Show overridden index URL of packages when downloading metadata have failed.(#2985).
(toolchains) use “command -v” to find interpreter in
$PATH(#3150).(pypi)
bazelvendornow works inbzlmod(#3079 issue).(toolchains)
local_runtime_reponow works on Windows(#3055).(toolchains)
local_runtime_reposupports more types of Pythoninstallations (Mac frameworks, missing dynamic libraries, and otheresoteric cases, see#3148 for details).(pypi) Support
requirements.txtfiles that use different versions of the samepackage targeting different target platforms.(#2797).(py_wheel) Add directories in deterministic order.
Added
(repl) Default stub now has tab completion, where
readlinesupport is available,see (#3114).(#3114).(pypi) To configure the environment for
requirements.txtevaluation, use the newly addeddeveloper preview of thepip.defaulttag class. Onlyrules_pythonand root modules can usethis feature. You can also configure customconfig_settingsusingpip.default. Itcan also be used to set the globalnetrcorauth_patternsvariables.(pypi) PyPI dependencies now expose an
:extracted_whl_filesfilegroup targetof all the files extracted from the wheel. This can be used in lieu ofwhl_filegroupto avoid copying/extracting wheel multiple times toget a subset of their files.(gazelle) New directive
gazelle:python_generate_pyi_deps; whentrue,dependencies added to satisfy type-only imports (ifTYPE_CHECKING) and typestub packages are added topyi_depsinstead ofdeps.(toolchain) Add toolchains for aarch64 windows for
3.11.13
3.12.11
3.13.6
3.14.0rc1
(gazelle): New annotation
gazelle:include_pytest_conftest. When not set (thedefault) ortrue, gazelle will inject anyconftest.pyfile found in the samedirectory as apy_testtarget to thatpy_testtarget’sdeps.This behavior is unchanged from previous versions. Whenfalse, the:conftestdep is not added to thepy_testtarget.(gazelle) New directive
gazelle:python_generate_proto; whentrue,Gazelle generatespy_proto_libraryrules forproto_library.falseby default.Note: Users must manually configure their Gazelle target to support theproto language.
(gazelle) New directive
gazelle:python_proto_naming_convention; controlsnaming ofpy_proto_libraryrules.
Removed
Nothing removed.
1.5.4 - 2025-08-27
Fixed
(toolchains)
local_runtime_reponow checks if the include directory existsbefore attempting to watch it, fixing issues on macOS with system Python(#3043).
1.5.3 - 2025-08-11
Fixed
(toolchains)
local_runtime_reponow checks if the include directory existsbefore attempting to watch it, fixing issues on macOS with system Python(#3043).
1.5.2 - 2025-08-11
Changed
(deps) (bzlmod) Upgraded to
bazel-skylibversion1.8.1to remove deprecation warnings.
Fixed
1.5.1 - 2025-07-06
Fixed
(pypi) Namespace packages work by default (pkgutil shims are generatedby default again)(#3038).
1.5.0 - 2025-06-11
Changed
(toolchain) Bundled toolchain version updates:
3.9 now references 3.9.23
3.10 now references 3.10.18
3.11 now references 3.11.13
3.12 now references 3.12.11
3.13 now references 3.13.4
(rules) On Windows,
--bootstrap_impl=system_pythonis forced. Thisallows setting--bootstrap_impl=scriptin bazelrc for mixed-platformenvironments.(rules)
compile_pip_requirementsnow generates a.testtarget. The_testtarget is deprecated and will be removed in the next major release.(#2794(py_wheel) py_wheel always creates zip64-capable wheel zips
(providers) (experimental)
PyInfo.venv_symlinksreplacesPyInfo.site_packages_symlinks(deps) Updated setuptools to 78.1.1 to patch CVE-2025-47273. This effectively makesPython 3.9 the minimum supported version for using
pip_parse.
Fixed
(rules) PyInfo provider is now advertised by py_test, py_binary, and py_library;this allows aspects using required_providers to function correctly.(#2506).
Fixes when using
--bootstrap_impl=script:compile_pip_requirementsnow works with itThe
sys._base_executablevalue will reflect the underlying interpreter,not venv interpreter.The
//python/runtime_env_toolchains:alltoolchain now works with it.
(rules) Better handle flakey platform.win32_ver() calls by calling themmultiple times.
(tools/wheelmaker.py) Extras are now preserved in Requires-Dist metadata when using requires_fileto specify the requirements.
(pypi) Use bazel downloader for direct URL references and correctly detect the filenames fromvarious URL formats - URL encoded version strings get correctly resolved, sha256 value can bealso retrieved from the URL as opposed to only the
--hashparameter. Fixes#2363.(pypi)
whl_librarynow infers file names from itsurlsattribute correctly.(pypi) When running under
bazeltest, be sure that temporaryrequirementsfileremains writable.(py_test, py_binary) Allow external files to be used for main
(pypi) Correctly aggregate the sources when the hashes specified in the lockfile differby platform even though the same version is used. Fixes#2648.
(pypi)
compile_pip_requirementstest rule works behind the proxy(toolchains) The hermetic toolchains now correctly statically advertise the
releaselevelandserialfor pre-release hermetic toolchains (#2837 issue).
Added
Repo utilities
execute_unchecked,execute_checked, andexecute_checked_stdoutnowsupportlog_stdoutandlog_stderrkeyword arg booleans. When these areTrue(the default), the subprocess’s stdout/stderr will be logged.(toolchains) Local toolchains can be activated with custom flags. See[Conditionally using local toolchains] docs for how to configure.
(pypi) Starlark-based evaluation of environment markers (requirements.txt conditionals)available (not enabled by default) for improved multi-platform build support.Set the
RULES_PYTHON_ENABLE_PIPSTAR=1environment variable to enable it.(utils) Add a way to run a REPL for any
rules_pythontarget that returnsaPyInfoprovider.(uv) Handle
.netrcandauth_patternsauth when downloadinguv. Work towards#1975.(toolchains) Arbitrary python-build-standalone runtimes can be registeredand activated with custom flags. See the [Registering custom runtimes]docs and
single_version_platform_override()API docs for moreinformation.(rules) Added support for a using constraints files with
compile_pip_requirements.Useful when an intermediate dependency needs to be upgraded to pull insecurity patches.(toolchains): 3.14.0b2 has been added as a preview.
Removed
Nothing removed.
1.4.2 - 2025-08-13
Fixed
(toolchains)
local_runtime_reponow checks if the include directory existsbefore attempting to watch it, fixing issues on macOS with system Python(#3043).
1.4.1 - 2025-05-08
Fixed
(pypi) Fix a typo not allowing users to benefit from using the downloader when the hashes in therequirements file are not present. Fixes#2863.
1.4.0 - 2025-04-19
Changed
(toolchain) The
execconfiguration toolchain now has the forwardedexec_interpreternow also forwards theToolchainInfoprovider. This isfor increased compatibility with theRBEsetups where access to theexecconfiguration interpreter is needed.(toolchains) Use the latest astral-sh toolchain release20250317 for Python versions:
3.9.21
3.10.16
3.11.11
3.12.9
3.13.2
(pypi) Use
xcrunxcodebuild--showsdksto find XCode root.(toolchains) Remove all but
3.8.20versions of the Python3.8interpreter who hasreached EOL. If users still need other versions of the3.8interpreter, please supplythe URLs manuallypython.toolchainorpython_register_toolchainscalls.(toolchains) Previously#2636changed the semantics of
ignore_root_user_errorfrom “ignore” to “warning”. This is nowflipped back to ignoring the issue, and will only emit a warning when the attribute is setFalse.(pypi) The PyPI extension will no longer write the lock file entries as theextension has been marked reproducible.Fixes#2434.
(gazelle) Lazily load and parse manifest files when running Gazelle. This ensures nomanifest files are loaded when Gazelle is run over a set of non-python directoriesPR #2746.
(rules)
py_binary.srcsandpy_test.srcsis no longer mandatory whenmain_moduleis specified (for--bootstrap_impl=script)
Fixed
(pypi) Platform specific extras are now correctly handled when usinguniversal lock files with environment markers. Fixes#2690.
(runfiles) (
--bootstrap_impl=script) Follow symlinks when searching for runfiles.(toolchains) Do not try to run
chmodwhen downloading non-windows hermetic toolchainrepositories on Windows. Fixes#2660.(logging) Allow repo rule logging level to be set to
FAILvia theRULES_PYTHON_REPO_DEBUG_VERBOSITYenvironment variable.(toolchains) The toolchain matching is has been fixed when writingtransitions transitioning on the
python_versionflag.Fixes#2685.(toolchains) Run the check on the Python interpreter in isolated mode, to ensure it’s not affected by userland environment variables, such as
PYTHONPATH.(toolchains) Ensure temporary
.pycand.pyofiles are also excluded from the interpreters repository files.(pypi) Run interpreter version call in isolated mode, to ensure it’s not affected by userland environment variables, such as
PYTHONPATH.(packaging) An empty
requires_fileis treated as if it were omitted, resulting in a validMETADATAfile.(rules) py_wheel and sphinxdocs rules now propagate
target_compatible_withto all targets they create.PR #2788.(pypi) Correctly handle
METADATAentries whenpython_full_versionis used inthe environment marker.Fixes#2319.(pypi) Correctly handle
python_versionparameter and transition the requirementlocking to the right interpreter version when usingcompile_pip_requirementsrule.See#2819.
Added
(pypi) From now on
sha256values in therequirements.txtis no longermandatory when enablingpip.parse.experimental_index_urlfeature.This means thatrules_pythonwill attempt to fetch metadata for allpackages through SimpleAPI unless they are pulled through direct URLreferences. Fixes#2023.In case you see issues withrules_pythonbeing too eager to fetch the SimpleAPImetadata, you can use the newly addedpip.parse.simpleapi_skipto skip metadata fetching for those packages.(uv) A
lockrule that is the replacement for thecompile_pip_requirements. This may still have rough cornersso please report issues with it in the#1975.Main highlights - the locking can be done within a build action or outsideit, there is no more automatictesttarget (but it can be added on the userside by usingnative_test). For customizing theuvversion that is used,please check theuv.configuretag class.Add support for riscv64 linux platform.
(toolchains) Add python 3.13.2 and 3.12.9 toolchains
(providers) (experimental)
PyInfo.site_packages_symlinksfield added toallow specifying links to create within the venv site packages (onlyapplicable with--bootstrap_impl=script)(#2156).(toolchains) Local Python installs can be used to create a toolchainequivalent to the standard toolchains. See [Local toolchains] docs for how toconfigure them.
(toolchains) Expose
$(PYTHON2_ROOTPATH)and$(PYTHON3_ROOTPATH)which are runfileslocations equivalents of$(PYTHON2)and `$(PYTHON3) respectively.
Removed
Nothing removed.
1.3.0 - 2025-03-27
Changed
(deps) platforms 0.0.4 -> 0.0.11
(py_wheel) Package
py_library.pyi_srcs(.pyifiles) in the wheel.(py_package) Package
py_library.pyi_srcs(.pyifiles) inpy_package.(gazelle) The generated manifest file (default:
gazelle_python.yaml) will now include theYAML document start---line. Implemented in#2656.
Fixed
(pypi) The
ppc64leis now pointing to the right target in theplatformspackage.(gazelle) No longer incorrectly merge
py_binarytargets during partial updates infilegeneration mode. Fixed in#2619.(bzlmod) Running as root is no longer an error.
ignore_root_user_error=Trueis now the default. Note that running as root may still cause spuriousBazel cache invalidation(#1169).(gazelle) Don’t collapse depsets to a list or into args when generating the modules mapping file.Support spilling modules mapping args into a params file.
(coverage) Fix missing files in the coverage report if they have no tests.
(pypi) From now on
pythoninvocations in repository and module extensionevaluation contexts will invoke Python interpreter with-Bto avoidcreating.pycfiles.(deps) doublestar 4.7.1 (required for recent Gazelle versions)
Added
(python)
python.defaultshas been added to allow users toset the default python version in the root module by reading thedefault version number from a file or an environment variable.//python/bin:python: convenience target for directly running aninterpreter.--//python/bin:python_srccan be used to specify abinary whose interpreter to use.(uv) Now the extension can be fully configured via
bzlmodAPIs without theneed to patchrules_python. The documentation has been added torules_pythondocs but usage of the extension may result in your setup breaking without anynotice. What is more, the URLs and SHA256 values will be retrieved from theGitHub releases page metadata published by theuvproject.(pypi) An extra argument to add the interpreter lib dir to
LDFLAGSwhenbuilding wheels fromsdist.(pypi) Direct HTTP urls for wheels and sdists are now supported when using
experimental_index_url(bazel downloader).Partially fixes#2363.(rules) APIs for creating custom rules based on the core py_binary, py_test,and py_library rules(#1647)
(rules) Added env-var to allow additional interpreter args for stage1 bootstrap.See
RULES_PYTHON_ADDITIONAL_INTERPRETER_ARGSenvironment variable.Only applicable for--bootstrap_impl=script.(rules) Added
interpreter_argsattribute topy_binaryandpy_test,which allows pass arguments to the interpreter before the regular args.(rules) Added
main_moduleattribute topy_binaryandpy_test,which allows specifying a module name to run (i.e.python-m<module>).
Removed
Nothing removed.
1.2.0 - 2025-02-21
Changed
(rules)
py_proto_libraryis deprecated in favour of theimplementation in https://github.com/protocolbuffers/protobuf. It will beremoved in the future release.(pypi)
pip.overridewill now be ignored instead of raising an error,fixes#2550.(rules) deprecation warnings for deprecated symbols have been turned off bydefault for now and can be enabled with
RULES_PYTHON_DEPRECATION_WARNINGSenv var.(pypi) Downgraded versions of packages:
pipfrom24.3.2to24.0.0andpackagingfrom24.2to24.0.
Fixed
(rules)
python_zip_fileoutput with--bootstrap_impl=scriptworks again(#2596).(docs) Using
python_versionattribute for specifying python versions introduced inv1.1.0(gazelle) Providing multiple input requirements files to
gazelle_python_manifestnow works correctly.(pypi) Handle trailing slashes in pip index URLs in environment variables,fixes#2554.
(runfiles) Runfile manifest and repository mapping files are now interpretedas UTF-8 on all platforms.
(coverage) Coverage with
--bootstrap_impl=scriptis fixed(#2572).(pypi) Non deterministic behaviour in requirement file usage has been fixedby reverting#2514.The related issue is#908.
(sphinxdocs) Do not crash when
tag_classdoes not have a populateddocvalue.Fixes (#2579).(binaries/tests) Fix packaging when using
--bootstrap_impl=script: set--venvs_use_declare_symlink=noto have it not create symlinks atbuild time (they will be created at runtime instead).(Fixes#2489)
Added
Nothing added.
Removed
Nothing removed.
1.1.0 - 2025-01-07
Changed
(toolchains) 3.13 means 3.13.1 (previously 3.13.0)
Bazel 6 support is dropped and Bazel 7.4.1 is the minimum supportedversion, per our Bazel support matrix. Earlier versions are nottested by CI, so functionality cannot be guaranteed.
(
pip.parse) From now we will make fewer calls to indexes whenfetching the metadata from SimpleAPI. The calls will be done in parallel toeach index separately, so the extension evaluation time might slow down ifnot usingpip.parse.experimental_index_url_overrides.(
pip.parse) Only query SimpleAPI for packages that havesha values in therequirements.txtfile.(rules) The version-aware rules have been folded into the base rules andthe version-aware rules are now simply aliases for the base rules. The
python_versionattribute is still used to specify the Python version.(pypi) Updated versions of packages:
pipto 24.3.1 andpackagingto 24.2.
Deprecations
//python/config_settings:transitions.bzland itspy_binaryandpy_testwrappers are deprecated. Use the regular rules instead.
Fixed
(py_wheel) Use the default shell environment when building wheels to allowtoolchains that search PATH to be used for the wheel builder tool.
(pypi) The requirement argument parsed to
whl_librarywill now not have envmarker information allowingbazelqueryto work in cases where thewhlisavailable for all of the platforms and the sdist can be built. This fix isfor both WORKSPACE andbzlmodsetups.Fixes#2450.(gazelle) Gazelle will now correctly parse Python3.12 files that usePEP 695 TypeParameter Syntax. (#2396)
(pypi) Using
pip_parse.experimental_requirement_cyclesandpip_parse.use_hub_alias_dependenciestogether now works whenusing WORKSPACE files.(pypi) The error messages when the wheel distributions do not match anythingare now printing more details and include the currently active flagvalues. Fixes#2466.
(py_proto_library) Fix import paths in Bazel 8.
(whl_library) Now the changes to the dependencies are correctly tracked whenPyPI packages used in
whl_libraryduring the repository rule phasechange. Fixes#2468.
(gazelle) Gazelle no longer ignores
setup.pyfiles by default. To restorethis behavior, apply the#gazelle:python_ignore_filessetup.pydirective.
Don’t re-fetch whl_library, python_repository, etc. repository ruleswhenever
PATHchanges. Fixes#2551.
Added
(gazelle) Added
include_stub_packagesflag tomodules_mapping. When set toTrue, thisautomatically includes corresponding stub packages for third-party librariesthat are present and used (e.g.,boto3→boto3-stubs), improvingtype-checking support.(pypi) Freethreaded packages are now fully supported in the
experimental_index_urlusage or the regularpip.parseusage.To select the free-threaded interpreter in the repo phase, please usethe documentedenv variables.Fixes#2386.(toolchains) Use the latest astral-sh toolchain release20241206 for Python versions:
3.9.21
3.10.16
3.11.11
3.12.8
3.13.1
(rules) Attributes for type definition files (
.pyifiles) and type-checkingonly dependencies added. Seepy_library.pyi_srcsandpy_library.pyi_deps(and the same named attributes forpy_binaryandpy_test).(pypi) pypi-generated targets set
pyi_srcsto include*.pyifiles.(providers)
PyInfohas new fields to aid static analysis tools:direct_original_sources,direct_pyi_files,transitive_original_sources,transitive_pyi_files.
Removed
find_requirementsin//python:defs.bzlhas been removed.
1.0.0 - 2024-12-05
Changed
Breaking:
(toolchains) stop exposing config settings in python toolchain alias repos.Please consider depending on the flags defined in
//python/config_setting/...and the@platformspackage instead.(toolchains) consumers who were depending on the
MACOS_NAMEand thearchattribute in thePLATFORMSlist, please update your code to respect the newvalues. The values now correspond to the values available in the@platforms//package constraint values.(toolchains)
host_platformandinterpreterconstants are no longer createdin thetoolchaingenerated alias.bzlfiles. If you need to access thehost interpreter during therepository_ruleevaluation, please use the@python_{version}_host//:pythontargets created bypython_register_toolchainsandpython_register_multi_toolchainsmacros or thepythonbzlmod extension.(bzlmod)
pip.parse.parse_all_requirements_filesattribute has been removed.See notes in the previous versions about what to do.(deps) rules_cc 0.1.0 (workspace) and 0.0.16 (bzlmod).
(deps) protobuf 29.0-rc2 (workspace; bzlmod already specifying that version).
Other changes:
(python_repository) Start honoring the
strip_prefixfield forzstdarchives.(pypi)
pip_parse.extra_hub_aliasesnow works in WORKSPACE files.(binaries/tests) For
--bootstrap_impl=script, a binary-specific (butotherwise empty) virtual env is used to customizesys.pathinitialization.(deps) bazel_skylib 1.7.0 (workspace; bzlmod already specifying that version)
(deps) bazel_features 1.21.0; necessary for compatibility with Bazel 8 rc3
(deps) stardoc 0.7.2 to support Bazel 8.
Fixed
(toolchains) stop depending on
unameto get the value of the host platform.(pypi): Correctly handle multiple versions of the same package in the requirementsfiles which is useful when including different PyTorch builds (e.g. <pytorch+cpu> vs <pytorch+cu118> ) for different target platforms.Fixes (2337).
(uv): Correct the sha256sum for the
uvbinary for aarch64-apple-darwin.Fixes (2411).(binaries/tests) (
--bootstrap_impl=scipt) Usingsys.executablewilluse the samesys.pathsetup as the calling binary.(2169).(workspace) Corrected protobuf’s name to com_google_protobuf, the name ishardcoded in Bazel, WORKSPACE mode.
(pypi):
compile_pip_requirementsno longer fails on Windows when--enable_runfilesis not enabled.(pypi):
compile_pip_requirementsnow correctly updates files in the source tree on Windows when--windows_enable_symlinksis not enabled.(repositories): Add libs/python3.lib and pythonXY.dll to the
libpythontargetdefined by a repository template. This enables stable ABI builds of Python extensionson Windows (by defining Py_LIMITED_API).(rules)
py_testandpy_binarytargets no longer incorrectly remove thefirstsys.pathentry when using--bootstrap_impl=script
Added
(gazelle): Parser failures will now be logged to the terminal. Additionaldetails can be logged by setting
RULES_PYTHON_GAZELLE_VERBOSE=1.(toolchains) allow users to select which variant of the support host toolchainthey would like to use through
RULES_PYTHON_REPO_TOOLCHAIN_{VERSION}_{OS}_{ARCH}env variable setting. Forexample, this allows one to usefreethreadedpython interpreter in therepository_ruleto build a wheel fromsdist.(toolchain) The python interpreters targeting
muslclibc have been addedfor the latest toolchain versions for each minor Python version. You can controlthe toolchain selection by using the//python/config_settings:py_linux_libcbuild flag.(providers) Added
PyRuntimeInfo.site_init_templateandPyRuntimeInfo.site_init_templatefor specifying the template to use toinitialize the interpreter via venv startup hooks.(runfiles) (Bazel 7.4+) Added support for spaces and newlines in runfiles paths
Removed
(pypi): Remove
pypi_install_dependenciesmacro that has been included inpy_repositoriesfor a long time.(bzlmod): Remove
DEFAULT_PYTHON_VERSIONfrominterpreters.bzlfile. Ifyou need the version, please use it from theversions.bzlfile instead.
0.40.0 - 2024-11-17
Changed
Nothing changed.
Fixed
(rules) Don’t drop custom import paths if Bazel-builtin PyInfo is removed.(2414).
Added
Nothing added.
Removed
(publish) Remove deprecated
requirements.txtfor thetwinedependencies.Please userequirements_linux.txtinstead.(python_repository) Use bazel’s built in
zstdsupport and remove attributesfor customizing thezstdbinary to be used forzstdarchives in thepython_repositoryrepository_rule. This affects thepython_register_toolchainsandpython_register_multi_toolchainscallers in theWORKSPACE.
0.39.0 - 2024-11-13
Changed
(deps) bazel_skylib 1.6.1 -> 1.7.1
(deps) rules_cc 0.0.9 -> 0.0.14
(deps) protobuf 24.4 -> 29.0-rc2
(deps) rules_proto 6.0.0-rc1 -> 6.0.2
(deps) stardoc 0.6.2 -> 0.7.1
For bzlmod, Bazel 7.4 is now the minimum Bazel version.
(toolchains) Use the latest indygreg toolchain release20241016 for Python versions:
3.9.20
3.10.15
3.11.10
3.12.7
3.13.0
(pypi) The naming scheme for the
bzlmodspoke repositories have changed asall of the givenrequirements.txtfiles are now parsed bydefault, totemporarily restore the behavior, you can usepip.parse.extra_hub_aliases, which will be removed or made noop inthe future.
Fixed
(precompiling) Skip precompiling (instead of erroring) if the legacy
@bazel_tools//tools/python:autodetecting_toolchainis being used(#2364).
Added
Bazel 8 is now supported.
(toolchain) Support for freethreaded Python toolchains is now available. Usethe config flag
//python/config_settings:py_freethreadedto toggle theselection of the free-threaded toolchains.(toolchain)
py_runtime.abi_flagsattribute andPyRuntimeInfo.abi_flagsfield added.
Removed
Support for Bazel 6 using bzlmod has been dropped.
0.38.0 - 2024-11-08
Changed
(deps) (WORKSPACE only) rules_cc 0.0.13 and protobuf 27.0 is now the defaultversion used; this for Bazel 8+ support (previously version was rules_cc 0.0.9and no protobuf version specified)(2310).
(publish) The dependencies have been updated to the latest available versionsfor the
twinepublishing rule.(whl_library) Remove
--no-build-isolationto allow non-hermetic sdist buildsby default. Users wishing to keep this argument and to enforce more hermeticbuilds can do so by passing the argument inpip.parse#extra_pip_args(pip.parse)
pip.parse.whl_modificationsnow normalizes the given whl namesand nowpyyamlandPyYAMLwill both work.(bzlmod)
pip.parsespoke repository naming will be changed in an upcomingrelease in places where the users specify different package versions perplatform in the same hub repository. The naming of the spoke repos isconsidered an implementation detail and we advise the users to use thehubrepository directly and make use ofpip.parse.extra_hub_aliasesfeature added in this release.
Fixed
(pypi) (Bazel 7.4+) Allow spaces in filenames included in
whl_librarys(617).(pypi) When
pip.parse.experimental_index_urlis set, we need to stillpass theextra_pip_argsvalue when building ansdist.(pypi) The patched wheel filenames from now on are using local version specifierswhich fixes usage of the said wheels using standard package managers.
(bzlmod) The extension evaluation has been adjusted to always generate thesame lock file irrespective if
experimental_index_urlis set by any moduleor not. To opt into this behavior, setpip.parse.parse_all_requirements_files, which will become thedefault in future releases leading up to1.0.0. Fixes#2268. A knownissue is that it may breakbazelqueryand in these use cases it isadvisable to usecqueryor switch todownload_only=True
Added
(publish) The requirements file for the
twinepublishing rules have beenupdated to have a new convention:requirements_darwin.txt,requirements_linux.txt,requirements_windows.txtfor each respective OSand one extra filerequirements_universal.txtif you prefer a single file.Therequirements.txtfile may be removed in the future.The rules_python version is now reported in
//python/features.bzl#features.version(pip.parse)
pip.parse.extra_hub_aliasescan now be used to expose extratargets created by annotations in whl repositories.Fixes#2187.(bzlmod)
pip.parsenow supportswhl-onlysetup usingdownload_only=Truewhere users can specify multiple requirements filesand use thepipbackend to do the downloading. This was only available forusers settingpip.parse.experimental_index_url, but now users havemore options whilst we continue to work on stabilizing the experimental feature.
0.37.2 - 2024-10-27
Fixed
(bzlmod) Generate
config_settingvalues for all available toolchains insteadof only the registered toolchains, which restores the previous behaviour thatbzlmodusers would have observed.
0.37.1 - 2024-10-22
Fixed
(rules) Setting
--incompatible_python_disallow_native_rulesno longercauses rules_python rules to fail(#2326).
0.37.0 - 2024-10-18
Changed
BREAKING
py_libraryno longer puts its source files or generated pycfiles in runfiles; it’s the responsibility of consumers (e.g. binaries) topopulate runfiles with the necessary files. Adding source files to runfilescan be temporarily restored by setting--add_srcs_to_runfiles=enabled,but this flag will be removed in a subsequent releases.PyInfo.transitive_sourcesis now added to runfiles. These files are.pyfiles that are required to be added to runfiles by downstream binaries(or equivalent).(toolchains)
py_runtime.implementation_namenow defaults tocpython(previously it defaulted to None).(toolchains) The exec tools toolchain is enabled by default. It can bedisabled by setting
--@rules_python//python/config_settings:exec_tools_toolchain=disabled.(deps) stardoc 0.6.2 added as dependency.
Fixed
(bzlmod) The
python.override(minor_mapping)now merges the default and theoverridden versions ensuring that the resultantminor_mappingwill alwayshave all of the python versions.(bzlmod) The default value for the
--python_versionflag will now bealways set to the default python toolchain version value.(bzlmod) correctly wire the
pip.parse.extra_pip_argsall theway towhl_library. What is more we will pass theextra_pip_argstowhl_libraryforsdistdistributions when usingpip.parse.experimental_index_url. See#2239.(whl_filegroup): Provide per default also the
RECORDfile(py_wheel):
RECORDfile entry elements are now quoted if necessary when awheel is created(whl_library) truncate progress messages from the repo rule to better handlecase where a requirement has many
--hash=sha256:...flags(rules)
compile_pip_requirementspassesenvto theX.updatetarget (andnot only to theX_testtarget, a bug introduced in#1067).(bzlmod) In hybrid bzlmod with WORKSPACE builds,
python_register_toolchains(register_toolchains=True)is respected(#1675).(precompiling) The
pyc_collectionattribute now correctlyenables (or disables) using pyc files from targets transitively(pip) Skip patching wheels not matching
pip.override’sfile(#2294).(chore): Add a
rules_shelldev dependency and moved ash_testtargetoutside of the//:BUILD.bazelfile.Fixes#2299.
Added
(py_wheel) Now supports
compress=(True|False)to allow disablingcompression to speed up development.(toolchains): A public
//python/config_settings:python_version_major_minorhasbeen exposed for users to be able to match on theX.Yversion of a Pythoninterpreter.(api) Added
merge_py_infos()so user rules can merge and propagatePyInfowithout losing information.(toolchains) New Python versions available: 3.13.0 using the20241008 release.
(toolchains): Bump default toolchain versions to:
3.8->3.8.203.9->3.9.203.10->3.10.153.11->3.11.103.12->3.12.7
(coverage) Add support for python 3.13 and bump
coverage.pyto 7.6.1.(bzlmod) Add support for
download_onlyflag to disable usage ofsdistswhenpip.parse.experimental_index_urlis set.(api) PyInfo fields:
PyInfo.transitive_implicit_pyc_files,PyInfo.transitive_implicit_pyc_source_files.
Removed
(precompiling)
--precompile_add_to_runfileshas been removed.(precompiling)
--pyc_collectionhas been removed. Thepyc_collectionattribute now bases its default on--precompile.(precompiling) The
precompile=if_generated_sourcevalue has been removed.(precompiling) The
precompile_source_retention=omit_if_generated_sourcevalue has been removed.
0.36.0 - 2024-09-24
Changed
(gazelle): Update error messages when unable to resolve a dependency to be more human-friendly.
(flags) The
--python_versionflag now also returnsconfig_common.FeatureFlagInfo.(toolchain): The toolchain patches now expose the
patch_stripattributethat one should use when patching toolchains. Please set it if you arepatching python interpreter. In the next release the default will be set to0which better reflects the defaults used in publicbazelAPIs.(toolchains) When
py_runtime.interpreter_version_infoisn’t specified,the--python_versionflag will determine the value. This allowsspecifying the build-time Python version for theruntime_env_toolchains.(toolchains)
py_cc_toolchain.libsandPyCcToolchainInfo.libsisoptional. This is to support situations where only the Python headers areavailable.(bazel) Minimum bazel 7 version that we test against has been bumped to
7.1.
Fixed
(whl_library): Remove
--no-indexand add--no-build-isolationto thepipinstallcommand when installing a wheel from a local file, which happenswhenexperimental_index_urlflag is used.(bzlmod) get the path to the host python interpreter in a way that results inplatform non-dependent hashes in the lock file when the requirement markers needto be evaluated.
(bzlmod) correctly watch sources used for evaluating requirement markers forany changes so that the repository rule or module extensions can bere-evaluated when the said files change.
(gazelle): Fix incorrect use of
t.Fatal/t.Fatalfin tests.(toolchain) Omit third-party python packages from coverage reports fromstage2 bootstrap template.
(bzlmod) Properly handle relative path URLs in parse_simpleapi_html.bzl
(gazelle) Correctly resolve deps that have top-level module overlap with a gazelle_python.yaml dep module
(rules) Make
RUNFILES_MANIFEST_FILE-based invocations work when used with--bootstrap_impl=script. This fixes invocations using non-sandboxedtest execution with--enable_runfiles=false--build_runfile_manifests=true.(#2186).(py_wheel) Fix incorrectly generated
Required-Distwhen specifying requirements with markersin extra_requires in py_wheel rule.(rules) Prevent pytest from trying run the generated stage2bootstrap .py file when using
--bootstrap_impl=script(toolchain) The
gen_python_config_settingshas been fixed to includethe flag_values from the platform definitions.
Added
(bzlmod): Toolchain overrides can now be done using the new
python.override,python.single_version_overrideandpython.single_version_platform_overridetag classes.See#2081.(rules) Executables provide
PyExecutableInfo, which containsexecutable-specific information useful for packaging an executable oror deriving a new one from the original.(py_wheel) Removed use of bash to avoid failures on Windows machines which do nothave it installed.
(docs) Automatically generated documentation for
python_register_toolchainsand related symbols.(toolchains) Added
python_repository.patch_stripattribute forallowing values that are other than1, which has been hard-coded up untilnow. If you are relying on the undocumentedpatchessupport inTOOL_VERSIONSfor registering patched toolchains please consider settingthepatch_stripexplicitly to1if you depend on this value - in thefuture the value may change to default to0.(toolchains) Added
//python:none, a special target for use withpy_exec_tools_toolchain.exec_interpreterto treat the value asNone.
Removed
(toolchains): Removed accidentally exposed
http_archivesymbol frompython/repositories.bzl.(toolchains): An internalis_python_config_setting macro has been removed.
0.35.0 - 2024-08-15
Changed
(whl_library) A better log message when the wheel is built from an sdist orwhen the wheel is downloaded using
download_onlyfeature to aid debugging.(gazelle): Simplify and make gazelle_python.yaml have only top level package name.It would work well in cases to reduce merge conflicts.
(toolchains): Change some old toochain versions to use20240726 release toinclude dependency updates
3.8.19,3.9.19,3.10.14,3.11.9(toolchains): Bump default toolchain versions to:
3.12->3.12.4
(rules)
PYTHONSAFEPATHis inherited from the calling environment to allowdisabling it (Requires--bootstrap_impl=script)(#2060).
Fixed
(rules)
compile_pip_requirementsnow sets theUSERPROFILEenv variable onWindows to work around an issue wheresetuptoolsfails to locate the user’shome directory.(rules) correctly handle absolute URLs in parse_simpleapi_html.bzl.
(rules) Fixes build targets linking against
@rules_python//python/cc:current_py_cc_libsin host platform builds on macOS, by editing theLC_ID_DYLIBfield of the hermetic interpreter’slibpython3.x.dylibusinginstall_name_tool, setting it to its absolute path under Bazel’sexecroot.(rules) Signals are properly received when using
--bootstrap_impl=script(for non-zip builds).(#2043)(rules) Fixes Python builds when the
--build_python_zipis set tofalseonWindows. See#1840.(rules) Fixes Mac +
--build_python_zip+--bootstrap_impl=script(#2030).(rules) User dependencies come before runtime site-packages when using
--bootstrap_impl=script.(#2064).(rules) Version-aware rules now return both
@_builtinsand@rules_pythonproviders instead of only one.(#2114).(pip) Fixed pypi parse_simpleapi_html function for feeds with package metadatacontaining “>” sign
(toolchains) Added missing executable permission to
//python/runtime_env_toolchainsinterpreter script so that it is runnable.(#2085).(pip) Correctly use the
sdistdownloaded by the bazel downloader when usingexperimental_index_urlfeature. Fixes#2091.(gazelle) Make
gazelle_python_manifest.updatemanual to avoid unnecessarynetwork behavior.(bzlmod): The conflicting toolchains during
pythonextension will no longercause warnings by default. In order to see the warnings for diagnostic purposesset the env varRULES_PYTHON_REPO_DEBUG_VERBOSITYto one ofINFO,DEBUGorTRACE.Fixes#1818.(runfiles) Make runfiles lookups work for the situation of Bazel 7,Python 3.9 (or earlier, where safepath isn’t present), and the Rlocation callin the same directory as the main file.Fixes#1631.
Added
(rules)
compile_pip_requirementssupports multiple requirements input files assrcs.(rules)
PYTHONSAFEPATHis inherited from the calling environment to allowdisabling it (Requires--bootstrap_impl=script)(#2060).(gazelle) Added
python_generation_mode_per_package_require_test_entry_pointin order to better accommodate users who use a custom macro,pytest-bazel,rules_python_pytest orrules_pypy_test_main in order to integrate withpytest. Currently the defaultflag value is set totruefor backwards compatible behaviour, but in thefuture the flag will be flipped befalseby default.(toolchains) New Python versions available:
3.12.4using the20240726 release.(pypi) Support env markers in requirements files. Note, that this means thatif your requirements files contain env markers, the Python interpreter willneed to be run during bzlmod phase to evaluate them. This may incurdownloading an interpreter (for hermetic-based builds) or cause non-hermeticbehavior (if using a system Python).
0.34.0 - 2024-07-04
Changed
protobuf/com_google_protobufdependency bumped tov24.4(bzlmod): optimize the creation of config settings used in pip toreduce the total number of targets in the hub repo.
(toolchains) The exec tools toolchain now finds its interpreter by reusingthe regular interpreter toolchain. This avoids having to duplicate specifyingwhere the runtime for the exec tools toolchain is.
(toolchains) (
//python:autodetecting_toolchain) is deprecated. It isreplaced by//python/runtime_env_toolchains:all. The old target will beremoved in a future release.
Fixed
(bzlmod): When using
experimental_index_urltheall_requirements,all_whl_requirementsandall_data_requirementswill now only includecommon packages that are available on all target platforms. This is to ensurethat packages that are only present for some platforms are pulled only viathedepsof the materializedpy_library. If you would like to includeplatform specific packages, using aselectstatement with references to thespecific package will still work (e.g.my_attr=all_requirements+select({"@platforms//os:linux":["@pypi//foo_available_only_on_linux"],"//conditions:default":[],})
(bzlmod): Targets in
all_requirementsnow use the same form as targets returned by therequirementmacro.(rules) Auto exec groups are enabled. This allows actions run by the rules,such as precompiling, to pick an execution platform separately from whatother toolchains support.
(providers)
PyRuntimeInfodoesn’t require passing theinterpreter_version_infoarg.(bzlmod) Correctly pass
isolated,quietandtimeoutvalues towhl_libraryand drop the defaults from the lock file.(whl_library) Correctly handle arch-specific dependencies when we encounter aplatform specific wheel and use
experimental_target_platforms.Fixes#1996.(rules) The first element of the default outputs is now the executable again.
(pip) Fixed crash when pypi packages lacked a sha (e.g. yanked packages)
Added
(toolchains)
//python/runtime_env_toolchains:all, which is a drop-inreplacement for the “autodetecting” toolchain.(gazelle) Added new
python_label_conventionandpython_label_normalizationdirectives. These directiveallows altering default Gazelle label format to third-party dependencies useful for re-using Gazelle pluginwith other rules, includingrules_pycross. See#1939.
Removed
(pip): Removes the
entrypointmacro that was replaced bypy_console_script_binaryin 0.26.0.
0.33.2 - 2024-06-13
Fixed
(toolchains) The
exec_tools_toolchain_typeis disabled by default.To enable it, set--//python/config_settings:exec_tools_toolchain=enabled.This toolchain must be enabled for precompilation to work. This toolchain willbe enabled by default in a future release.Fixes#1967.
0.33.1 - 2024-06-13
Fixed
(py_binary) Fix building of zip file when using
--build_python_zipargument. Fixes#1954.
0.33.0 - 2024-06-12
Changed
(deps) Upgrade the
pip_installdependencies to pick up a new version of pip.(toolchains) Optional toolchain dependency:
py_binary,py_test, andpy_librarynow depend on the//python:exec_tools_toolchain_typefor buildtools.(deps): Bumped
bazel_skylibto 1.6.1.(bzlmod): The
pythonand internalrules_pythonextensions have beenmarked asreproducibleand will not include any lock file entries from nowon.(gazelle): Remove gazelle plugin’s python deps and make it hermetic.Introduced a new Go-based helper leveraging tree-sitter for syntax analysis.Implemented the use of
pypi/stdlib-listfor standard library module verification.(pip.parse): Do not ignore yanked packages when using
experimental_index_url.This is to mimic whatuvis doing. We will print a warning instead.(pip.parse): Add references to all supported wheels when using
experimental_index_urlto allowing to correctly fetch the wheels for the right platform. See theupdated docs on how to use the feature. This is work towards addressing#735 and#260. The spokerepository 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 therepurely for better debugging experience.(bzlmod) The
pythons_hub//:interpreters.bzlno longer has platform-specificlabels which where left there for compatibility reasons. Move topython_{version}_hostkeys if you would like to have access to a Pythoninterpreter that can be used in a repository rule context.
Fixed
(gazelle) Remove
visibilityfromNonEmptyAttr.Now empty(have nodeps/main/srcs/importsattr)py_library/test/binaryrules willbe automatically deleted correctly. For example, ifpython_generation_modeis set to package, when__init__.pyis deleted, thepy_librarygeneratedfor this package before will be deleted automatically.(whl_library): Useis_python_config_setting to correctly handle multi-pythonversion dependency select statements when the
experimental_target_platformsincludes the Python ABI. The default python version case within the select isalso now handled correctly, stabilizing the implementation.(gazelle) Fix Gazelle failing on Windows with“panic: runtime error: invalid memory address or nil pointer dereference”
(bzlmod) remove
pip.parse(annotations)attribute as it is unused and has beenreplaced by whl_modifications.(pip) Correctly select wheels when the python tag includes minor versions.See (#1930)
(pip.parse): The lock file is now reproducible on any host platform if the
experimental_index_urlis not used by any of the modules in the dependencychain. To make the lock file identical on eachosandarch, please usetheexperimental_index_urlfeature which will fetch metadata from PyPI or adifferent private index and write the contents to the lock file. Fixes#1643.(pip.parse): Install
yankedpackages and print a warning instead ofignoring them. This better matches the behaviour ofuvpipinstall.(toolchains): Now matching of the default hermetic toolchain is more robustand explicit and should fix rare edge-cases where the host toolchainautodetection would match a different toolchain than expected. This may yieldto toolchain selection failures when the python toolchain is not registered,but is requested via
//python/config_settings:python_versionflag setting.(doc) Fix the
WORKSPACErequirement vendoring example. Fixes#1918.
Added
(rules) Precompiling Python source at build time is available. but isdisabled by default, for now. Set
@rules_python//python/config_settings:precompile=enabledto enable itby default. A subsequent release will enable it by default. See thePrecompiling docs and API reference docs for moreinformation on precompiling. Note this requires Bazel 7+ and the Pystar ruleimplementation enabled.(#1761)(rules) Attributes and flags to control precompile behavior:
precompile,precompile_optimize_level,precompile_source_retention,precompile_invalidation_mode, andpyc_collection(toolchains) The target runtime toolchain (
//python:toolchain_type) hastwo new optional attributes:pyc_tag(tells the pyc filename infix to use) andimplementation_name(tells the Python implementation name).(toolchains) A toolchain type for build tools has been added:
//python:exec_tools_toolchain_type.(providers)
PyInfohas two new attributes:direct_pyc_filesandtransitive_pyc_files, which tell the pyc files a target makes availabledirectly and transitively, respectively.//python:features.bzladded to allow easy feature-detection in the future.(pip) Allow specifying the requirements by (os, arch) and add extravalidations when parsing the inputs. This is a non-breaking change for mostusers unless they have been passing multiple
requirements_*files togetherwithextra_pip_args=["--platform=manylinux_2_4_x86_64"], that was aninvalid usage previously but we were not failing the build. From now on thisis explicitly disallowed.(toolchains) Added riscv64 platform definition for python toolchains.
(gazelle) The
python_visibilitydirective now supports the$python_root$placeholder, just like thepython_default_visibilitydirective does.(rules) A new bootstrap implementation that doesn’t require a system Pythonis available. It can be enabled by setting
--@rules_python//python/config_settings:bootstrap_impl=script. Itwill become the default in a subsequent release.(#691)(providers)
PyRuntimeInfohas two new attributes:PyRuntimeInfo.stage2_bootstrap_templateandPyRuntimeInfo.zip_main_template.(toolchains) A replacement for the Bazel-builtn autodetecting toolchain isavailable. The
//python:autodetecting_toolchainalias now uses it.(pip): Support fetching and using the wheels for other platforms. Thissupports customizing whether the linux wheels are pulled for
muslorglibc, whetheruniversal2or arch-specific MacOS wheels are preferred andit also allows to select a particularlibcversion. All of this is done viathestring_flagsin@rules_python//python/config_settings. If there areno wheels that are supported for the target platform,rules_pythonwillfallback onto building thesdistfrom source. This behaviour can bedisabled if desired using one of the available string flags as well.(whl_filegroup) Added a new
whl_filegrouprule to extract files from a wheel file.This is useful to extract headers for use in acc_library.
0.32.2 - 2024-05-14
Fixed
0.32.0 - 2024-05-12
Changed
(bzlmod): The
MODULE.bazel.lockwhl_libraryrule attributes are nowsorted in the attributes section. We are also removing values that are notdefault in order to reduce the size of the lock file.(coverage) Bump
coverage.pyto7.4.3.(deps): Bumped
bazel_featuresto 1.9.1 to detect optional supportnon-blocking downloads.(deps): Updated
pip_toolsto >= 7.4.0(toolchains): Change some old toolchain versions to use20240224 release toinclude security fixes
3.8.18,3.9.18and3.10.13(toolchains): Bump default toolchain versions to:
3.8->3.8.193.9->3.9.193.10->3.10.143.11->3.11.93.12->3.12.3
Fixed
(whl_library): Fix the experimental_target_platforms overriding for platformspecific wheels when the wheels are for any python interpreter version. Fixes#1810.
(whl_library): Stop generating duplicate dependencies when encounteringduplicates in the METADATA. Fixes#1873.
(gazelle) In
projectorpackagegeneration modes, do not generatepy_testrules when there are no test files and do not setmain="__test__.py"whenthat file doesn’t exist.(whl_library) The group redirection is only added when the package is part ofthe group potentially fixing aspects that want to traverse a
py_librarygraph.Fixes#1760.(bzlmod) Setting a particular micro version for the interpreter and the
pip.parseextension is now possible, see theexamples/pip_parse/MODULE.bazelfor how to do it.See#1371.(refactor) The pre-commit developer workflow should now pass
isortandblackchecks (see#1674).
Added
(toolchains) Added armv7 platform definition for python toolchains.
(toolchains) New Python versions available:
3.11.8,3.12.2using the20240224 release.(toolchains) New Python versions available:
3.8.19,3.9.19,3.10.14,3.11.9,3.12.3usingthe20240415 release.(gazelle) Added a new
python_visibilitydirective to control visibilityof generated targets by appending additional visibility labels.(gazelle) Added a new
python_default_visibilitydirective to control thedefault visibility of generated targets. See thedocsfor details.(gazelle) Added a new
python_test_file_patterndirective. This directive tellsgazelle which python files should be mapped to thepy_testrule. See theoriginal issue and thedocsfor details.(wheel) Add support for
data_filesattributes in py_wheel rule(#1777)(py_wheel)
bzlmodinstallations now provide atwinesetup for the defaultPython toolchain inrules_pythonfor version 3.11.(bzlmod) New
experimental_index_url,experimental_extra_index_urlsandexperimental_index_url_overridestopip.parsefor using the bazeldownloader. If you see any issues, report in#1357. The URLs forthe whl and sdist files will be written to the lock file. Controlling whetherthe downloading of metadata is done in parallel can be done usingparallel_downloadattribute.(gazelle) Add a new annotation
include_dep. Also add documentation forannotations togazelle/README.md.(deps):
rules_pythondepends now onrules_cc0.0.9(pip_parse): A new flag
use_hub_alias_dependencieshas been added that is goingto become default in the next release. This makes use ofdep_templateflagin thewhl_libraryrule. This also affects theexperimental_requirement_cyclesfeature where the dependencies that are ina group would be only accessible via the hub repo aliases. If you stilldepend on legacy labels instead of the hub repo aliases and you use theexperimental_requirement_cycles, now is a good time to migrate.
0.31.0 - 2024-02-12
Changed
For Bazel 7, the core rules and providers are now implemented in rules_pythondirectly and the rules bundled with Bazel are not used. Bazel 6 and earliercontinue to use the Bazel builtin symbols. Of particular note, this means,under Bazel 7, the builtin global symbol
PyInfoisnot the same as whatis loaded from rules_python. The same is true ofPyRuntimeInfo.
0.30.0 - 2024-02-12
Changed
(toolchains) Windows hosts always ignore pyc files in the downloaded runtimes.This fixes issues due to pyc files being created at runtime and affecting thedefinition of what files were considered part of the runtime.
(pip_parse) Added the
envsubstparameter, which enables environment variablesubstitutions in theextra_pip_argsattribute.(pip_repository) Added the
envsubstparameter, which enables environmentvariable substitutions in theextra_pip_argsattribute.
Fixed
(bzlmod) pip.parse now does not fail with an empty
requirements.txt.(py_wheel) Wheels generated by
py_wheelnow preserve executable bits whenbeing extracted byinstallerand/orpip.(coverage) During the running of lcov, the stdout/stderr was causing testfailures. By default, suppress output when generating lcov. This can beoverridden by setting ‘VERBOSE_COVERAGE’. This change only affect bazel7.x.x and above.
(toolchain) Changed the
host_toolchainto symlink all files to supportWindows host environments without symlink support.(PyRuntimeInfo) Switch back to builtin PyRuntimeInfo for Bazel 6.4 and whenpystar is disabled. This fixes an error about
target...doesnothave...PyRuntimeInfo.(#1732)
Added
(py_wheel) Added
requires_fileandextra_requires_filesattributes.(whl_library)experimental_target_platforms now supports specifying thePython version explicitly and the output
BUILD.bazelfile will be correctirrespective of the python interpreter that is generating the file andextracting thewhldistribution. Multiple python target version can bespecified and the code generation will generate version specific dependencyclosures but that is not yet ready to be used and may break the build ifthe default python version is not selected usingcommon--@rules_python//python/config_settings:python_version=X.Y.Z.New Python versions available:
3.11.7,3.12.1usinghttps://github.com/indygreg/python-build-standalone/releases/tag/20240107.(toolchain) Allow setting
x.yas thepython_versionparameter inthe version-awarepy_binaryandpy_testrules. This allows users touse the same rule import for testing with specific Python versions andrely on toolchain configuration and how the latest version takes precedenceif e.g.3.8is selected. That also simplifies.bazelrcfor any usersthat set the defaultpython_versionstring flag in that way.(toolchain) The runtime’s shared libraries (libpython.so et al) can beaccessed using
@rules_python//python/cc:current_py_cc_libs. This usestoolchain resolution, so the files are from the same runtime used to run atarget. If you were previously using e.g.@python_3_11//:libpython, thenswitch to:current_py_cc_libsfor looser coupling to the underlying runtimerepo implementation.(repo rules) The environment variable
RULES_PYTHON_REPO_DEBUG=1can beset to make repository rules log detailed information about what they’reup to.(coverage) Add support for python 3.12 and bump
coverage.pyto7.4.1.
0.29.0 - 2024-01-22
Changed
BREAKING The deprecated
incompatible_generate_aliasesfeature flagsfrompip_parseandgazellegot removed. They had been flipped toTruein 0.27.0 release.BREAKING (wheel) The
incompatible_normalize_nameandincompatible_normalize_versionflags have been removed. They had beenflipped toTruein 0.27.0 release.(bzlmod) The pip hub repository now uses the newly introduced config settingsusing the
X.Ypython version notation. This improves cross moduleinteroperability and allows to share wheels built by interpreters usingdifferent patch versions.
Fixed
(bzlmod pip.parse) Use a platform-independent reference to the interpreterpip uses. This reduces (but doesn’t eliminate) the amount ofplatform-specific content in
MODULE.bazel.lockfiles; Follow#1643 for removingplatform-specific content inMODULE.bazel.lockfiles.(wheel) The stamp variables inside the distribution name are no longerlower-cased when normalizing under PEP440 conventions.
Added
(toolchains)
python_register_toolchainsnow also generates a repositorythat is suffixed with_host, that has a single label:pythonthat is asymlink to the python interpreter for the host platform. The intended use ismainly inrepository_rule, which are always run usinghostplatformPython. This means thatWORKSPACEusers can now copy therequirements.bzlfile for vendoring as seen in the updatedpip_parse_vendoredexample.(runfiles)
rules_python.python.runfiles.Runfilesnow has a staticCreatemethod to make imports more ergonomic. Users should only need to import theRunfilesobject to locate runfiles.(toolchains)
PyRuntimeInfonow includes ainterpreter_version_infofieldthat contains the static version information for the given interpreter.This can be set viapy_runtimewhen registering an interpreter toolchain,and will done automatically for the builtin interpreter versions registered viapython_register_toolchains.Note that this only available on the Starlark implementation of the provider.(config_settings) Added
//python/config_settings:is_python_X.Yconfigsettings to match on minor Python version. These settings match anyX.Yversion instead of just an exactX.Y.Zversion.
0.28.0 - 2024-01-07
Changed
BREAKING (pip_install) the deprecated
pip_installmacro and relateditems have been removed.BREAKING Support for Bazel 5 has been officially dropped. This releasewas only partially tested with Bazel 5 and may or may not work with Bazel 5.Subsequent versions will no longer be tested under Bazel 5.
(runfiles)
rules_python.python.runfilesnow directly implements type hintsand drops support for python2 as a result.(toolchains)
py_runtime,py_runtime_pair, andPyRuntimeInfonow use therules_python Starlark implementation, not the one built into Bazel. NOTE: Thisonly applies to Bazel 6+; Bazel 5 still uses the builtin implementation.(pip_parse) The parameter
experimental_requirement_cyclesmay be provided amap of names to lists of requirements which form a dependencycycle.pip_parsewill break the cycle for you transparently. This behavioris also available under bzlmod aspip.parse(experimental_requirement_cycles={}).(toolchains)
py_runtimecan now take an executable target. Note: runfilesfrom the target are not supported yet.(#1612)(gazelle) When
python_generation_modeis set tofile, create onepy_binarytarget for each file withif__name__=="__main__"instead of just onepy_binaryfor the whole module.(gazelle) the Gazelle manifest integrity field is now optional. If the
requirementsargument togazelle_python_manifestis unset, no integrityfield will be generated.
Fixed
(gazelle) The gazelle plugin helper was not working with Python toolchains 3.11and above due to a bug in the helper components not being on PYTHONPATH.
(pip_parse) The repositories created by
whl_librarycan now parse thewhlMETADATA and generate dependency closures irrespective of the host platformthe generation is executed on. This can be turned on by supplyingexperimental_target_platforms=["all"]to thepip_parseor thebzlmodequivalent. This may help in cases where fetching wheels for a differentplatform usingdownload_only=Truefeature.(bzlmod pip.parse) The
pip.parse(python_interpreter)arg now works forspecifying a local system interpreter.(bzlmod pip.parse) Requirements files with duplicate entries for the samepackage (e.g. one for the package, one for an extra) now work.
(bzlmod python.toolchain) Submodules can now (re)register the Python versionthat 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 resultthe RECORD file consistency requirement is lifted and now a warning is emittedinstead 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 wheelfile if you decide to do so.
(coverage): coverage reports are now created when the version-awarerules are used.(#1600)
(toolchains) Workspace builds register the py cc toolchain (bzlmod alreadywas). This makes e.g.
//python/cc:current_py_cc_headersJust Work.(#1669)(bzlmod python.toolchain) The value of
ignore_root_user_erroris now decidedby the root module only.(#1658)
Added
(docs) bzlmod extensions are now documented on rules-python.readthedocs.io
(docs) Support and backwards compatibility policies have been documented.See https://rules-python.readthedocs.io/en/latest/support.html
(gazelle)
filegeneration mode can now also add__init__.pyto the srcsattribute for every target in the package. This is enabled through a separatedirectivepython_generation_mode_per_file_include_init.
0.27.0 - 2023-11-16
Changed
Make
//python/pip_install:pip_repository_bzlbzl_librarytarget internalas all of the publicly available symbols (etc.package_annotation) arere-exported via//python:pip_bzlbzl_library.(gazelle) Gazelle Python extension no longer has runtime dependencies. Using
GAZELLE_PYTHON_RUNTIME_DEPSfrom@rules_python_gazelle_plugin//:def.bzlisno longer necessary.(pip_parse) The installation of
pip_parserepository rule toolchaindependencies is now done as part ofpy_repositoriescall.(pip_parse) The generated
requirements.bzlfile now has an additional symbolall_whl_requirements_by_packagewhich provides a map from the normalizedPyPI package name to the target that provides the built wheel file. Usepip_utils.normalize_namefunction from@rules_python//python:pip.bzltoconvert a PyPI package name to a key in theall_whl_requirements_by_packagemap.(pip_parse) The flag
incompatible_generate_aliaseshas been flipped toTrueby default onnon-bzlmodsetups allowing users to use the same labelstrings during the transition period. For example, instead of@pypi_foo//:pkg, you can now use@pypi//fooor@pypi//foo:pkg. Otherlabels that are present in thefoopackage aredist_info,whlanddata. Note, that the@pypi_foo//:pkglabels are still present forbackwards compatibility.(gazelle) The flag
use_pip_repository_aliasesis now set toTruebydefault, which will causegazelleto change third-party dependency labelsfrom@pip_foo//:pkgto@pip//fooby default.The
compile_pip_requirementsnow defaults topyproject.tomlif thesrcorrequirements_inattributes are unspecified, matching the upstreampip-compilebehaviour more closely.(gazelle) Use relative paths if possible for dependencies added throughthe use of the
resolvedirective.(gazelle) When using
python_generation_modefile, onepy_testtarget ismade per test file even if a target named__test__or a file named__test__.pyexists in the same package. Previously in these cases therewould only be one test target made.
Breaking changes:
(pip)
pip_installrepository rule in this release has been disabled andwill fail by default. The API symbol is going to be removed in the nextversion, please migrate topip_parseas a replacement. Thepip_parserule no longer supportsrequirementsattribute, please userequirements_lockinstead.(py_wheel) switch
incompatible_normalize_nameandincompatible_normalize_versiontoTrueby default to enforcePEP440for wheel names built byrules_python.(tools/wheelmaker.py) drop support for Python 2 as only Python 3 is tested.
Fixed
Skip aliases for unloaded toolchains. Some Python versions that don’t have fullplatform support, and referencing their undefined repositories can break operationslike
bazelqueryrdeps(...).Python code generated from
proto_librarywithstrip_import_prefixcan be imported now.(py_wheel) Produce deterministic wheel files and make
RECORDfile entriesfollow the order of files written to the.whlarchive.(gazelle) Generate a single
py_testtarget whengazelle:python_generation_modeprojectis used.(gazelle) Move waiting for the Python interpreter process to exit to the shutdown hookto make the usage of the
exec.Commandmore idiomatic.(toolchains) Keep tcl subdirectory in Windows build of hermetic interpreter.
(bzlmod) sub-modules now don’t have the
//conditions:defaultclause in thehub repos created bypip.parse. This should fix confusing error messagesin case there is a misconfiguration of toolchains or a bug inrules_python.
Added
(bzlmod) Added
.whlpatching support viapatchesandpatch_striparguments to the newpip.overridetag class.(pip) Support for usingPEP621 compliant
pyproject.tomlfor creating a resolvedrequirements.txtfile.(utils) Added a
pip_utilsstruct with anormalize_namefunction to allow usersto find out howrules_pythonwould normalize a PyPI distribution name.
0.26.0 - 2023-10-06
Changed
Python version patch level bumps:
3.8.15 -> 3.8.18
3.9.17 -> 3.9.18
3.10.12 -> 3.10.13
3.11.4 -> 3.11.6
(deps) Upgrade rules_go 0.39.1 -> 0.41.0; this is so gazelle integration works with upcoming Bazel versions
(multi-version) The
distribsattribute is no longer propagated. Thisattribute has been long deprecated by Bazel and shouldn’t be used.Calling
//python:repositories.bzl#py_repositories()is required. It hasalways been documented as necessary, but it was possible to omit it in certaincases. An error about@rules_python_internalmeans thepy_repositories()call is missing inWORKSPACE.(bzlmod) The
pip.parseextension will generate os/arch specific lockfile entries onbazel>=6.4.
Added
(bzlmod, entry_point) Added
py_console_script_binary, whichallows adding custom dependencies to a package’s entry points and customizingthepy_binaryrule used to build it.New Python versions available:
3.8.17,3.11.5usinghttps://github.com/indygreg/python-build-standalone/releases/tag/20230826.(gazelle) New
#gazelle:python_generation_modefiledirective to supportgenerating onepy_libraryper file.(python_repository) Support
netrcandauth_patternsattributes to enableauthentication against private HTTP hosts serving Python toolchain binaries.//python:packaging_bzladded, abzl_libraryfor the Starlarkfiles//python:packaging.bzlrequires.(py_wheel) Added the
incompatible_normalize_namefeature flag tonormalize the package distribution name according to latest Pythonpackaging standards. Defaults toFalsefor the time being.(py_wheel) Added the
incompatible_normalize_versionfeature flagto normalize the package version according to PEP440 standard. Thisalso adds support for local version specifiers (versions with a+in them), in accordance with PEP440. Defaults toFalsefor thetime being.New Python versions available:
3.8.18,3.9.18,3.10.13,3.11.6,3.12.0usinghttps://github.com/indygreg/python-build-standalone/releases/tag/20231002.3.12.0support is considered beta and may have issues.
Removed
(bzlmod) The
entry_pointmacro is no longer supported and has been removedin favour of thepy_console_script_binarymacro forbzlmodusers.(bzlmod) The
pip.parseno longer generates{hub_name}_{py_version}hub reposas theentry_pointmacro has been superseded bypy_console_script_binary.(bzlmod) The
pip.parseno longer generates{hub_name}_{distribution}hub repos.
Fixed
(whl_library) No longer restarts repository rule when fetching externaldependencies improving initial build times involving external dependencyfetching.
(gazelle) Improve runfiles lookup hermeticity.
0.25.0 - 2023-08-22
Changed
Python version patch level bumps:
3.9.16 -> 3.9.17
3.10.9 -> 3.10.12
3.11.1 -> 3.11.4
(bzlmod)
pip.parsecan no longer automatically use the defaultPython version; this was an unreliable and unsafe behavior. Thepython_versionarg must always be explicitly specified.
Fixed
(docs) Update docs to use correct bzlmod APIs and clarify how and when to usevarious APIs.
(multi-version) The
mainarg is now correctly computed and usually optional.(bzlmod)
pip.parseno longer requires a call for whatever the configureddefault Python version is.
Added
Created a changelog.
(gazelle) Stop generating unnecessary imports.
(toolchains) s390x supported for Python 3.9.17, 3.10.12, and 3.11.4.
0.24.0 - 2023-07-11
Changed
BREAKING (gazelle) Gazelle 0.30.0 or higher is required
(bzlmod)
@python_aliasesrenamed to `@python_versions(bzlmod)
pip.parseargnamerenamed tohub_name(bzlmod)
pip.parseargincompatible_generate_aliasesremoved and alwaystrue.
Fixed
(bzlmod) Fixing Windows Python Interpreter symlink issues
(py_wheel) Allow twine tags and args
(toolchain, bzlmod) Restrict coverage tool visibility under bzlmod
(pip) Ignore temporary pyc.NNN files in wheels
(pip) Add format() calls to glob_exclude templates
plugin_output in py_proto_library rule
Added
Using Gazelle’s lifecycle manager to manage external processes
(bzlmod)
pip.parsecan be called multiple times with different Pythonversions(bzlmod) Allow bzlmod
pip.parseto reference the default python toolchain and interpreter(bzlmod) Implementing wheel annotations via
whl_mods(gazelle) support multiple requirements files in manifest generation
(py_wheel) Support for specifying
Description-Content-TypeandSummaryin METADATA(py_wheel) Support for specifying
Project-URL(compile_pip_requirements) Added
generate_hashesarg (default True) tocontrol generating hashes(pip) Create all_data_requirements alias
Expose Python C headers through the toolchain.