1"""upb_c_proto_library() exposes upb's generated C API for protobuf (foo.upb.h)""" 2 3load("//bazel:upb_minitable_proto_library.bzl", "UpbMinitableCcInfo", "upb_minitable_proto_library_aspect") 4load("//bazel/common:proto_info.bzl", "ProtoInfo") 5load("//bazel/private:upb_proto_library_internal/aspect.bzl", "upb_proto_aspect_impl") 6load("//bazel/private:upb_proto_library_internal/cc_library_func.bzl", "upb_use_cpp_toolchain") 7load("//bazel/private:upb_proto_library_internal/rule.bzl", "upb_proto_rule_impl") 8 9UpbWrappedCcInfo = provider( 10 "Provider for cc_info for protos", 11 fields = ["cc_info"], 12) 13 14_UpbWrappedGeneratedSrcsInfo = provider( 15 "Provider for generated sources", 16 fields = ["srcs"], 17) 18 19def _upb_c_proto_library_aspect_impl(target, ctx): 20 return upb_proto_aspect_impl( 21 target = target, 22 ctx = ctx, 23 generator = "upb", 24 cc_provider = UpbWrappedCcInfo, 25 dep_cc_provider = UpbMinitableCcInfo, 26 file_provider = _UpbWrappedGeneratedSrcsInfo, 27 provide_cc_shared_library_hints = False, 28 ) 29 30upb_c_proto_library_aspect = aspect( 31 attrs = { 32 "_copts": attr.label( 33 default = "//upb:upb_proto_library_copts__for_generated_code_only_do_not_use", 34 ), 35 "_upb_toolchain": attr.label( 36 default = Label("//upb_generator/c:toolchain"), 37 ), 38 "_cc_toolchain": attr.label( 39 default = "@bazel_tools//tools/cpp:current_cc_toolchain", 40 ), 41 }, 42 implementation = _upb_c_proto_library_aspect_impl, 43 requires = [upb_minitable_proto_library_aspect], 44 required_aspect_providers = [UpbMinitableCcInfo], 45 provides = [ 46 UpbWrappedCcInfo, 47 _UpbWrappedGeneratedSrcsInfo, 48 ], 49 attr_aspects = ["deps"], 50 fragments = ["cpp"], 51 toolchains = upb_use_cpp_toolchain(), 52 exec_groups = { 53 "proto_compiler": exec_group(), 54 }, 55) 56 57def _upb_c_proto_library_rule_impl(ctx): 58 return upb_proto_rule_impl(ctx, UpbWrappedCcInfo, _UpbWrappedGeneratedSrcsInfo) 59 60upb_c_proto_library = rule( 61 implementation = _upb_c_proto_library_rule_impl, 62 attrs = { 63 "deps": attr.label_list( 64 aspects = [upb_c_proto_library_aspect], 65 allow_rules = ["proto_library"], 66 providers = [ProtoInfo], 67 ), 68 }, 69 provides = [CcInfo], 70) 71