diff --git a/bazel/upb_proto_library.bzl b/bazel/upb_proto_library.bzl index 8d4f4b6ef6..6612ee8907 100644 --- a/bazel/upb_proto_library.bzl +++ b/bazel/upb_proto_library.bzl @@ -297,12 +297,42 @@ def _upb_proto_aspect_impl(target, ctx, generator, cc_provider, file_provider, p providers = [] if not getattr(ctx.rule.attr, "srcs", []): # This target doesn't declare any sources, reexport all its deps instead. - deps = ctx.rule.attr.deps - providers += [cc_provider(cc_info = dep[CcInfo]) for dep in deps if CcInfo in dep] - providers += [dep[UpbWrappedCcInfo] for dep in deps if UpbWrappedCcInfo in dep] - providers += [dep[_UpbDefsWrappedCcInfo] for dep in deps if _UpbDefsWrappedCcInfo in dep] - providers += [dep[_UpbWrappedGeneratedSrcsInfo] for dep in deps if _UpbWrappedGeneratedSrcsInfo in dep] - providers += [dep[_WrappedDefsGeneratedSrcsInfo] for dep in deps if _WrappedDefsGeneratedSrcsInfo in dep] + srcs = [] + hdrs = [] + thunks = [] + includes = [] + cc_infos = [] + cc_infos_with_thunks = [] + for dep in ctx.rule.attr.deps: + if CcInfo in dep: + cc_infos.append(dep[CcInfo]) + if UpbWrappedCcInfo in dep: + cc_infos.append(dep[UpbWrappedCcInfo].cc_info) + cc_infos_with_thunks.append(dep[UpbWrappedCcInfo].cc_info_with_thunks) + if _UpbDefsWrappedCcInfo in dep: + cc_infos.append(dep[_UpbDefsWrappedCcInfo].cc_info) + + if _UpbWrappedGeneratedSrcsInfo in dep: + unwrapped_sources = dep[_UpbWrappedGeneratedSrcsInfo].srcs + srcs += unwrapped_sources.srcs + hdrs += unwrapped_sources.hdrs + thunks += unwrapped_sources.thunks + includes += unwrapped_sources.includes + if _WrappedDefsGeneratedSrcsInfo in dep: + unwrapped_sources = dep[_WrappedDefsGeneratedSrcsInfo].srcs + srcs += unwrapped_sources.srcs + hdrs += unwrapped_sources.hdrs + thunks += unwrapped_sources.thunks + includes += unwrapped_sources.includes + + if len(cc_infos_with_thunks) > 0: + providers.append(cc_provider( + cc_info = cc_common.merge_cc_infos(direct_cc_infos = cc_infos), + cc_info_with_thunks = cc_common.merge_cc_infos(direct_cc_infos = cc_infos_with_thunks), + )) + else: + providers.append(cc_provider(cc_info = cc_common.merge_cc_infos(direct_cc_infos = cc_infos))) + providers.append(file_provider(srcs = GeneratedSrcsInfo(srcs = srcs, hdrs = hdrs, thunks = thunks, includes = includes))) else: proto_info = target[ProtoInfo] files = _compile_upb_protos(ctx, generator, proto_info, proto_info.direct_sources) diff --git a/upb/test/BUILD b/upb/test/BUILD index e8a0fb49a8..0d1fd7b724 100644 --- a/upb/test/BUILD +++ b/upb/test/BUILD @@ -217,11 +217,28 @@ proto_library( deps = [":test_proto"], ) +proto_library( + name = "empty_srcs_2_proto", + testonly = 1, + srcs = [], + deps = [":test_cpp_proto"], +) + +proto_library( + name = "empty_srcs_3_proto", + testonly = 1, + srcs = [], + deps = [ + ":empty_srcs_2_proto", + ":empty_srcs_proto", + ], +) + proto_library( name = "test_import_empty_srcs_proto", testonly = 1, srcs = ["test_import_empty_srcs.proto"], - deps = [":empty_srcs_proto"], + deps = [":empty_srcs_3_proto"], ) upb_proto_library( diff --git a/upb/test/test_import_empty_srcs.proto b/upb/test/test_import_empty_srcs.proto index 42a8874dcb..a1830bb94d 100644 --- a/upb/test/test_import_empty_srcs.proto +++ b/upb/test/test_import_empty_srcs.proto @@ -3,7 +3,9 @@ syntax = "proto2"; package upb_test; import "upb/test/test.proto"; +import "upb/test/test_cpp.proto"; message ContainsImported { optional MessageName message_name = 1; + optional upb.test.TestMessage test_message = 2; }