<html devsite>
<head>
  <meta name="project_path" value="/_project.yaml">
  <meta name="book_path" value="/versions/7.0.0/_book.yaml">
</head>
<body>
<!--
 This document is synchronized with Bazel releases.
 To edit, submit changes to the Bazel source code.
-->

<!-- Generated by //src/main/java/com/google/devtools/build/docgen:build-encyclopedia.zip -->
<html>
<body>

<h1 class="page-title">Protocol Buffer Rules</h1>

{% dynamic setvar source_file "src/main/java/com/google/devtools/build/docgen/templates/be/rules.vm" %}
{% dynamic setvar version "7.0.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.0.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.0.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.0.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=&lt;executable&gt;.</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=&lt;executable&gt;.</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.0.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.0.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>
  </table>
  <h2 id="proto_library">
    proto_library
  </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/BazelProtoLibraryRule.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_library(<a href="#proto_library.name">name</a>, <a href="#proto_library.deps">deps</a>, <a href="#proto_library.srcs">srcs</a>, <a href="common-definitions.html#typical.data">data</a>, <a href="#proto_library.allow_exports">allow_exports</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="#proto_library.exports">exports</a>, <a href="common-definitions.html#common.features">features</a>, <a href="#proto_library.import_prefix">import_prefix</a>, <a href="common-definitions.html#typical.licenses">licenses</a>, <a href="common-definitions.html#common.restricted_to">restricted_to</a>, <a href="#proto_library.strip_import_prefix">strip_import_prefix</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>Deprecated. Please use <a href="https://github.com/bazelbuild/rules_proto">
   https://github.com/bazelbuild/rules_proto</a> instead.
</p>

<p>Use <code>proto_library</code> to define libraries of protocol buffers
   which may be used from multiple languages. A <code>proto_library</code> may be listed
   in the <code>deps</code> clause of supported rules, such as <code>java_proto_library</code>.
</p>

<p>When compiled on the command-line, a <code>proto_library</code> creates a file named
   <code>foo-descriptor-set.proto.bin</code>, which is the descriptor set for the
   messages the rule srcs. The file is a serialized <code>FileDescriptorSet</code>, which is
   described in
   <a href="https://developers.google.com/protocol-buffers/docs/techniques#self-description">
   https://developers.google.com/protocol-buffers/docs/techniques#self-description</a>.
</p>

<p>It only contains information about the <code>.proto</code> files directly mentioned by a
<code>proto_library</code> rule; the collection of transitive descriptor sets is available through
the <code>[ProtoInfo].transitive_descriptor_sets</code> Starlark provider.
See documentation in <code>ProtoInfo.java</code>.</p>

<p>Recommended code organization:</p>

<ul>
<li> One <code>proto_library</code> rule per <code>.proto</code> file.
<li> A file named <code>foo.proto</code> will be in a rule named <code>foo_proto</code>, which
   is located in the same package.
<li> A <code>[language]_proto_library</code> that wraps a <code>proto_library</code> named
  <code>foo_proto</code> should be called
   <code>foo_[language]_proto</code>, and be located in the same package.
</ul>



  <h3 id="proto_library_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_library.name"><code>name</code></td>
        <td>
          <p><a href="/versions/7.0.0/concepts/labels#target-names">Name</a>; required</p>
          <p>A unique name for this target.</p>

        </td>
      </tr>
                <tr>
        <td id="proto_library.deps">
          <code>deps</code>
        </td>
        <td>
                    <p>List of <a href="/versions/7.0.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.0.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.0.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.0.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>
  </table>

<!-- Generated footer -->

</body>
</html>
