Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions MODULE.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -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 [
Expand Down
2 changes: 1 addition & 1 deletion examples/bzlmod/MODULE.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
10 changes: 0 additions & 10 deletions python/private/pypi/pip_repository.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
19 changes: 17 additions & 2 deletions python/private/pypi/requirements_files_by_platform.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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.

Expand All @@ -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 = [
Expand Down
20 changes: 12 additions & 8 deletions tests/pypi/hub_builder/hub_builder_tests.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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",
],
),
],
Expand All @@ -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",
Expand Down Expand Up @@ -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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down