"Illegal ambiguous match" error with `experimental_index_url`
🐞 bug report
Affected Rule
pip.parse
Is this a regression?
not sure
Description
When pip.parse with experimental_index_url uses per-platform requirements files and package versions don't match across files, it's possible (at least on OSX, for some packages) that using the package fails with "Illegal ambiguous match"
🔬 Minimal Reproduction
https://github.com/tbarrella/ambiguous
🔥 Exception or Error
Illegal ambiguous match on configurable attribute "actual" in @@rules_python++pip+pypi//debugpy:pkg:
@@rules_python++pip+pypi//_config:is_cp313_py_none_any_osx_aarch64
@@rules_python++pip+pypi//_config:is_cp313_cp313_osx_universal2
Multiple matches are not allowed unless one is unambiguously more specialized or they resolve to the same value. See https://bazel.build/reference/be/functions#select.
Illegal ambiguous match on configurable attribute "actual" in @@rules_python++pip+pypi//tornado:pkg:
@@rules_python++pip+pypi//_config:is_cp313_sdist_osx_aarch64
@@rules_python++pip+pypi//_config:is_cp313_abi3_osx_universal2
Multiple matches are not allowed unless one is unambiguously more specialized or they resolve to the same value. See https://bazel.build/reference/be/functions#select.
🌍 Your Environment
Operating System:
macOS, M2, 15.3.1
Output of bazel version:
Bazelisk version: 1.25.0
Build label: 8.1.1
Build target: @@//src/main/java/com/google/devtools/build/lib/bazel:BazelServer
Build time: Tue Feb 25 18:53:44 2025 (1740509624)
Build timestamp: 1740509624
Build timestamp as int: 1740509624
Rules_python version:
1.3.0
Anything else relevant?
- The root cause may be the same as #2648
- Workaround is to manually make the versions and hashes match when possible
The root cause of this is different from #2648.
The reproduction is trying to include different versions for different target platforms and it seems that it is failing due to us including more than what would be minimally necessary. I was already thinking about the fix for this but did not have time to do it but in quick terms here is what I am thinking about.
First select_whls is returning a list of compatible wheels with the target platform.
- the freethreaded/non-freethreaded
- manylinux/musllinux
- universal2 vs arch wheels
Instead of having all of them, we could just have one wheel that is matching the target platform.
However, the target platform definition is not customizable and in order to have it customizable, we have to first implement #2909. Once that is done, we can revisit this issue.
A workaround for this is to not use different versions for different target platforms or to remove the hashes for some of the requirements.
One trick to avoid ambiguous match is to use a chain of select-default, e.g
alias(
name = "x" actual = select({
":ft_yes": ...,
"//conditions:default": ":ft_no",
})
)
alias(
name = "ft_no", actual = select({
":linux": ...,
":mac": ...
})
)
But to be fully correct we would have to first select the target platform and only then the wheel based config setting.
That would be another solution to this problem.
I hit what I assume is this same issue but a different set of constraints:
ERROR: /private/var/tmp/_bazel_ksmiley/a685f717f9f5cebba0f54a5f41d6fcb3/external/rules_python++python+python_3_13/BUILD.bazel:27:18: Illegal ambiguous match on configurable attribute "actual" in @@rules_python++python+python_3_13//:python_headers:
@@rules_python++python+python_3_13//:aarch64-apple-darwin
@@rules_python++python+python_3_13//:aarch64-apple-darwin-freethreaded
another similar example on linux:
ERROR: /home/ubuntu/.cache/bazel/_bazel_ubuntu/df7f5566547a987550d6a5e4980fc00b/external/rules_python++python+python_3_9/BUILD.bazel:19:18: Illegal ambiguous match on configurable attribute "actual" in @@rules_python++python+python_3_9//:py3_runtime:
@@rules_python++python+python_3_9//:x86_64-unknown-linux-gnu
@@rules_python++python+python_3_9//:x86_64-unknown-linux-musl
I hit what I assume is this same issue but a different set of constraints:
@keith, this is a different issue, as this may happen without the experimental index url. Could you paste the config you have in a new ticket? We will have to solve the python toolchain aliases separately.
https://github.com/bazel-contrib/rules_python/issues/2993
I actually hit the original issue here too
A workaround for this is to not use different versions for different target platforms
in my case I am using this:
requirements_by_platform = {
"//:.../requirements.txt": "linux_x86_64",
},
but i am instantiating this repo for N python versions, is that the same case? I can probably come up with another repro
Could you please check if #3058 resolves the original issue?
seems to fix my case of it !