blob: 7da43e292d0672dab26d81743568024fc9289074 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
ProtoPluginInfo = provider(fields = {
"name": "proto plugin name",
"outputs": "outputs to be generated",
"tool": "plugin tool",
"executable": "plugin tool executable",
"options": "proto options",
"out": "aggregate proto output",
"outdir": "whether to use the package output dir",
"data": "additional data",
"transitivity": "transitivity properties",
})
def _proto_plugin_impl(ctx):
return [ProtoPluginInfo(
data = ctx.files.data,
executable = ctx.executable.tool,
name = ctx.label.name,
options = ctx.attr.options,
out = ctx.attr.out,
outdir = ctx.attr.outdir,
outputs = ctx.attr.outputs,
tool = ctx.attr.tool,
transitivity = ctx.attr.transitivity,
)]
proto_plugin = rule(
implementation = _proto_plugin_impl,
attrs = {
"options": attr.string_list(
doc = "An list of options to pass to the compiler.",
),
"outputs": attr.string_list(
doc = "Output filenames generated on a per-proto basis. Example: '{basename}_pb2.py'",
),
"out": attr.string(
doc = "Output filename generated on a per-plugin basis; to be used in the value for --NAME-out=OUT",
),
"outdir": attr.string(
doc = "If present, overrides the file.path from out; to be used in the value for --NAME-out=OUT",
),
"tool": attr.label(
doc = "The plugin binary. If absent, assume the plugin is a built-in to protoc itself",
cfg = "host",
allow_files = True,
executable = True,
),
"transitivity": attr.string_dict(
doc = "Transitive exclusions. When the compile.bzl 'transitive' property is enabled, this string_dict can be used to exclude protos from the compilation list",
),
"data": attr.label_list(
doc = "Additional files that should travel with the plugin",
allow_files = True,
),
},
)