diff --git a/src/main/starlark/builtins_bzl/common/cc/cc_import.bzl b/src/main/starlark/builtins_bzl/common/cc/cc_import.bzl index babfb2b40c989e..c0d028d8196d75 100644 --- a/src/main/starlark/builtins_bzl/common/cc/cc_import.bzl +++ b/src/main/starlark/builtins_bzl/common/cc/cc_import.bzl @@ -220,6 +220,7 @@ cc_import = rule( ), "_cc_toolchain": attr.label(default = "@" + semantics.get_repo() + "//tools/cpp:current_cc_toolchain"), }, + provides = [CcInfo], toolchains = cc_helper.use_cpp_toolchain(), fragments = ["cpp"], incompatible_use_toolchain_transition = True, diff --git a/src/main/starlark/builtins_bzl/common/cc/cc_proto_library.bzl b/src/main/starlark/builtins_bzl/common/cc/cc_proto_library.bzl index 4adc336e91998f..9ebeece82d5804 100644 --- a/src/main/starlark/builtins_bzl/common/cc/cc_proto_library.bzl +++ b/src/main/starlark/builtins_bzl/common/cc/cc_proto_library.bzl @@ -294,4 +294,5 @@ cc_proto_library = rule( allow_files = False, ), }, + provides = [CcInfo], ) diff --git a/src/main/starlark/builtins_bzl/common/cc/experimental_cc_shared_library.bzl b/src/main/starlark/builtins_bzl/common/cc/experimental_cc_shared_library.bzl index 5972527b79876e..5755f77ddabf4f 100644 --- a/src/main/starlark/builtins_bzl/common/cc/experimental_cc_shared_library.bzl +++ b/src/main/starlark/builtins_bzl/common/cc/experimental_cc_shared_library.bzl @@ -21,6 +21,7 @@ rely on this. It requires bazel >1.2 and passing the flag load(":common/cc/cc_helper.bzl", "cc_helper") load(":common/cc/semantics.bzl", "semantics") +load(":common/proto/proto_info.bzl", "ProtoInfo") CcInfo = _builtins.toplevel.CcInfo cc_common = _builtins.toplevel.cc_common @@ -620,11 +621,17 @@ def _cc_shared_library_impl(ctx): def _graph_structure_aspect_impl(target, ctx): children = [] - # For now ignore cases when deps is of type label instead of label_list. - if hasattr(ctx.rule.attr, "deps") and type(ctx.rule.attr.deps) != "Target": - for dep in ctx.rule.attr.deps: - if GraphNodeInfo in dep: - children.append(dep[GraphNodeInfo]) + # Collect graph structure info from any possible deplike attribute. The aspect + # itself applies across every deplike attribute (attr_aspects is *), so enumerate + # over all attributes and consume GraphNodeInfo if available. + for fieldname in dir(ctx.rule.attr): + deps = getattr(ctx.rule.attr, fieldname, None) + if type(deps) == "list": + for dep in deps: + if type(dep) == "Target" and GraphNodeInfo in dep: + children.append(dep[GraphNodeInfo]) + elif type(deps) == "Target" and GraphNodeInfo in deps: + children.append(deps[GraphNodeInfo]) # TODO(bazel-team): Add flag to Bazel that can toggle the initialization of # linkable_more_than_once. @@ -659,6 +666,8 @@ def _cc_shared_library_permissions_impl(ctx): graph_structure_aspect = aspect( attr_aspects = ["*"], + required_providers = [[CcInfo], [ProtoInfo]], + required_aspect_providers = [[CcInfo]], implementation = _graph_structure_aspect_impl, ) diff --git a/src/main/starlark/tests/builtins_bzl/cc/cc_shared_library/test_cc_shared_library/BUILD.builtin_test b/src/main/starlark/tests/builtins_bzl/cc/cc_shared_library/test_cc_shared_library/BUILD.builtin_test index e9bc51e9fae11c..39d4021453008e 100644 --- a/src/main/starlark/tests/builtins_bzl/cc/cc_shared_library/test_cc_shared_library/BUILD.builtin_test +++ b/src/main/starlark/tests/builtins_bzl/cc/cc_shared_library/test_cc_shared_library/BUILD.builtin_test @@ -36,9 +36,15 @@ cc_binary( name = "binary", srcs = ["main.cc"], dynamic_deps = ["foo_so"], - deps = ["foo"], + deps = [ + ":foo", + ], ) +# TODO(bazel-team): Add a test for proto dependencies once these tests are run +# directly from a BUILD file and not from within a shell test. Right now +# mocking what's needed to have a single proto dependency makes it impractical. + cc_binary( name = "binary_with_bar_so_twice", srcs = ["main.cc"], @@ -331,8 +337,8 @@ build_failure_test( cc_library( name = "prebuilt", + hdrs = ["direct_so_file_cc_lib.h"], srcs = [ - "direct_so_file_cc_lib.h", ":just_main_output", ], )