Skip to content

feat(venv): support data, include, and scripts schemes#3726

Open
rickeylev wants to merge 26 commits intobazel-contrib:mainfrom
rickeylev:whl.with.data
Open

feat(venv): support data, include, and scripts schemes#3726
rickeylev wants to merge 26 commits intobazel-contrib:mainfrom
rickeylev:whl.with.data

Conversation

@rickeylev
Copy link
Copy Markdown
Collaborator

@rickeylev rickeylev commented Apr 23, 2026

Currently, the files from the data, headers, and scripts portions of a
wheel don't end up in the proper sub-directories of the venv. This
means the full files of a distribution aren't available at the typical
location in the venv, making it harder to integrate with standard
tools.

To fix, simply map the directories to paths in the venv and give them
similar treatment as site-packages.

The spec says certain first-leve directories of the .data directory
map to specific scheme paths, which whl_library already handles.
Here's a listing of the
wheel data directory -> install scheme path key -> whl_library directory
relationships

  • purelib -> purelib -> site-packages
  • platlib -> platlib -> site-packages
  • headers -> include -> include
  • scripts -> scripts -> bin
  • data -> data -> data

Relevant reading:

The whl_library rule uses posix names for extracting. When
materialized into a binary's venv, platform specific names are used.

  • bin -> (posix) bin; (Windows) Scripts
  • include -> (posix) include; (Windows) Include (capital i)

Along the way ...

  • The data files (files under the "data" scheme of a whl) are now
    always included as part of depending on the library. They would be
    in included in venv_site_packages=yes mode, so this better aligns
    behavior of the two modes.
  • Rename is_venv_site_packages to _is_venv_site_packages_yes to
    better represent the purpose and visibility of it.

DO NOT MERGE: Right now, the generic 'data' schema is being mapped into
the binary's venv under a "data" directory. This doesn't match the
prefix spec, so we probably shouldn't do it. It was just easier
because as it avoids generating conflicting files.

ref https://packaging.python.org/en/latest/specifications/binary-distribution-format/#installing-a-wheel-distribution-1-0-py32-none-any-whl

for generic data scheme: these are usually installed to the venv root,
but that seems ill-advised. So we install into a data sub-directory
of the venv.
@rickeylev rickeylev requested review from aignas and groodt as code owners April 23, 2026 03:40
@rickeylev rickeylev added the do not merge Tag that prevents merging label Apr 23, 2026
Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request enhances wheel support by correctly handling and symlinking data/, bin/, and include/ directories within virtual environments. It updates the venv construction logic to recognize these directories, adds a new DATA symlink kind, and includes these paths in the wheel's data targets. Review feedback highlights a bug in path prefix matching for top-level directories, suggests removing internal 'TO CHECK' comments, and recommends refactoring how data targets are added to avoid redundancy and runfile bloat in non-venv environments.

Comment thread python/private/venv_runfiles.bzl
Comment thread python/private/pypi/whl_library_targets.bzl
Comment thread python/private/pypi/whl_library_targets.bzl Outdated
@aignas
Copy link
Copy Markdown
Collaborator

aignas commented Apr 23, 2026

Be sure you check the whl_library extraction starlark code, because it is handling some of the mapping already.

Uses os.name to correctly assert the Scripts/ and Include/ directory
paths when creating the virtual environment on Windows.
Also add debug info to venvs_site_packages_libs_test to help diagnose
Windows CI failures.
…addition

These changes seemed to cause many regressions in WORKSPACE mode in CI.
Also revert redundant bazel_skylib additions to example WORKSPACE files.
The original target was intended to be internal-only, so it has been
renamed and all references updated. No alias was added as per
instructions.

config_setting(
name = "is_venvs_site_packages",
name = "_is_venvs_site_packages",
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is different from the PR description and the constant elsevhere.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

do not merge Tag that prevents merging

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants