Replaced upb_proto_library() with a truly aspect-based rule.

pull/13171/head
Josh Haberman 6 years ago
parent cf35baa1ad
commit 02e26c5004
  1. 2
      BUILD
  2. 1
      WORKSPACE
  3. 164
      build_defs.bzl

@ -315,7 +315,6 @@ upb_proto_reflection_library(
upb_proto_library(
name = "test_json_upbproto",
upbc = ":protoc-gen-upb",
deps = ["test_json_proto"],
)
@ -334,7 +333,6 @@ cc_test(
upb_proto_library(
name = "conformance_proto_upb",
upbc = ":protoc-gen-upb",
deps = [
"@com_google_protobuf//:conformance_proto",
"@com_google_protobuf//:test_messages_proto3_proto",

@ -37,7 +37,6 @@ http_archive(
urls = ["http://www.colm.net/files/ragel/ragel-6.10.tar.gz"],
)
# Used by protobuf.
http_archive(
name = "bazel_skylib",
sha256 = "bbccf674aa441c266df9894182d80de104cabd19be98be002f6d478aaa31574d",

@ -23,6 +23,10 @@ _shell_find_runfiles = """
# --- end runfiles.bash initialization ---
"""
load("@bazel_skylib//lib:paths.bzl", "paths")
load("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain")
load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "CPP_LINK_STATIC_LIBRARY_ACTION_NAME")
def _librule(name):
return name + "_lib"
@ -273,35 +277,159 @@ def _upb_proto_library_srcs_impl(ctx):
def _upb_proto_reflection_library_srcs_impl(ctx):
return _upb_proto_srcs_impl(ctx, ".upbdefs")
_upb_proto_library_srcs = rule(
def _generate_output_files(ctx, package, file_names, file_types):
result = {}
for key in file_types.keys():
relative_paths = [paths.relativize(src.path, package) for src in file_names]
replaced_extensions = [paths.replace_extension(path, file_types[key]) for path in relative_paths]
result[key] = [ctx.new_file(ctx.genfiles_dir, file) for file in replaced_extensions]
return result
def cc_library_func(ctx, hdrs, srcs, deps):
compilation_contexts = []
linking_contexts = []
for dep in deps:
if CcInfo in dep:
compilation_contexts.append(dep[CcInfo].compilation_context)
linking_contexts.append(dep[CcInfo].linking_context)
toolchain = find_cpp_toolchain(ctx)
feature_configuration = cc_common.configure_features(
cc_toolchain = toolchain,
requested_features = ctx.features,
unsupported_features = ctx.disabled_features,
)
compilation_info = cc_common.compile(
ctx = ctx,
feature_configuration = feature_configuration,
cc_toolchain = toolchain,
srcs = srcs,
hdrs = hdrs,
compilation_contexts = compilation_contexts,
)
output_file = ctx.new_file(ctx.bin_dir, "lib" + ctx.rule.attr.name + ".a")
library_to_link = cc_common.create_library_to_link(
actions = ctx.actions,
feature_configuration = feature_configuration,
cc_toolchain = toolchain,
static_library = output_file,
)
linking_context = cc_common.create_linking_context(
libraries_to_link = [library_to_link],
)
archiver_path = cc_common.get_tool_for_action(
feature_configuration = feature_configuration,
action_name = CPP_LINK_STATIC_LIBRARY_ACTION_NAME,
)
archiver_variables = cc_common.create_link_variables(
feature_configuration = feature_configuration,
cc_toolchain = toolchain,
output_file = output_file.path,
is_using_linker = False,
)
command_line = cc_common.get_memory_inefficient_command_line(
feature_configuration = feature_configuration,
action_name = CPP_LINK_STATIC_LIBRARY_ACTION_NAME,
variables = archiver_variables,
)
object_files = compilation_info.cc_compilation_outputs.object_files(use_pic = False)
args = ctx.actions.args()
args.add_all(command_line)
args.add_all(object_files)
env = cc_common.get_environment_variables(
feature_configuration = feature_configuration,
action_name = CPP_LINK_STATIC_LIBRARY_ACTION_NAME,
variables = archiver_variables,
)
ctx.actions.run(
executable = archiver_path,
arguments = [args],
env = env,
inputs = depset(
direct = object_files,
transitive = [
# TODO: Use CcToolchainInfo getters when available
# See https://github.com/bazelbuild/bazel/issues/7427.
ctx.attr._cc_toolchain.files,
],
),
outputs = [output_file],
)
return [
CcInfo(
compilation_context = compilation_info.compilation_context,
linking_context = linking_context,
)
]
def _upb_proto_library_aspect_impl(target, ctx):
proto_sources = target[ProtoInfo].direct_sources
types = {
"srcs": ".upb.c",
"hdrs": ".upb.h",
}
files = _generate_output_files(
ctx = ctx,
package = ctx.label.package,
file_names = proto_sources,
file_types = types,
)
ctx.actions.run(
inputs = [ctx.executable._upbc] + proto_sources,
outputs = files["srcs"] + files["hdrs"],
executable = ctx.executable._protoc,
arguments = ["--upb_out"], #, ctx.genfiles_dir, "--plugin=protoc-gen-upb=" + ctx.executable._upbc.path] + [file.path for file in files["srcs"]],
progress_message = "Generating upb protos",
)
return cc_library_func(
ctx = ctx,
hdrs = files["hdrs"],
srcs = files["srcs"],
deps = ctx.rule.attr.deps
)
_upb_proto_library_aspect = aspect(
attrs = {
"upbc": attr.label(
"_upbc": attr.label(
executable = True,
cfg = "host",
default = ":protoc-gen-upb",
),
"protoc": attr.label(
"_protoc": attr.label(
executable = True,
cfg = "host",
default = map_dep("@com_google_protobuf//:protoc"),
),
"deps": attr.label_list(),
"_cc_toolchain": attr.label(default = "@bazel_tools//tools/cpp:current_cc_toolchain"),
"_upb": attr.label(default = ":upb"),
},
implementation = _upb_proto_library_srcs_impl,
implementation = _upb_proto_library_aspect_impl,
attr_aspects = ["deps"],
)
def upb_proto_library(name, deps, upbc):
srcs_rule = name + "_srcs.cc"
_upb_proto_library_srcs(
name = srcs_rule,
upbc = upbc,
deps = deps,
)
native.cc_library(
name = name,
srcs = [":" + srcs_rule],
deps = [":upb"],
copts = ["-Ibazel-out/k8-fastbuild/bin"],
)
def _upb_proto_library_impl(ctx):
if len(ctx.attr.deps) != 1:
fail("only one deps dependency allowed.")
dep = ctx.attr.deps[0]
if CcInfo not in dep:
fail("proto_library rule must generate CcInfo (have cc_api_version>0).")
return [dep[CcInfo]]
upb_proto_library = rule(
output_to_genfiles = True,
implementation = _upb_proto_library_impl,
attrs = {
'deps': attr.label_list(
aspects = [_upb_proto_library_aspect],
allow_rules = ["proto_library"],
providers = [ProtoInfo],
),
},
)
_upb_proto_reflection_library_srcs = rule(
attrs = {

Loading…
Cancel
Save