Refactored upb_proto_library() aspect for greater clarity

We define merge functions to handle the alias library case.

PiperOrigin-RevId: 547561043
pull/13171/head
Joshua Haberman 2 years ago committed by Copybara-Service
parent 79af13abde
commit 298de3d771
  1. 191
      bazel/upb_proto_library.bzl

@ -190,7 +190,32 @@ GeneratedSrcsInfo = provider(
}, },
) )
def _concat_lists(lists):
ret = []
for lst in lists:
ret = ret + lst
return ret
def _merge_generated_srcs(srcs):
return GeneratedSrcsInfo(
srcs = _concat_lists([s.srcs for s in srcs]),
hdrs = _concat_lists([s.hdrs for s in srcs]),
thunks = _concat_lists([s.thunks for s in srcs]),
includes = _concat_lists([s.includes for s in srcs]),
)
UpbWrappedCcInfo = provider("Provider for cc_info for protos", fields = ["cc_info", "cc_info_with_thunks"]) UpbWrappedCcInfo = provider("Provider for cc_info for protos", fields = ["cc_info", "cc_info_with_thunks"])
def _merge_wrapped_cc_infos(infos, cc_infos):
return UpbWrappedCcInfo(
cc_info = cc_common.merge_cc_infos(
direct_cc_infos = cc_infos + [info.cc_info for info in infos],
),
cc_info_with_thunks = cc_common.merge_cc_infos(
direct_cc_infos = [info.cc_info_with_thunks for info in infos],
),
)
_UpbDefsWrappedCcInfo = provider("Provider for cc_info for protos", fields = ["cc_info"]) _UpbDefsWrappedCcInfo = provider("Provider for cc_info for protos", fields = ["cc_info"])
_UpbWrappedGeneratedSrcsInfo = provider("Provider for generated sources", fields = ["srcs"]) _UpbWrappedGeneratedSrcsInfo = provider("Provider for generated sources", fields = ["srcs"])
_WrappedDefsGeneratedSrcsInfo = provider( _WrappedDefsGeneratedSrcsInfo = provider(
@ -198,7 +223,7 @@ _WrappedDefsGeneratedSrcsInfo = provider(
fields = ["srcs"], fields = ["srcs"],
) )
def _compile_upb_protos(ctx, generator, proto_info, proto_sources): def _generate_upb_protos(ctx, generator, proto_info, proto_sources):
if len(proto_sources) == 0: if len(proto_sources) == 0:
return GeneratedSrcsInfo(srcs = [], hdrs = [], thunks = [], includes = []) return GeneratedSrcsInfo(srcs = [], hdrs = [], thunks = [], includes = [])
@ -288,91 +313,50 @@ def _generate_name(ctx, generator, thunks = False):
return ctx.rule.attr.name + "." + generator + ".thunks" return ctx.rule.attr.name + "." + generator + ".thunks"
return ctx.rule.attr.name + "." + generator return ctx.rule.attr.name + "." + generator
def _upb_proto_aspect_impl(target, ctx, generator, cc_provider, file_provider, provide_cc_shared_library_hints = True): def _get_dep_cc_info(target, ctx, generator):
providers = [] deps = ctx.rule.attr.deps + getattr(ctx.attr, "_" + generator)
if not getattr(ctx.rule.attr, "srcs", []): dep_ccinfos = [dep[CcInfo] for dep in deps if CcInfo in dep]
# This target doesn't declare any sources, reexport all its deps instead. dep_ccinfos += [dep[_UpbDefsWrappedCcInfo].cc_info for dep in deps if _UpbDefsWrappedCcInfo in dep]
srcs = []
hdrs = [] dep_wrapped_infos = [dep[UpbWrappedCcInfo] for dep in deps if UpbWrappedCcInfo in dep]
thunks = [] if generator == "upbdefs":
includes = [] if UpbWrappedCcInfo not in target:
cc_infos = [] fail("Target should have UpbWrappedCcInfo provider")
cc_infos_with_thunks = [] dep_wrapped_infos.append(target[UpbWrappedCcInfo])
for dep in ctx.rule.attr.deps:
if CcInfo in dep: return _merge_wrapped_cc_infos(dep_wrapped_infos, dep_ccinfos)
cc_infos.append(dep[CcInfo])
if UpbWrappedCcInfo in dep: def _compile_upb_protos(ctx, files, generator, dep_wrapped_ccinfo, cc_provider):
cc_infos.append(dep[UpbWrappedCcInfo].cc_info) cc_info = _cc_library_func(
cc_infos_with_thunks.append(dep[UpbWrappedCcInfo].cc_info_with_thunks) ctx = ctx,
if _UpbDefsWrappedCcInfo in dep: name = _generate_name(ctx, generator),
cc_infos.append(dep[_UpbDefsWrappedCcInfo].cc_info) hdrs = files.hdrs,
srcs = files.srcs,
if _UpbWrappedGeneratedSrcsInfo in dep: includes = files.includes,
unwrapped_sources = dep[_UpbWrappedGeneratedSrcsInfo].srcs copts = ctx.attr._copts[UpbProtoLibraryCoptsInfo].copts,
srcs += unwrapped_sources.srcs dep_ccinfos = [dep_wrapped_ccinfo.cc_info],
hdrs += unwrapped_sources.hdrs )
thunks += unwrapped_sources.thunks
includes += unwrapped_sources.includes if files.thunks:
if _WrappedDefsGeneratedSrcsInfo in dep: cc_info_with_thunks = _cc_library_func(
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)
deps = ctx.rule.attr.deps + getattr(ctx.attr, "_" + generator)
dep_ccinfos = [dep[CcInfo] for dep in deps if CcInfo in dep]
dep_ccinfos += [dep[UpbWrappedCcInfo].cc_info for dep in deps if UpbWrappedCcInfo in dep]
dep_ccinfos += [dep[_UpbDefsWrappedCcInfo].cc_info for dep in deps if _UpbDefsWrappedCcInfo in dep]
if generator == "upbdefs":
if UpbWrappedCcInfo not in target:
fail("Target should have UpbWrappedCcInfo provider")
dep_ccinfos.append(target[UpbWrappedCcInfo].cc_info)
cc_info = _cc_library_func(
ctx = ctx, ctx = ctx,
name = _generate_name(ctx, generator), name = _generate_name(ctx, generator, files.thunks),
hdrs = files.hdrs, hdrs = [],
srcs = files.srcs, srcs = files.thunks,
includes = files.includes, includes = files.includes,
copts = ctx.attr._copts[UpbProtoLibraryCoptsInfo].copts, copts = ctx.attr._copts[UpbProtoLibraryCoptsInfo].copts,
dep_ccinfos = dep_ccinfos, dep_ccinfos = [dep_wrapped_ccinfo.cc_info, cc_info],
)
return cc_provider(
cc_info = cc_info,
cc_info_with_thunks = cc_info_with_thunks,
)
else:
return cc_provider(
cc_info = cc_info,
) )
if files.thunks: def _get_hint_providers(ctx, generator):
cc_info_with_thunks = _cc_library_func(
ctx = ctx,
name = _generate_name(ctx, generator, files.thunks),
hdrs = [],
srcs = files.thunks,
includes = files.includes,
copts = ctx.attr._copts[UpbProtoLibraryCoptsInfo].copts,
dep_ccinfos = dep_ccinfos + [cc_info],
)
wrapped_cc_info = cc_provider(
cc_info = cc_info,
cc_info_with_thunks = cc_info_with_thunks,
)
else:
wrapped_cc_info = cc_provider(
cc_info = cc_info,
)
providers += [
wrapped_cc_info,
file_provider(srcs = files),
]
if generator not in _GENERATORS: if generator not in _GENERATORS:
fail("Please add new generator '{}' to _GENERATORS list".format(generator)) fail("Please add new generator '{}' to _GENERATORS list".format(generator))
@ -381,13 +365,44 @@ def _upb_proto_aspect_impl(target, ctx, generator, cc_provider, file_provider, p
possible_owners.append(ctx.label.relative(_generate_name(ctx, generator))) possible_owners.append(ctx.label.relative(_generate_name(ctx, generator)))
possible_owners.append(ctx.label.relative(_generate_name(ctx, generator, thunks = True))) possible_owners.append(ctx.label.relative(_generate_name(ctx, generator, thunks = True)))
if provide_cc_shared_library_hints: if hasattr(cc_common, "CcSharedLibraryHintInfo"):
if hasattr(cc_common, "CcSharedLibraryHintInfo"): return [cc_common.CcSharedLibraryHintInfo(owners = possible_owners)]
providers.append(cc_common.CcSharedLibraryHintInfo(owners = possible_owners)) elif hasattr(cc_common, "CcSharedLibraryHintInfo_6_X_constructor_do_not_use"):
elif hasattr(cc_common, "CcSharedLibraryHintInfo_6_X_constructor_do_not_use"): # This branch can be deleted once 6.X is not supported by upb rules
# This branch can be deleted once 6.X is not supported by upb rules return [cc_common.CcSharedLibraryHintInfo_6_X_constructor_do_not_use(owners = possible_owners)]
providers.append(cc_common.CcSharedLibraryHintInfo_6_X_constructor_do_not_use(owners = possible_owners))
return providers return []
def _upb_proto_aspect_impl(target, ctx, generator, cc_provider, file_provider, provide_cc_shared_library_hints = True):
dep_wrapped_ccinfo = _get_dep_cc_info(target, ctx, generator)
if not getattr(ctx.rule.attr, "srcs", []):
# This target doesn't declare any sources, reexport all its deps instead.
# This is known as an "alias library":
# https://bazel.build/reference/be/protocol-buffer#proto_library.srcs
files = _merge_generated_srcs([dep[file_provider].srcs for dep in ctx.rule.attr.deps])
wrapped_cc_info = dep_wrapped_ccinfo
else:
proto_info = target[ProtoInfo]
files = _generate_upb_protos(
ctx,
generator,
proto_info,
proto_info.direct_sources,
)
wrapped_cc_info = _compile_upb_protos(
ctx,
files,
generator,
dep_wrapped_ccinfo,
cc_provider,
)
hints = _get_hint_providers(ctx, generator) if provide_cc_shared_library_hints else []
return hints + [
file_provider(srcs = files),
wrapped_cc_info,
]
_GENERATORS = ["upb", "upbdefs"] _GENERATORS = ["upb", "upbdefs"]

Loading…
Cancel
Save