diff --git a/CHANGELOG.md b/CHANGELOG.md index cc59e387ee..85a6be5f8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -129,6 +129,9 @@ END_UNRELEASED_TEMPLATE * {obj}`//python:features.bzl%features.headers_abi3` can be used to feature-detect the presense of the above. * (toolchains) Local toolchains can use a label for the interpreter to use. +* (pypi) Support for environment marker and `experimental_index_url` handling for + Windows ARM64 + ([#2276](https://github.com/bazel-contrib/rules_python/issues/2276)). {#v1-6-3} ## [1.6.3] - 2025-09-21 diff --git a/MODULE.bazel b/MODULE.bazel index 481e13e39f..20d40dadac 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -163,6 +163,7 @@ pip = use_extension("//python/extensions:pip.bzl", "pip") whl_platform_tags = whl_platform_tags, ) for cpu, whl_platform_tags in { + "aarch64": ["win_arm64"], "x86_64": ["win_amd64"], }.items() for freethreaded in [ diff --git a/examples/bzlmod/MODULE.bazel b/examples/bzlmod/MODULE.bazel index 95e1090f53..1c01a5048a 100644 --- a/examples/bzlmod/MODULE.bazel +++ b/examples/bzlmod/MODULE.bazel @@ -172,7 +172,7 @@ pip.default( os_name = "windows", platform = "windows_aarch64", whl_abi_tags = [], # default to all ABIs - whl_platform_tags = ["win_amd64"], + whl_platform_tags = ["win_arm64"], ) # To fetch pip dependencies, use pip.parse. We can pass in various options, diff --git a/python/private/pypi/pip_repository.bzl b/python/private/pypi/pip_repository.bzl index e9a4c44da3..01d0178d0c 100644 --- a/python/private/pypi/pip_repository.bzl +++ b/python/private/pypi/pip_repository.bzl @@ -92,16 +92,6 @@ def _pip_repository_impl(rctx): requirements_osx = rctx.attr.requirements_darwin, requirements_windows = rctx.attr.requirements_windows, extra_pip_args = rctx.attr.extra_pip_args, - platforms = [ - "linux_aarch64", - "linux_arm", - "linux_ppc", - "linux_s390x", - "linux_x86_64", - "osx_aarch64", - "osx_x86_64", - "windows_x86_64", - ], ), extra_pip_args = rctx.attr.extra_pip_args, evaluate_markers = lambda rctx, requirements: evaluate_markers_py( diff --git a/python/private/pypi/requirements_files_by_platform.bzl b/python/private/pypi/requirements_files_by_platform.bzl index 356bd4416e..7cfdf8cdd8 100644 --- a/python/private/pypi/requirements_files_by_platform.bzl +++ b/python/private/pypi/requirements_files_by_platform.bzl @@ -96,7 +96,17 @@ def requirements_files_by_platform( requirements_linux = None, requirements_lock = None, requirements_windows = None, - platforms, + platforms = [], + default_platforms = [ + "linux_aarch64", + "linux_arm", + "linux_ppc", + "linux_s390x", + "linux_x86_64", + "osx_aarch64", + "osx_x86_64", + "windows_x86_64", + ], extra_pip_args = None, python_version = None, logger = None, @@ -117,6 +127,8 @@ def requirements_files_by_platform( specified. It should be of the form "3.x.x", platforms: {type}`list[str]` the list of human-friendly platform labels that should be used for the evaluation. + default_platforms: {type}`list[str]` the list of human-friendly platform labels + that will be used for wildcard evaluation. logger: repo_utils.logger or None, a simple struct to log diagnostic messages. fail_fn (Callable[[str], None]): A failure function used in testing failure cases. @@ -142,7 +154,10 @@ def requirements_files_by_platform( if logger: logger.debug(lambda: "Platforms from pip args: {}".format(platforms_from_args)) - default_platforms = platforms + default_platforms = [_platform(p, python_version) for p in default_platforms] + platforms = platforms or default_platforms + platforms = [_platform(p, python_version) for p in platforms] + default_platforms = [p for p in default_platforms if p in platforms] if platforms_from_args: lock_files = [ diff --git a/tests/pypi/hub_builder/hub_builder_tests.bzl b/tests/pypi/hub_builder/hub_builder_tests.bzl index ee6200a70a..a59e73e042 100644 --- a/tests/pypi/hub_builder/hub_builder_tests.bzl +++ b/tests/pypi/hub_builder/hub_builder_tests.bzl @@ -332,7 +332,9 @@ torch==2.4.1 ; platform_machine != 'x86_64' \ _parse( hub_name = "pypi", python_version = "3.15", - requirements_lock = "universal.txt", + requirements_by_platform = { + "universal.txt": "linux_aarch64,osx_aarch64,windows_aarch64,linux_x86_64,linux_x86_64_freethreaded", + }, ), ) pypi = builder.build() @@ -723,7 +725,9 @@ git_dep @ git+https://git.server/repo/project@deadbeefdeadbeef _parse( hub_name = "pypi", python_version = "3.15", - requirements_lock = "requirements.txt", + requirements_by_platform = { + "requirements.txt": "linux_aarch64,linux_x86_64,linux_x86_64_freethreaded,osx_aarch64,windows_aarch64", + }, experimental_index_url = "pypi.org", extra_pip_args = [ "--extra-args-for-sdist-building", @@ -938,18 +942,16 @@ optimum[onnxruntime-gpu]==1.17.1 ; sys_platform == 'linux' ) pypi = builder.build() - # FIXME @aignas 2025-09-07: we should expose the `optimum` package - pypi.exposed_packages().contains_exactly([]) + pypi.exposed_packages().contains_exactly(["optimum"]) pypi.group_map().contains_exactly({}) pypi.whl_map().contains_exactly({ "optimum": { - "pypi_315_optimum_linux_aarch64_linux_x86_64_linux_x86_64_freethreaded": [ + "pypi_315_optimum_linux_aarch64_linux_x86_64": [ whl_config_setting( version = "3.15", target_platforms = [ "cp315_linux_aarch64", "cp315_linux_x86_64", - "cp315_linux_x86_64_freethreaded", ], ), ], @@ -964,7 +966,7 @@ optimum[onnxruntime-gpu]==1.17.1 ; sys_platform == 'linux' }, }) pypi.whl_libraries().contains_exactly({ - "pypi_315_optimum_linux_aarch64_linux_x86_64_linux_x86_64_freethreaded": { + "pypi_315_optimum_linux_aarch64_linux_x86_64": { "config_load": "@pypi//:config.bzl", "dep_template": "@pypi//{name}:{target}", "python_interpreter_target": "unit_test_interpreter_target", @@ -1019,7 +1021,9 @@ optimum[onnxruntime-gpu]==1.17.1 ; sys_platform == 'linux' _parse( hub_name = "pypi", python_version = "3.15", - requirements_lock = "universal.txt", + requirements_by_platform = { + "universal.txt": "mylinuxx86_64,myosxaarch64", + }, ), ) pypi = builder.build() diff --git a/tests/pypi/requirements_files_by_platform/requirements_files_by_platform_tests.bzl b/tests/pypi/requirements_files_by_platform/requirements_files_by_platform_tests.bzl index 6688d72ffe..bff2eca983 100644 --- a/tests/pypi/requirements_files_by_platform/requirements_files_by_platform_tests.bzl +++ b/tests/pypi/requirements_files_by_platform/requirements_files_by_platform_tests.bzl @@ -103,6 +103,33 @@ def _test_simple(env): _tests.append(_test_simple) +def _test_simple_default_platforms(env): + default_platforms = [ + "linux_aarch64", + "linux_x86_64", + "osx_aarch64", + "windows_x86_64", + ] + for got in [ + requirements_files_by_platform( + requirements_lock = "requirements_lock", + default_platforms = default_platforms, + platforms = [], + ), + requirements_files_by_platform( + requirements_by_platform = { + "requirements_lock": "*", + }, + default_platforms = default_platforms, + platforms = [], + ), + ]: + env.expect.that_dict(got).contains_exactly({ + "requirements_lock": default_platforms, + }) + +_tests.append(_test_simple_default_platforms) + def _test_simple_limited(env): for got in [ requirements_files_by_platform(