docs/versions/7.2.0/reference/be/protocol-buffer.mdx
{% dynamic setvar source_file "src/main/java/com/google/devtools/build/docgen/templates/be/rules.vm" %} {% dynamic setvar version "7.2.0" %} {% dynamic setvar original_path "/reference/be/protocol-buffer" %} {% include "_buttons.html" %}
<h2>Rules</h2> <ul> <li> <a href="#proto_lang_toolchain"> proto_lang_toolchain </a> </li> <li> <a href="#proto_library"> proto_library </a> </li> </ul> <h2 id="proto_lang_toolchain"> proto_lang_toolchain </h2> <a class="button button-with-icon" href="https://github.com/bazelbuild/bazel/blob/master/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoLangToolchainRule.java" target="_blank"> View rule source<span class="material-icons icon-after" aria-hidden="true">open_in_new</span> </a> <pre class="rule-signature">proto_lang_toolchain(<a href="#proto_lang_toolchain.name">name</a>, <a href="#proto_lang_toolchain.blacklisted_protos">blacklisted_protos</a>, <a href="#proto_lang_toolchain.command_line">command_line</a>, <a href="common-definitions.html#common.compatible_with">compatible_with</a>, <a href="common-definitions.html#common.deprecation">deprecation</a>, <a href="common-definitions.html#common.distribs">distribs</a>, <a href="common-definitions.html#common.exec_compatible_with">exec_compatible_with</a>, <a href="common-definitions.html#common.exec_properties">exec_properties</a>, <a href="common-definitions.html#common.features">features</a>, <a href="common-definitions.html#typical.licenses">licenses</a>, <a href="#proto_lang_toolchain.mnemonic">mnemonic</a>, <a href="#proto_lang_toolchain.output_files">output_files</a>, <a href="#proto_lang_toolchain.plugin">plugin</a>, <a href="#proto_lang_toolchain.plugin_format_flag">plugin_format_flag</a>, <a href="#proto_lang_toolchain.progress_message">progress_message</a>, <a href="#proto_lang_toolchain.proto_compiler">proto_compiler</a>, <a href="common-definitions.html#common.restricted_to">restricted_to</a>, <a href="#proto_lang_toolchain.runtime">runtime</a>, <a href="common-definitions.html#common.tags">tags</a>, <a href="common-definitions.html#common.target_compatible_with">target_compatible_with</a>, <a href="common-definitions.html#common.testonly">testonly</a>, <a href="common-definitions.html#common.visibility">visibility</a>)</pre> <p>If using Bazel, please load the rule from <a href="https://github.com/bazelbuild/rules_proto"> https://github.com/bazelbuild/rules_proto</a>. </p> <p> Specifies how a LANG_proto_library rule (e.g., <code>java_proto_library</code>) should invoke the proto-compiler. Some LANG_proto_library rules allow specifying which toolchain to use using command-line flags; consult their documentation. </p> <p>Normally you should not write those kind of rules unless you want to tune your Java compiler.</p> <p> There's no compiler. The proto-compiler is taken from the proto_library rule we attach to. It is passed as a command-line flag to Blaze. Several features require a proto-compiler to be invoked on the proto_library rule itself. It's beneficial to enforce the compiler that LANG_proto_library uses is the same as the one <code>proto_library</code> does. </p> <h4>Examples</h4> <p>A simple example would be: </p> <pre class="code"> proto_lang_toolchain( name = "javalite_toolchain", command_line = "--javalite_out=shared,immutable:$(OUT)", plugin = ":javalite_plugin", runtime = ":protobuf_lite", ) </pre> <h3 id="proto_lang_toolchain_args">Arguments</h3> <table class="table table-condensed table-bordered table-params"> <colgroup> <col class="col-param" /> <col class="param-description" /> </colgroup> <thead> <tr> <th colspan="2">Attributes</th> </tr> </thead> <tbody> <tr> <td id="proto_lang_toolchain.name"><code>name</code></td> <td> <p><a href="/versions/7.2.0/concepts/labels#target-names">Name</a>; required</p> <p>A unique name for this target.</p> </td>
</tr>
<tr>
<td id="proto_lang_toolchain.blacklisted_protos">
<code>blacklisted_protos</code>
</td>
<td>
<p>List of <a href="/versions/7.2.0/concepts/labels">labels</a>; default is <code>[]</code></p>
No code will be generated for files in the <code>srcs</code> attribute of
<code>blacklisted_protos</code>.
This is used for .proto files that are already linked into proto runtimes, such as
<code>any.proto</code>.
</td>
</tr>
<tr>
<td id="proto_lang_toolchain.command_line">
<code>command_line</code>
</td>
<td>
<p>String; required</p>
This value will be passed to proto-compiler to generate the code. Only include the parts
specific to this code-generator/plugin (e.g., do not include -I parameters)
<ul>
<li><code>$(OUT)</code> is LANG_proto_library-specific. The rules are expected to define
how they interpret this variable. For Java, for example, $(OUT) will be replaced with
the src-jar filename to create.</li>
</ul>
</td>
</tr>
<tr>
<td id="proto_lang_toolchain.mnemonic">
<code>mnemonic</code>
</td>
<td>
<p>String; default is <code>"GenProto"</code></p>
This value will be set as the mnemonic on protoc action.
</td>
</tr>
<tr>
<td id="proto_lang_toolchain.output_files">
<code>output_files</code>
</td>
<td>
<p>String; default is <code>"legacy"</code></p>
Controls how <code>$(OUT)</code> in <code>command_line</code> is formatted, either by
a path to a single file or output directory in case of multiple files.
Possible values are: "single", "multiple".
</td>
</tr>
<tr>
<td id="proto_lang_toolchain.plugin">
<code>plugin</code>
</td>
<td>
<p><a href="/versions/7.2.0/concepts/labels">Label</a>; default is <code>None</code></p>
If provided, will be made available to the action that calls the proto-compiler, and will be
passed to the proto-compiler:
<code>--plugin=protoc-gen-PLUGIN=<executable>.</code>
</td>
</tr>
<tr>
<td id="proto_lang_toolchain.plugin_format_flag">
<code>plugin_format_flag</code>
</td>
<td>
<p>String; default is <code>""</code></p>
If provided, this value will be passed to proto-compiler to use the plugin. The value must
contain a single %s which is replaced with plugin executable.
<code>--plugin=protoc-gen-PLUGIN=<executable>.</code>
</td>
</tr>
<tr>
<td id="proto_lang_toolchain.progress_message">
<code>progress_message</code>
</td>
<td>
<p>String; default is <code>"Generating proto_library %{label}"</code></p>
This value will be set as the progress message on protoc action.
</td>
</tr>
<tr>
<td id="proto_lang_toolchain.proto_compiler">
<code>proto_compiler</code>
</td>
<td>
<p><a href="/versions/7.2.0/concepts/labels">Label</a>; default is <code>None</code></p>
The proto compiler executable.
If provided, this target will be used as a proto-compiler to generate the code.
</td>
</tr>
<tr>
<td id="proto_lang_toolchain.runtime">
<code>runtime</code>
</td>
<td>
<p><a href="/versions/7.2.0/concepts/labels">Label</a>; default is <code>None</code></p>
A language-specific library that the generated code is compiled against.
The exact behavior is LANG_proto_library-specific.
Java, for example, should compile against the runtime.
</td>
</tr>
</tbody>
</td>
</tr>
<tr>
<td id="proto_library.deps">
<code>deps</code>
</td>
<td>
<p>List of <a href="/versions/7.2.0/concepts/labels">labels</a>; default is <code>[]</code></p>
The list of other <code>proto_library</code> rules that the target depends upon.
A <code>proto_library</code> may only depend on other
<code>proto_library</code> targets.
It may not depend on language-specific libraries.
</td>
</tr>
<tr>
<td id="proto_library.srcs">
<code>srcs</code>
</td>
<td>
<p>List of <a href="/versions/7.2.0/concepts/labels">labels</a>; default is <code>[]</code></p>
The list of <code>.proto</code> and <code>.protodevel</code> files that are
processed to create the target. This is usually a non empty list. One usecase
where <code>srcs</code> can be empty is an <i>alias-library</i>. This is a
proto_library rule having one or more other proto_library in <code>deps</code>.
This pattern can be used to e.g. export a public api under a persistent name.
</td>
</tr>
<tr>
<td id="proto_library.allow_exports">
<code>allow_exports</code>
</td>
<td>
<p><a href="/versions/7.2.0/concepts/labels">Label</a>; default is <code>None</code></p>
An optional allowlist that prevents proto library to be reexported or used in
lang_proto_library that is not in one of the listed packages.
</td>
</tr>
<tr>
<td id="proto_library.exports">
<code>exports</code>
</td>
<td>
<p>List of <a href="/versions/7.2.0/concepts/labels">labels</a>; default is <code>[]</code></p>
List of proto_library targets that can be referenced via "import public" in the proto
source.
</td>
</tr>
<tr>
<td id="proto_library.import_prefix">
<code>import_prefix</code>
</td>
<td>
<p>String; default is <code>""</code></p>
The prefix to add to the paths of the .proto files in this rule.
<p>When set, the .proto source files in the <code>srcs</code> attribute of this rule are
accessible at is the value of this attribute prepended to their repository-relative path.
<p>The prefix in the <code>strip_import_prefix</code> attribute is removed before this
prefix is added.
</td>
</tr>
<tr>
<td id="proto_library.strip_import_prefix">
<code>strip_import_prefix</code>
</td>
<td>
<p>String; default is <code>""</code></p>
The prefix to strip from the paths of the .proto files in this rule.
<p>When set, .proto source files in the <code>srcs</code> attribute of this rule are
accessible at their path with this prefix cut off.
<p>If it's a relative path (not starting with a slash), it's taken as a package-relative
one. If it's an absolute one, it's understood as a repository-relative path.
<p>The prefix in the <code>import_prefix</code> attribute is added after this prefix is
stripped.
</td>
</tr>
</tbody>