blob: 7601f67524f7ccc46ec0378141704df23fab01d9 [file] [log] [blame]
# Apache License, Version 2.0, January 2004, http://www.apache.org/licenses/
# Adapted from: https://github.com/rules-proto-grpc/rules_proto_grpc/
load("@rules_proto_grpc//internal:filter_files.bzl", "filter_files")
load("@rules_cc//cc:defs.bzl", "cc_library")
load(
"@rules_proto_grpc//:defs.bzl",
"ProtoPluginInfo",
"proto_compile_attrs",
"proto_compile",
)
def cc_nanopb_proto_compile_impl(ctx):
"""Nanopb proto compile implementation to add options files."""
extra_protoc_args = getattr(ctx.attr, "extra_protoc_args", [])
extra_protoc_files = getattr(ctx.files, "extra_protoc_files", [])
for options_target in ctx.attr.nanopb_options_files:
for options_file in options_target.files.to_list():
extra_protoc_args = extra_protoc_args + [
"--nanopb_plugin_opt=-f{}".format(options_file.path)]
extra_protoc_files = extra_protoc_files + [options_file]
return proto_compile(ctx, ctx.attr.options, extra_protoc_args, extra_protoc_files)
nanopb_proto_compile_attrs = dict(
nanopb_options_files = attr.label_list(
allow_files = [".options"],
doc = "An optional list of additional nanopb options files to apply",
),
**proto_compile_attrs,
)
# Create compile rule
cc_nanopb_proto_compile = rule(
implementation = cc_nanopb_proto_compile_impl,
attrs = dict(
nanopb_proto_compile_attrs,
_plugins = attr.label_list(
providers = [ProtoPluginInfo],
default = [
Label("@nanopb//:nanopb_plugin"),
],
doc = "List of protoc plugins to apply",
),
),
toolchains = [str(Label("@rules_proto_grpc//protobuf:toolchain_type"))],
)
def cc_nanopb_proto_library(name, **kwargs): # buildifier: disable=function-docstring
# Compile protos
name_pb = name + "_pb"
cc_nanopb_proto_compile(
name = name_pb,
**{
k: v
for (k, v) in kwargs.items()
if k in nanopb_proto_compile_attrs.keys()
} # Forward args
)
# Filter files to sources and headers
filter_files(
name = name_pb + "_srcs",
target = name_pb,
extensions = ["c"],
)
filter_files(
name = name_pb + "_hdrs",
target = name_pb,
extensions = ["h"],
)
# Create c library
cc_library(
name = name,
srcs = [name_pb + "_srcs"],
deps = PROTO_DEPS + kwargs.get("deps", []),
hdrs = [name_pb + "_hdrs"],
includes = [name_pb],
alwayslink = kwargs.get("alwayslink"),
copts = kwargs.get("copts"),
defines = kwargs.get("defines"),
features = kwargs.get("features"),
include_prefix = kwargs.get("include_prefix"),
linkopts = kwargs.get("linkopts"),
linkstatic = kwargs.get("linkstatic"),
local_defines = kwargs.get("local_defines"),
strip_include_prefix = kwargs.get("strip_include_prefix"),
visibility = kwargs.get("visibility"),
tags = kwargs.get("tags"),
)
PROTO_DEPS = [
"@nanopb//:nanopb",
]