From 06b90f9b693b43a007ee2c20f5e7a98595bd8721 Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Tue, 14 May 2019 15:58:58 -0700 Subject: Split upb_proto_library.bzl into its own .bzl file. --- build_defs.bzl | 324 +++++---------------------------------------------------- 1 file changed, 27 insertions(+), 297 deletions(-) (limited to 'build_defs.bzl') diff --git a/build_defs.bzl b/build_defs.bzl index f62f42f..44ef0a3 100644 --- a/build_defs.bzl +++ b/build_defs.bzl @@ -1,14 +1,31 @@ -load("@bazel_skylib//lib:paths.bzl", "paths") -load("@bazel_skylib//lib:versions.bzl", "versions") -load("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain") +"""Internal rules for building upb.""" -# copybara:strip_for_google3_begin -load("@bazel_version//:bazel_version.bzl", "bazel_version") -# copybara:strip_end +load(":upb_proto_library.bzl", "GeneratedSrcs") def _librule(name): return name + "_lib" +def _get_real_short_path(file): + # For some reason, files from other archives have short paths that look like: + # ../com_google_protobuf/google/protobuf/descriptor.proto + short_path = file.short_path + if short_path.startswith("../"): + second_slash = short_path.index("/", 3) + short_path = short_path[second_slash + 1:] + return short_path + +def _get_real_root(file): + real_short_path = _get_real_short_path(file) + return file.path[:-len(real_short_path) - 1] + +def _get_real_roots(files): + roots = {} + for file in files: + real_root = _get_real_root(file) + if real_root: + roots[real_root] = True + return roots.keys() + def lua_cclibrary(name, srcs, hdrs = [], deps = [], luadeps = []): lib_rule = name + "_lib" so_rule = "lib" + name + ".so" @@ -157,8 +174,9 @@ SrcList = provider( ) def _file_list_aspect_impl(target, ctx): - if SrcList in target: - return [] + if GeneratedSrcs in target: + srcs = target[GeneratedSrcs] + return [SrcList(srcs = srcs.srcs, hdrs = srcs.hdrs)] srcs = [] hdrs = [] @@ -188,6 +206,7 @@ def _upb_amalgamation(ctx): progress_message = "Making amalgamation", executable = ctx.executable.amalgamator, ) + return [] upb_amalgamation = rule( attrs = { @@ -201,295 +220,6 @@ upb_amalgamation = rule( implementation = _upb_amalgamation, ) -is_bazel = not hasattr(native, "genmpm") - -def _get_real_short_path(file): - # For some reason, files from other archives have short paths that look like: - # ../com_google_protobuf/google/protobuf/descriptor.proto - short_path = file.short_path - if short_path.startswith("../"): - second_slash = short_path.index("/", 3) - short_path = short_path[second_slash + 1:] - return short_path - -def _get_real_root(file): - real_short_path = _get_real_short_path(file) - return file.path[:-len(real_short_path) - 1] - -def _get_real_roots(files): - roots = {} - for file in files: - real_root = _get_real_root(file) - if real_root: - roots[real_root] = True - return roots.keys() - -def _generate_output_file(ctx, src, extension): - if is_bazel: - real_short_path = _get_real_short_path(src) - else: - real_short_path = paths.relativize(src.short_path, ctx.label.package) - output_filename = paths.replace_extension(real_short_path, extension) - ret = ctx.new_file(ctx.genfiles_dir, output_filename) - return ret - -def filter_none(elems): - out = [] - for elem in elems: - if elem: - out.append(elem) - return out - -# upb_proto_library() rule - -def cc_library_func(ctx, name, hdrs, srcs, dep_ccinfos): - compilation_contexts = [info.compilation_context for info in dep_ccinfos] - linking_contexts = [info.linking_context for info in dep_ccinfos] - toolchain = find_cpp_toolchain(ctx) - feature_configuration = cc_common.configure_features( - cc_toolchain = toolchain, - requested_features = ctx.features, - unsupported_features = ctx.disabled_features, - ) - - # copybara:strip_for_google3_begin - if bazel_version == "0.24.1": - # Compatibility code until gRPC is on 0.25.2 or later. - compilation_info = cc_common.compile( - ctx = ctx, - feature_configuration = feature_configuration, - cc_toolchain = toolchain, - srcs = srcs, - hdrs = hdrs, - compilation_contexts = compilation_contexts, - ) - linking_info = cc_common.link( - ctx = ctx, - feature_configuration = feature_configuration, - cc_toolchain = toolchain, - cc_compilation_outputs = compilation_info.cc_compilation_outputs, - linking_contexts = linking_contexts, - ) - return CcInfo( - compilation_context = compilation_info.compilation_context, - linking_context = linking_info.linking_context, - ) - - if not versions.is_at_least("0.25.2", bazel_version): - fail("upb requires Bazel >=0.25.2 or 0.24.1") - - # copybara:strip_end - - blaze_only_args = {} - - if not is_bazel: - blaze_only_args["grep_includes"] = ctx.file._grep_includes - - (compilation_context, compilation_outputs) = cc_common.compile( - actions = ctx.actions, - feature_configuration = feature_configuration, - cc_toolchain = toolchain, - name = name, - srcs = srcs, - public_hdrs = hdrs, - compilation_contexts = compilation_contexts, - **blaze_only_args - ) - (linking_context, linking_outputs) = cc_common.create_linking_context_from_compilation_outputs( - actions = ctx.actions, - name = name, - feature_configuration = feature_configuration, - cc_toolchain = toolchain, - compilation_outputs = compilation_outputs, - linking_contexts = linking_contexts, - **blaze_only_args - ) - - return CcInfo( - compilation_context = compilation_context, - linking_context = linking_context, - ) - -def _compile_upb_protos(ctx, proto_info, proto_sources, ext): - srcs = [_generate_output_file(ctx, name, ext + ".c") for name in proto_sources] - hdrs = [_generate_output_file(ctx, name, ext + ".h") for name in proto_sources] - transitive_sets = list(proto_info.transitive_descriptor_sets) - ctx.actions.run( - inputs = depset( - direct = [ctx.executable._upbc, proto_info.direct_descriptor_set], - transitive = [proto_info.transitive_descriptor_sets], - ), - outputs = srcs + hdrs, - executable = ctx.executable._protoc, - arguments = [ - "--upb_out=" + _get_real_root(srcs[0]), - "--plugin=protoc-gen-upb=" + ctx.executable._upbc.path, - "--descriptor_set_in=" + ":".join([f.path for f in transitive_sets]), - ] + - [_get_real_short_path(file) for file in proto_sources], - progress_message = "Generating upb protos for :" + ctx.label.name, - ) - return SrcList(srcs = srcs, hdrs = hdrs) - -# upb_proto_library() shared code ############################################# - -_WrappedCcInfo = provider(fields = ["cc_info"]) - -def _upb_proto_rule_impl(ctx): - if len(ctx.attr.deps) != 1: - fail("only one deps dependency allowed.") - dep = ctx.attr.deps[0] - if _WrappedCcInfo not in dep: - fail("proto_library rule must generate _WrappedCcInfo (aspect should have handled this).") - cc_info = dep[_WrappedCcInfo].cc_info - lib = cc_info.linking_context.libraries_to_link[0] - files = filter_none([ - lib.static_library, - lib.pic_static_library, - lib.dynamic_library, - ]) - return [ - DefaultInfo(files = depset(files)), - cc_info, - ] - -def _upb_proto_aspect_impl(target, ctx): - proto_info = target[ProtoInfo] - files = _compile_upb_protos(ctx, proto_info, proto_info.direct_sources, ctx.attr._ext) - deps = ctx.rule.attr.deps + ctx.attr._upb - dep_ccinfos = [dep[CcInfo] for dep in deps if CcInfo in dep] - dep_ccinfos += [dep[_WrappedCcInfo].cc_info for dep in deps if _WrappedCcInfo in dep] - cc_info = cc_library_func( - ctx = ctx, - name = ctx.rule.attr.name + ctx.attr._ext, - hdrs = files.hdrs, - srcs = files.srcs, - dep_ccinfos = dep_ccinfos, - ) - return [_WrappedCcInfo(cc_info = cc_info)] - -def maybe_add(d): - if not is_bazel: - d["_grep_includes"] = attr.label( - allow_single_file = True, - cfg = "host", - default = "//tools/cpp:grep-includes", - ) - return d - -# upb_proto_library() ########################################################## - -_upb_proto_library_aspect = aspect( - attrs = maybe_add({ - "_upbc": attr.label( - executable = True, - cfg = "host", - default = ":protoc-gen-upb", - ), - "_protoc": attr.label( - executable = True, - cfg = "host", - default = "@com_google_protobuf//:protoc", - ), - "_cc_toolchain": attr.label( - default = "@bazel_tools//tools/cpp:current_cc_toolchain", - ), - "_upb": attr.label_list(default = [":upb"]), - "_ext": attr.string(default = ".upb"), - }), - implementation = _upb_proto_aspect_impl, - attr_aspects = ["deps"], - fragments = ["cpp"], -) - -upb_proto_library = rule( - output_to_genfiles = True, - implementation = _upb_proto_rule_impl, - attrs = { - "deps": attr.label_list( - aspects = [_upb_proto_library_aspect], - allow_rules = ["proto_library"], - providers = [ProtoInfo], - ), - }, -) - -# upb_proto_reflection_library() ############################################### - -_upb_proto_reflection_library_aspect = aspect( - attrs = maybe_add({ - "_upbc": attr.label( - executable = True, - cfg = "host", - default = ":protoc-gen-upb", - ), - "_protoc": attr.label( - executable = True, - cfg = "host", - default = "@com_google_protobuf//:protoc", - ), - "_cc_toolchain": attr.label( - default = "@bazel_tools//tools/cpp:current_cc_toolchain", - ), - "_upb": attr.label_list( - default = [ - ":upb", - ":reflection", - ], - ), - "_ext": attr.string(default = ".upbdefs"), - }), - implementation = _upb_proto_aspect_impl, - attr_aspects = ["deps"], - fragments = ["cpp"], -) - -upb_proto_reflection_library = rule( - output_to_genfiles = True, - implementation = _upb_proto_rule_impl, - attrs = { - "deps": attr.label_list( - aspects = [_upb_proto_reflection_library_aspect], - allow_rules = ["proto_library"], - providers = [ProtoInfo], - ), - }, -) - -# upb_proto_srcs() ############################################################# - -def _upb_proto_srcs_impl(ctx): - srcs = [] - hdrs = [] - for dep in ctx.attr.deps: - if hasattr(dep, "proto"): - proto_info = dep[ProtoInfo] - files = _compile_upb_protos(ctx, proto_info, proto_info.transitive_sources, ctx.attr.ext) - srcs += files.srcs - hdrs += files.hdrs - return [ - SrcList(srcs = srcs, hdrs = hdrs), - DefaultInfo(files = depset(srcs + hdrs)), - ] - -upb_proto_srcs = rule( - attrs = { - "_upbc": attr.label( - executable = True, - cfg = "host", - default = ":protoc-gen-upb", - ), - "_protoc": attr.label( - executable = True, - cfg = "host", - default = "@com_google_protobuf//:protoc", - ), - "deps": attr.label_list(), - "ext": attr.string(default = ".upb"), - }, - implementation = _upb_proto_srcs_impl, -) - def licenses(*args): # No-op (for Google-internal usage). pass -- cgit v1.2.3