Skip to content

Commit 151d40f

Browse files
committed
fix(whl_library): fix the dependency generation for multi-python depenency closures
We start using the recently introduced is_python_config_setting to make it possible to have a working select statement when multiple python version selection needs to happen in a whl_library Work towards #735.
1 parent d3cec48 commit 151d40f

File tree

3 files changed

+42
-93
lines changed

3 files changed

+42
-93
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ A brief description of the categories of changes:
4646
See [#1371](https://github.com/bazelbuild/rules_python/issues/1371).
4747
* (refactor) The pre-commit developer workflow should now pass `isort` and `black`
4848
checks (see [#1674](https://github.com/bazelbuild/rules_python/issues/1674)).
49+
* (whl_library): Use `is_python_config_setting` to correctly handle multi-python
50+
version dependency select statements when the `experimental_target_platforms`
51+
includes the Python ABI.
4952

5053
### Added
5154

python/pip_install/private/generate_whl_library_build_bazel.bzl

Lines changed: 26 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,8 @@ def _render_list_and_select(deps, deps_by_platform, tmpl):
131131
return "{} + {}".format(deps, deps_by_platform)
132132

133133
def _render_config_settings(dependencies_by_platform):
134-
py_version_by_os_arch = {}
134+
loads = []
135+
additional_content = []
135136
for p in dependencies_by_platform:
136137
# p can be one of the following formats:
137138
# * @platforms//os:{value}
@@ -146,66 +147,45 @@ def _render_config_settings(dependencies_by_platform):
146147
if not abi.startswith("cp"):
147148
tail = p
148149
abi = ""
150+
149151
os, _, arch = tail.partition("_")
150152
os = "" if os == "anyos" else os
151153
arch = "" if arch == "anyarch" else arch
152154

153-
py_version_by_os_arch.setdefault((os, arch), []).append(abi)
154-
155-
if not py_version_by_os_arch:
156-
return None, None
157-
158-
loads = []
159-
additional_content = []
160-
for (os, arch), abis in py_version_by_os_arch.items():
161155
constraint_values = []
162-
if os:
163-
constraint_values.append("@platforms//os:{}".format(os))
164156
if arch:
165157
constraint_values.append("@platforms//cpu:{}".format(arch))
158+
if os:
159+
constraint_values.append("@platforms//os:{}".format(os))
166160

167-
os_arch = (os or "anyos") + "_" + (arch or "anyarch")
168-
additional_content.append(
169-
"""\
170-
config_setting(
161+
constraint_values_str = render.indent(render.list(constraint_values)).lstrip()
162+
163+
if abi and not loads:
164+
loads.append("""load("@rules_python//python/config_settings:config_settings.bzl", "is_python_config_setting")""")
165+
elif abi:
166+
additional_content.append(
167+
"""\
168+
is_python_config_setting(
171169
name = "is_{name}",
172-
constraint_values = {values},
170+
python_version = "3.{minor_version}",
171+
constraint_values = {constraint_values},
173172
visibility = ["//visibility:private"],
174173
)""".format(
175-
name = os_arch,
176-
values = render.indent(render.list(sorted([str(Label(c)) for c in constraint_values]))).strip(),
177-
),
178-
)
179-
180-
if abis == [""]:
181-
if not os or not arch:
182-
fail("BUG: both os and arch should be set in this case")
183-
continue
184-
185-
for abi in abis:
186-
if not loads:
187-
loads.append("""load("@bazel_skylib//lib:selects.bzl", "selects")""")
188-
minor_version = int(abi[len("cp3"):])
189-
setting = "@@{rules_python}//python/config_settings:is_python_3.{version}".format(
190-
rules_python = str(Label("//:BUILD.bazel")).partition("//")[0].strip("@"),
191-
version = minor_version,
174+
name = p.replace("cp3", "python_3."),
175+
minor_version = abi[len("cp3"):],
176+
constraint_values = constraint_values_str,
177+
),
192178
)
193-
settings = [
194-
":is_" + os_arch,
195-
setting,
196-
]
197-
198-
plat = "{}_{}".format(abi, os_arch)
199-
179+
else:
200180
additional_content.append(
201181
"""\
202-
selects.config_setting_group(
203-
name = "{name}",
204-
match_all = {values},
182+
config_setting(
183+
name = "is_{name}",
184+
constraint_values = {constraint_values},
205185
visibility = ["//visibility:private"],
206186
)""".format(
207-
name = _plat_label(plat).lstrip(":"),
208-
values = render.indent(render.list(sorted(settings))).strip(),
187+
name = p.replace("cp3", "python_3."),
188+
constraint_values = constraint_values_str,
209189
),
210190
)
211191

@@ -379,7 +359,7 @@ def generate_whl_library_build_bazel(
379359
contents = "\n".join(
380360
[
381361
_BUILD_TEMPLATE.format(
382-
loads = "\n".join(loads),
362+
loads = "\n".join(sorted(loads)),
383363
py_library_label = py_library_label,
384364
dependencies = render.indent(lib_dependencies, " " * 4).lstrip(),
385365
whl_file_deps = render.indent(whl_file_deps, " " * 4).lstrip(),

tests/pip_install/whl_library/generate_build_bazel_tests.bzl

Lines changed: 13 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ _tests = []
2121

2222
def _test_simple(env):
2323
want = """\
24-
load("@rules_python//python:defs.bzl", "py_library", "py_binary")
2524
load("@bazel_skylib//rules:copy_file.bzl", "copy_file")
25+
load("@rules_python//python:defs.bzl", "py_library", "py_binary")
2626
2727
package(default_visibility = ["//visibility:public"])
2828
@@ -86,9 +86,9 @@ _tests.append(_test_simple)
8686

8787
def _test_dep_selects(env):
8888
want = """\
89-
load("@rules_python//python:defs.bzl", "py_library", "py_binary")
9089
load("@bazel_skylib//rules:copy_file.bzl", "copy_file")
91-
load("@bazel_skylib//lib:selects.bzl", "selects")
90+
load("@rules_python//python/config_settings:config_settings.bzl", "is_python_config_setting")
91+
load("@rules_python//python:defs.bzl", "py_library", "py_binary")
9292
9393
package(default_visibility = ["//visibility:public"])
9494
@@ -158,54 +158,20 @@ py_library(
158158
visibility = ["//visibility:public"],
159159
)
160160
161-
config_setting(
162-
name = "is_linux_ppc",
163-
constraint_values = [
164-
"@platforms//cpu:ppc",
165-
"@platforms//os:linux",
166-
],
167-
visibility = ["//visibility:private"],
168-
)
169-
170-
selects.config_setting_group(
171-
name = "is_cp310_linux_ppc",
172-
match_all = [
173-
":is_linux_ppc",
174-
"@//python/config_settings:is_python_3.10",
175-
],
176-
visibility = ["//visibility:private"],
177-
)
178-
179-
config_setting(
180-
name = "is_anyos_aarch64",
161+
is_python_config_setting(
162+
name = "is_python_3.9_anyos_aarch64",
163+
python_version = "3.9",
181164
constraint_values = ["@platforms//cpu:aarch64"],
182165
visibility = ["//visibility:private"],
183166
)
184167
185-
selects.config_setting_group(
186-
name = "is_cp39_anyos_aarch64",
187-
match_all = [
188-
":is_anyos_aarch64",
189-
"@//python/config_settings:is_python_3.9",
190-
],
191-
visibility = ["//visibility:private"],
192-
)
193-
194-
config_setting(
195-
name = "is_linux_anyarch",
168+
is_python_config_setting(
169+
name = "is_python_3.9_linux_anyarch",
170+
python_version = "3.9",
196171
constraint_values = ["@platforms//os:linux"],
197172
visibility = ["//visibility:private"],
198173
)
199174
200-
selects.config_setting_group(
201-
name = "is_cp39_linux_anyarch",
202-
match_all = [
203-
":is_linux_anyarch",
204-
"@//python/config_settings:is_python_3.9",
205-
],
206-
visibility = ["//visibility:private"],
207-
)
208-
209175
config_setting(
210176
name = "is_linux_x86_64",
211177
constraint_values = [
@@ -239,8 +205,8 @@ _tests.append(_test_dep_selects)
239205

240206
def _test_with_annotation(env):
241207
want = """\
242-
load("@rules_python//python:defs.bzl", "py_library", "py_binary")
243208
load("@bazel_skylib//rules:copy_file.bzl", "copy_file")
209+
load("@rules_python//python:defs.bzl", "py_library", "py_binary")
244210
245211
package(default_visibility = ["//visibility:public"])
246212
@@ -327,8 +293,8 @@ _tests.append(_test_with_annotation)
327293

328294
def _test_with_entry_points(env):
329295
want = """\
330-
load("@rules_python//python:defs.bzl", "py_library", "py_binary")
331296
load("@bazel_skylib//rules:copy_file.bzl", "copy_file")
297+
load("@rules_python//python:defs.bzl", "py_library", "py_binary")
332298
333299
package(default_visibility = ["//visibility:public"])
334300
@@ -401,8 +367,8 @@ _tests.append(_test_with_entry_points)
401367

402368
def _test_group_member(env):
403369
want = """\
404-
load("@rules_python//python:defs.bzl", "py_library", "py_binary")
405370
load("@bazel_skylib//rules:copy_file.bzl", "copy_file")
371+
load("@rules_python//python:defs.bzl", "py_library", "py_binary")
406372
407373
package(default_visibility = ["//visibility:public"])
408374
@@ -503,8 +469,8 @@ _tests.append(_test_group_member)
503469

504470
def _test_group_member_deps_to_hub(env):
505471
want = """\
506-
load("@rules_python//python:defs.bzl", "py_library", "py_binary")
507472
load("@bazel_skylib//rules:copy_file.bzl", "copy_file")
473+
load("@rules_python//python:defs.bzl", "py_library", "py_binary")
508474
509475
package(default_visibility = ["//visibility:public"])
510476

0 commit comments

Comments
 (0)