Skip to content

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

Merged
rickeylev merged 44 commits intobazel-contrib:mainfrom
rickeylev:whl.with.data
Apr 27, 2026
Merged

feat(venv): support data, include, and scripts schemes#3726
rickeylev merged 44 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-level 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)
  • data -> venv root directory

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.
  • Make whl_from_dir support Windows. Testing of venvs relies on
    using it for testing various special cases.

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 Outdated
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.
rickeylev and others added 13 commits April 26, 2026 09:27
The `whl_from_dir_repo` repository rule previously relied on the Unix
`zip` utility to create wheels. Because this command isn't natively
available on Windows, any tests that depended on repositories generated
by this rule had to be explicitly skipped on Windows hosts.

To fix this and expand our test coverage, this adds a native Windows
fallback. When running on Windows, the rule now invokes a helper
PowerShell script that uses .NET compression APIs to create the
archive. This script ensures the resulting wheel remains uncompressed
and uses zeroed-out timestamps to match the deterministic behavior of
the original `zip -0X` command.

With this constraint removed, the Unix-only compatibility flags
(`SUPPORTS_BZLMOD_UNIXY`) have been dropped, enabling several namespace
package and wheel-related integration tests to finally run on Windows.
@rickeylev rickeylev removed the do not merge Tag that prevents merging label Apr 26, 2026
@rickeylev
Copy link
Copy Markdown
Collaborator Author

@gemini-code-assist review

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 the handling of wheel data, scripts, and headers within virtual environments by introducing a DATA symlink kind and updating venv directory mappings. The changes ensure that files from a wheel's .data directory are correctly placed in the venv root, bin, and include directories, while preventing direct linking of shared directories to avoid conflicts. Feedback suggests expanding the list of restricted directories to include site-packages, Lib, and Scripts to prevent accidental overwrites. Additionally, it is recommended to include data files unconditionally in whl_library_targets to ensure consistent behavior across different execution modes.

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

Alrighty, I think this is ready. Some more work to make the things in bin actually runnable is needed, but this at least gets files into the right directory

@rickeylev rickeylev enabled auto-merge April 26, 2026 22:24
@rickeylev rickeylev requested review from aignas and removed request for groodt April 26, 2026 22:46
Copy link
Copy Markdown
Collaborator

@aignas aignas left a comment

Choose a reason for hiding this comment

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

LGTM with minor questions.

out_venv_path = venv_path[len("data/"):]
kind = VenvSymlinkKind.DATA
prefix = ""
elif venv_path.startswith("include/"):
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.

What about windows wheels? Do we not need to check for capitalized includes?

name = "verify_files_test",
srcs = ["verify_files_test.py"],
target_compatible_with = SUPPORTS_BZLMOD_UNIXY,
target_compatible_with = SUPPORTS_BZLMOD,
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.

nit: would it be possible to do this target_compatible_with at the somepkg_with_build_files? Or are we running them on non-bzlmod as well?

Can be done in a separate PR.

@rickeylev rickeylev added this pull request to the merge queue Apr 27, 2026
Merged via the queue into bazel-contrib:main with commit 12eac29 Apr 27, 2026
4 checks passed
@rickeylev rickeylev deleted the whl.with.data branch April 27, 2026 08:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants