diff --git a/e2e/MODULE.bazel b/e2e/MODULE.bazel index 6687fa4b..d9cd7600 100644 --- a/e2e/MODULE.bazel +++ b/e2e/MODULE.bazel @@ -122,4 +122,13 @@ uv.lockfile( hub_name = "pypi", venv_name = "psql", ) +uv.declare_venv( + hub_name = "pypi", + venv_name = "no-sdist", +) +uv.lockfile( + src = "//cases/uv-no-sdist-754:uv.lock", + hub_name = "pypi", + venv_name = "no-sdist", +) use_repo(uv, "pypi") diff --git a/e2e/cases/uv-no-sdist-754/BUILD.bazel b/e2e/cases/uv-no-sdist-754/BUILD.bazel new file mode 100644 index 00000000..4cba41ad --- /dev/null +++ b/e2e/cases/uv-no-sdist-754/BUILD.bazel @@ -0,0 +1,26 @@ +load("@aspect_bazel_lib//lib:transitions.bzl", "platform_transition_filegroup") + +platform( + name = "amd64_windows", + constraint_values = [ + "@platforms//os:windows", + "@platforms//cpu:x86_64", + ], + flags = [ + "--@aspect_rules_py//uv/private/constraints/platform:platform_libc=msvc", + "--@aspect_rules_py//uv/private/constraints/platform:platform_version=1.0", + "--@rules_rust//:extra_rustc_flag=-Cstrip=debuginfo", + "--@rules_rust//rust/settings:lto=fat", + "--stripopt=--strip-all", + # Note that we have to set this + "--@pypi//venv=no-sdist", + ], +) + +platform_transition_filegroup( + name = "test", + srcs = [ + "@pypi//pywin32", + ], + target_platform = ":amd64_windows", +) diff --git a/e2e/cases/uv-no-sdist-754/uv.lock b/e2e/cases/uv-no-sdist-754/uv.lock new file mode 100644 index 00000000..be811667 --- /dev/null +++ b/e2e/cases/uv-no-sdist-754/uv.lock @@ -0,0 +1,33 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "dummy" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "pywin32" }, +] + +[package.metadata] +requires-dist = [{ name = "pywin32" }] + +[[package]] +name = "pywin32" +version = "311" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/af/449a6a91e5d6db51420875c54f6aff7c97a86a3b13a0b4f1a5c13b988de3/pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151", size = 8697031, upload-time = "2025-07-14T20:13:13.266Z" }, + { url = "https://files.pythonhosted.org/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503", size = 9508308, upload-time = "2025-07-14T20:13:15.147Z" }, + { url = "https://files.pythonhosted.org/packages/44/7b/9c2ab54f74a138c491aba1b1cd0795ba61f144c711daea84a88b63dc0f6c/pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2", size = 8703930, upload-time = "2025-07-14T20:13:16.945Z" }, + { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543, upload-time = "2025-07-14T20:13:20.765Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040, upload-time = "2025-07-14T20:13:22.543Z" }, + { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102, upload-time = "2025-07-14T20:13:24.682Z" }, + { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload-time = "2025-07-14T20:13:26.471Z" }, + { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload-time = "2025-07-14T20:13:28.243Z" }, + { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload-time = "2025-07-14T20:13:30.348Z" }, + { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload-time = "2025-07-14T20:13:32.449Z" }, + { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload-time = "2025-07-14T20:13:34.312Z" }, + { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload-time = "2025-07-14T20:13:36.379Z" }, +] diff --git a/uv/private/constraints/platform/BUILD.bazel b/uv/private/constraints/platform/BUILD.bazel index f69d54e9..034bc511 100644 --- a/uv/private/constraints/platform/BUILD.bazel +++ b/uv/private/constraints/platform/BUILD.bazel @@ -66,6 +66,7 @@ config_setting( flag_values = { ":platform_libc": "musl", }, + visibility = ["//visibility:public"], ) config_setting( @@ -76,7 +77,13 @@ config_setting( visibility = ["//visibility:public"], ) -# TODO: Windows +config_setting( + name = "is_msvc", + flag_values = { + ":platform_libc": "msvc", + }, + visibility = ["//visibility:public"], +) generate( visibility = ["//visibility:public"], diff --git a/uv/private/constraints/platform/defs.bzl b/uv/private/constraints/platform/defs.bzl index 93f5803c..2559587a 100644 --- a/uv/private/constraints/platform/defs.bzl +++ b/uv/private/constraints/platform/defs.bzl @@ -32,7 +32,8 @@ def supported_platform(platform_tag): platform_tag == "any" or platform_tag.startswith("macosx_") or platform_tag.startswith("manylinux_") or - platform_tag.startswith("musllinux_") + platform_tag.startswith("musllinux_") or + platform_tag.startswith("win") ) # Adapted from rules_python's config_settings.bzl diff --git a/uv/private/constraints/platform/macro.bzl b/uv/private/constraints/platform/macro.bzl index 876a1111..2e01aef0 100644 --- a/uv/private/constraints/platform/macro.bzl +++ b/uv/private/constraints/platform/macro.bzl @@ -212,9 +212,47 @@ def generate_musllinux(visibility): visibility = visibility, ) +# buildifier: disable=unnamed-macro +# buildifier: disable=function-docstring +def generate_windows(visibility): + native.config_setting( + name = "win32", + flag_values = { + ":platform_libc": "msvc", + }, + constraint_values = [ + "@platforms//os:windows", + "@platforms//cpu:x86_64", + ], + visibility = visibility, + ) + native.config_setting( + name = "win_amd64", + flag_values = { + ":platform_libc": "msvc", + }, + constraint_values = [ + "@platforms//os:windows", + "@platforms//cpu:x86_64", + ], + visibility = visibility, + ) + native.config_setting( + name = "win_arm64", + flag_values = { + ":platform_libc": "msvc", + }, + constraint_values = [ + "@platforms//os:windows", + "@platforms//cpu:aarch64", + ], + visibility = visibility, + ) + # buildifier: disable=unnamed-macro # buildifier: disable=function-docstring def generate(visibility): generate_macos(visibility = visibility) generate_manylinux(visibility = visibility) generate_musllinux(visibility = visibility) + generate_windows(visibility = visibility) diff --git a/uv/private/whl_install/repository.bzl b/uv/private/whl_install/repository.bzl index ac01ef88..8cafec59 100644 --- a/uv/private/whl_install/repository.bzl +++ b/uv/private/whl_install/repository.bzl @@ -14,7 +14,7 @@ load("//uv/private/constraints/python:defs.bzl", "supported_python") def _format_arms(d): content = [" \"{}\": \"{}\"".format(k, v) for k, v in d.items()] content = ",\n".join(content) - return "{\n" + content + "\n }" + return "{\n" + content + "\n }" def _select_key(pair): """Force (triple, target) pairs into a orderable form. @@ -131,20 +131,32 @@ def _whl_install_impl(repository_ctx): "//conditions:default": str(repository_ctx.attr.sbuild), } + else: + content.append(""" +filegroup( + name = "_no_sbuild", + srcs = [], + target_compatible_with = ["@platforms//:incompatible"] +) +""") + select_arms = select_arms | { + "//conditions:default": ":_no_sbuild", + } + content.append( """ select_chain( - name = "whl", - arms = {}, - visibility = ["//visibility:private"], + name = "whl", + arms = {}, + visibility = ["//visibility:private"], ) py_library( - name = "whl_lib", - srcs = [], - data = [ - ":whl" - ], - visibility = ["//visibility:private"], + name = "whl_lib", + srcs = [], + data = [ + ":whl" + ], + visibility = ["//visibility:private"], ) """.format( _format_arms(select_arms), @@ -155,17 +167,17 @@ py_library( content.append( """ whl_install( - name = "actual_install", - src = ":whl", - visibility = ["//visibility:private"], + name = "actual_install", + src = ":whl", + visibility = ["//visibility:private"], ) alias( - name = "install", - actual = select({ - "@aspect_rules_py//uv/private/constraints:libs_are_libs": ":actual_install", - "@aspect_rules_py//uv/private/constraints:libs_are_whls": ":whl_lib", - }), - visibility = ["//visibility:public"], + name = "install", + actual = select({ + "@aspect_rules_py//uv/private/constraints:libs_are_libs": ":actual_install", + "@aspect_rules_py//uv/private/constraints:libs_are_whls": ":whl_lib", + }), + visibility = ["//visibility:public"], ) """, )