-
Notifications
You must be signed in to change notification settings - Fork 4.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
python: Add provides = [PyInfo]
to py_library/py_binary/py_test
#20436
python: Add provides = [PyInfo]
to py_library/py_binary/py_test
#20436
Conversation
How do I rerun the checks? It seems to fail for a flaky infrastructure error:
|
@stagnation reran it - looks good now. |
Thank you! |
provides = [PyInfo]
to py_library
and py_binary
provides = [PyInfo]
to py_library/py_binary/py_test
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Huh. I'm not too surprised py_binary/py_test weren't advertising PyInfo, but I don't know how py_library managed to not advertise that.
src/main/starlark/builtins_bzl/common/python/py_binary_bazel.bzl
Outdated
Show resolved
Hide resolved
2230b8c
to
6a8c7e9
Compare
6a8c7e9
to
59e8fb4
Compare
I think the tests are flaky again, can we retrigger them? It is harder for me to understand what the error is this time, but I guess that it can't download deps, and then some tests fails
|
5a94bea
to
dbbcd8e
Compare
Can I have another review round please? |
@rickeylev: I cannot seem to remove the "Awaiting User Response" label |
Friendly ping :) |
dbbcd8e
to
48d1788
Compare
Rebased |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, but note that python rules are in rules_python. This is only going to matter if you're still using the builtin rules, which are deprecated and due to be removed (replaced by rules_python)
This is required for aspects to propagate along python libraries (and binaries) with `required_providers` set. Otherwise the aspect terminates on the top-level target. This follows from/was inspired by #19609 where the `CcInfo` was added to `cc_binary` targets. The `cc_library` does provide `CcInfo` so an aspect can successfully propagate the `cc_library` tree. Also related: #17214 <details> <summary>Reproduction example to show the problem with py targets</summary> ``` #!/bin/sh set -eu dir=${1:-$(mktemp -d)} # "$dir"/BUILD.bazel {{{ cat > "$dir"/BUILD.bazel <<'EOF' # stack a high dependency tree py_binary( name = "base_py", srcs = ["base.py"], main = "base.py", ) py_library( name = "stack_0_py", srcs = ["extra.py"], deps = ["//:base_py"], ) [ py_library( name = "stack_{}_py".format(index), srcs = ["extra.py"], deps = [":stack_{}_py".format(index - 1)], ) for index in range(1, 2) ] cc_library( name = "base_cc", srcs = ["base.c"], ) cc_library( name = "stack_0_cc", srcs = ["extra.c"], deps = ["//:base_cc"], ) [ cc_library( name = "stack_{}_cc".format(index), srcs = ["extra.c"], deps = [":stack_{}_cc".format(index - 1)], ) for index in range(1, 2) ] EOF # }}} # "$dir"/file_count.bzl {{{ cat > "$dir"/file_count.bzl <<'EOF' FileCountInfo = provider( 'count', fields = { 'count' : 'number of files' } ) def _file_count_aspect_impl(_, ctx): name = ctx.rule.attr.name count = 0 # Make sure the rule has a srcs attribute. if hasattr(ctx.rule.attr, 'srcs'): # Iterate through the sources counting files for src in ctx.rule.attr.srcs: for _ in src.files.to_list(): count = count + 1 # Get the counts from our dependencies. for dep in ctx.rule.attr.deps: if FileCountInfo in dep: count = count + dep[FileCountInfo].count print(name, count) return [FileCountInfo(count = count)] ok = aspect( implementation = _file_count_aspect_impl, attr_aspects = ['deps'], ) required = aspect( implementation = _file_count_aspect_impl, required_providers = [ [PyInfo], [CcInfo], ], attr_aspects = ['deps'], ) EOF # }}} touch "$dir"/WORKSPACE touch "$dir"/base.py touch "$dir"/extra.py touch "$dir"/base.c touch "$dir"/extra.c echo Reproducing in "$dir" cd "$dir" || exit 1 bazelisk --version echo "[Python] First print the succesfull traversal with transient target, and accumulating count" ( set -x bazelisk build \ --ui_event_filters=-info --noshow_progress --noshow_loading_progress \ --show_result=0 \ --aspects=//:file_count.bzl%ok //:stack_1_py set +x ) echo "[Python] Now add 'required_providers', and the transitive dependencies disappear." ( set -x bazelisk build \ --ui_event_filters=-info --noshow_progress --noshow_loading_progress \ --show_result=0 \ --aspects=//:file_count.bzl%required //:stack_1_py set +x ) echo "[CC] Both works for cc_library" ( set -x bazelisk build \ --ui_event_filters=-info --noshow_progress --noshow_loading_progress \ --show_result=0 \ --aspects=//:file_count.bzl%ok //:stack_1_cc bazelisk build \ --ui_event_filters=-info --noshow_progress --noshow_loading_progress \ --show_result=0 \ --aspects=//:file_count.bzl%required //:stack_1_cc set +x ) ``` Output: ``` $ env USE_BAZEL_VERSION=7.0.0rc5 sh reproduction-aspect-required-provider. sh aspect-required-provider/ Reproducing in aspect-required-provider/ bazel 7.0.0rc5 [Python] First print the succesfull traversal with transient target, and accumulating count + bazelisk build --ui_event_filters=-info --noshow_progress --noshow_loading_progress --aspects=//:file_count.bzl%ok //:stack_1_py Starting local Bazel server and connecting to it... DEBUG: /home/nils/task/reproductions/aspect-required-provider/file_count.bzl:22:10: base_py 1 DEBUG: /home/nils/task/reproductions/aspect-required-provider/file_count.bzl:22:10: stack_0_py 2 DEBUG: /home/nils/task/reproductions/aspect-required-provider/file_count.bzl:22:10: stack_1_py 3 + set +x [Python] Now add 'required_providers', and the transitive dependencies disappear. + bazelisk build --ui_event_filters=-info --noshow_progress --noshow_loading_progress --aspects=//:file_count.bzl%required //:stack_1_py DEBUG: /home/nils/task/reproductions/aspect-required-provider/file_count.bzl:22:10: stack_1_py 1 + set +x [CC] Both works for cc_library + bazelisk build --ui_event_filters=-info --noshow_progress --noshow_loading_progress --aspects=//:file_count.bzl%ok //:stack_1_cc DEBUG: /home/nils/task/reproductions/aspect-required-provider/file_count.bzl:22:10: base_cc 1 DEBUG: /home/nils/task/reproductions/aspect-required-provider/file_count.bzl:22:10: stack_0_cc 2 DEBUG: /home/nils/task/reproductions/aspect-required-provider/file_count.bzl:22:10: stack_1_cc 3 + bazelisk build --ui_event_filters=-info --noshow_progress --noshow_loading_progress --aspects=//:file_count.bzl%required //:stack_1_cc DEBUG: /home/nils/task/reproductions/aspect-required-provider/file_count.bzl:22:10: base_cc 1 DEBUG: /home/nils/task/reproductions/aspect-required-provider/file_count.bzl:22:10: stack_0_cc 2 DEBUG: /home/nils/task/reproductions/aspect-required-provider/file_count.bzl:22:10: stack_1_cc 3 ``` </details> Closes #20436. PiperOrigin-RevId: 677997144 Change-Id: Id2f75db10447b334a9d5ec9872e15f490ae44927
This is required for aspects to propagate along python libraries (and binaries) with
required_providers
set.Otherwise the aspect terminates on the top-level target. This follows from/was inspired by #19609 where the
CcInfo
was added tocc_binary
targets.The
cc_library
does provideCcInfo
so an aspect can successfully propagate thecc_library
tree.Also related: #17214
Reproduction example to show the problem with py targets
Output: