blob: 9c58a0bffff21e855e68a32d3ce4d4ad02f6064a [file] [log] [blame]
<!--
Documentation generated by Skydoc
-->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width initial-scale=1" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Rust Rules</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,600,700" type="text/css">
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" href="https://code.getmdl.io/1.1.1/material.green-light_blue.min.css">
<script defer src="https://code.getmdl.io/1.1.1/material.min.js"></script>
<link rel="stylesheet" href="https://bazelbuild.github.io/rules_rust/main.css">
</head>
<body>
<div class="mdl-layout mdl-js-layout mdl-layout--fixed-drawer
mdl-layout--fixed-header">
<header class="mdl-layout__header">
<div class="mdl-layout__header-row">
<span class="mdl-layout-title">Rust Rules</span>
</div>
</header>
<div class="mdl-layout__drawer">
<span class="mdl-layout-title">Bazel</span>
<nav class="drawer-nav">
<ul class="drawer-nav">
<li><a href="https://bazelbuild.github.io/rules_rust/index.html">Overview</a></li>
<li>
<a href="https://bazelbuild.github.io/rules_rust/rust/rust.html">Rust Rules</a>
<ul>
<li><a href="https://bazelbuild.github.io/rules_rust/rust/rust.html#overview">Overview</a></li>
<li>
<a href="https://bazelbuild.github.io/rules_rust/rust/rust.html#rust_benchmark">
rust_benchmark
</a>
</li>
<li>
<a href="https://bazelbuild.github.io/rules_rust/rust/rust.html#rust_binary">
rust_binary
</a>
</li>
<li>
<a href="https://bazelbuild.github.io/rules_rust/rust/rust.html#rust_doc">
rust_doc
</a>
</li>
<li>
<a href="https://bazelbuild.github.io/rules_rust/rust/rust.html#rust_doc_test">
rust_doc_test
</a>
</li>
<li>
<a href="https://bazelbuild.github.io/rules_rust/rust/rust.html#rust_library">
rust_library
</a>
</li>
<li>
<a href="https://bazelbuild.github.io/rules_rust/rust/rust.html#rust_test">
rust_test
</a>
</li>
</ul>
</li>
</ul>
</nav>
</div>
<main class="mdl-layout__content">
<div class="page-content">
<h1>Rust Rules</h1>
<nav class="toc">
<h2><a href="#overview">Overview</a></h2>
<h2>Rules</h2>
<ul>
<li><a href="#rust_benchmark">rust_benchmark</a></li>
<li><a href="#rust_binary">rust_binary</a></li>
<li><a href="#rust_doc">rust_doc</a></li>
<li><a href="#rust_doc_test">rust_doc_test</a></li>
<li><a href="#rust_library">rust_library</a></li>
<li><a href="#rust_test">rust_test</a></li>
</ul>
<h2>Macros</h2>
<ul>
<li><a href="#rust_repositories">rust_repositories</a></li>
</ul>
</nav>
<hr>
<h2 id="overview">Overview</h2>
<p>These build rules are used for building <a href="http://www.rust-lang.org/">Rust</a> projects with Bazel.</p>
<h3>Setup</h3>
<p>To use the Rust rules, add the following to your <code>WORKSPACE</code> file to add the
external repositories for the Rust toolchain:</p>
<pre><code class="lang-python">git_repository(
name = &quot;io_bazel_rules_rust&quot;,
remote = &quot;https://github.com/bazelbuild/rules_rust.git&quot;,
tag = &quot;0.0.5&quot;,
)
load(&quot;@io_bazel_rules_rust//rust:rust.bzl&quot;, &quot;rust_repositories&quot;)
rust_repositories()
</code></pre>
<h3>Roadmap</h3>
<ul>
<li>Add <code>rust_toolchain</code> rule to make it easy to use a custom Rust toolchain.</li>
<li>Add tool for taking <code>Cargo.toml</code> and generating a <code>WORKSPACE</code> file with
workspace rules for pulling external dependencies.</li>
<li>Improve expressiveness of features and support for <a href="http://doc.crates.io/manifest.html#the-[features]-section">Cargo's feature
groups</a>.</li>
<li>Add <code>cargo_crate</code> workspace rule for pulling crates from
<a href="https://crates.io/">Cargo</a>.</li>
</ul>
<hr>
<h2 id="rust_repositories">rust_repositories</h2>
<pre>rust_repositories()</pre>
<p>Adds the external dependencies needed for the Rust rules.</p>
<hr>
<h2 id="rust_benchmark">rust_benchmark</h2>
<pre>rust_benchmark(<a href="#rust_benchmark.name">name</a>, <a href="#rust_benchmark.deps">deps</a>, <a href="#rust_benchmark.data">data</a>, <a href="#rust_benchmark.srcs">srcs</a>, <a href="#rust_benchmark.crate_features">crate_features</a>, <a href="#rust_benchmark.crate_root">crate_root</a>, <a href="#rust_benchmark.rustc_flags">rustc_flags</a>)</pre>
<p>Builds a Rust benchmark test.</p>
<p><strong>Warning</strong>: This rule is currently experimental. <a href="https://doc.rust-lang.org/book/benchmark-tests.html">Rust Benchmark
tests</a> require the <code>Bencher</code> interface in the unstable <code>libtest</code>
crate, which is behind the <code>test</code> unstable feature gate. As a result, using
this rule would require using a nightly binary release of Rust. A
<code>rust_toolchain</code> rule will be added in the <a href="#roadmap">near future</a> to make it
easy to use a custom Rust toolchain, such as a nightly release.</p>
<h3 id="rust_benchmark_args">Attributes</h3>
<table class="params-table">
<colgroup>
<col class="col-param" />
<col class="col-description" />
</colgroup>
<tbody>
<tr id="rust_benchmark.name">
<td><code>name</code></td>
<td>
<p><code><a href="https://bazel.build/docs/build-ref.html#name">Name</a>; Required</code></p>
<p>This name will also be used as the name of the binary crate built by
this rule.</p>
</td>
</tr>
<tr id="rust_benchmark.deps">
<td><code>deps</code></td>
<td>
<p><code>List of <a href="https://bazel.build/docs/build-ref.html#labels">labels</a>; Optional; Default is []</code></p>
<p>List of other libraries to be linked to this library target.</p>
<p>These must be <code>rust_library</code> targets.</p>
</td>
</tr>
<tr id="rust_benchmark.data">
<td><code>data</code></td>
<td>
<p><code>List of <a href="https://bazel.build/docs/build-ref.html#labels">labels</a>; Optional; Default is []</code></p>
<p>List of files used by this rule at runtime.</p>
<p>This attribute can be used to specify any data files that are embedded into
the library, such as via the
<a href="https://doc.rust-lang.org/std/macro.include_str!.html"><code>include_str!</code></a>
macro.</p>
</td>
</tr>
<tr id="rust_benchmark.srcs">
<td><code>srcs</code></td>
<td>
<p><code>List of <a href="https://bazel.build/docs/build-ref.html#labels">labels</a>; Optional; Default is []</code></p>
<p>List of Rust <code>.rs</code> source files used to build the test.</p>
<p>If <code>srcs</code> contains more than one file, then there must be a file either
named <code>lib.rs</code>. Otherwise, <code>crate_root</code> must be set to the source file that
is the root of the crate to be passed to rustc to build this crate.</p>
</td>
</tr>
<tr id="rust_benchmark.crate_features">
<td><code>crate_features</code></td>
<td>
<p><code>List of strings; Optional; Default is []</code></p>
<p>List of features to enable for this crate.</p>
<p>Features are defined in the code using the <code>#[cfg(feature = "foo")]</code>
configuration option. The features listed here will be passed to <code>rustc</code>
with <code>--cfg feature="${feature_name}"</code> flags.</p>
</td>
</tr>
<tr id="rust_benchmark.crate_root">
<td><code>crate_root</code></td>
<td>
<p><code><a href="https://bazel.build/docs/build-ref.html#labels">Label</a>; Optional</code></p>
<p>The file that will be passed to <code>rustc</code> to be used for building
this crate.</p>
<p>If <code>crate_root</code> is not set, then this rule will look for a <code>lib.rs</code> file or
the single file in <code>srcs</code> if <code>srcs</code> contains only one file.</p>
</td>
</tr>
<tr id="rust_benchmark.rustc_flags">
<td><code>rustc_flags</code></td>
<td>
<p><code>List of strings; Optional; Default is []</code></p>
<p>List of compiler flags passed to <code>rustc</code>.</p>
</td>
</tr>
</tbody>
</table>
<h3 id="rust_benchmark_examples">Examples</h3>
<p>Suppose you have the following directory structure for a Rust project with a
library crate, <code>fibonacci</code> with benchmarks under the <code>benches/</code> directory:</p>
<pre><code>[workspace]/
WORKSPACE
fibonacci/
BUILD
src/
lib.rs
benches/
fibonacci_bench.rs
</code></pre>
<p><code>fibonacci/src/lib.rs</code>:</p>
<pre><code class="lang-rust">pub fn fibonacci(n: u64) -&gt; u64 {
if n &lt; 2 {
return n;
}
let mut n1: u64 = 0;
let mut n2: u64 = 1;
for _ in 1..n {
let sum = n1 + n2;
n1 = n2;
n2 = sum;
}
n2
}
</code></pre>
<p><code>fibonacci/benches/fibonacci_bench.rs</code>:</p>
<pre><code class="lang-rust">#![feature(test)]
extern crate test;
extern crate fibonacci;
use test::Bencher;
#[bench]
fn bench_fibonacci(b: &amp;mut Bencher) {
b.iter(|| fibonacci::fibonacci(40));
}
</code></pre>
<p>To build the benchmark test, simply add a <code>rust_benchmark</code> target:</p>
<p><code>fibonacci/BUILD</code>:</p>
<pre><code class="lang-python">package(default_visibility = [&quot;//visibility:public&quot;])
load(&quot;@io_bazel_rules_rust//rust:rust.bzl&quot;, &quot;rust_library&quot;, &quot;rust_benchmark&quot;)
rust_library(
name = &quot;fibonacci&quot;,
srcs = [&quot;src/lib.rs&quot;],
)
rust_benchmark(
name = &quot;fibonacci_bench&quot;,
srcs = [&quot;benches/fibonacci_bench.rs&quot;],
deps = [&quot;:fibonacci&quot;],
)
</code></pre>
<p>Run the benchmark test using: <code>bazel build //fibonacci:fibonacci_bench</code>.</p>
<hr>
<h2 id="rust_binary">rust_binary</h2>
<pre>rust_binary(<a href="#rust_binary.name">name</a>, <a href="#rust_binary.deps">deps</a>, <a href="#rust_binary.data">data</a>, <a href="#rust_binary.srcs">srcs</a>, <a href="#rust_binary.crate_features">crate_features</a>, <a href="#rust_binary.crate_root">crate_root</a>, <a href="#rust_binary.rustc_flags">rustc_flags</a>)</pre>
<p>Builds a Rust binary crate.</p>
<h3 id="rust_binary_args">Attributes</h3>
<table class="params-table">
<colgroup>
<col class="col-param" />
<col class="col-description" />
</colgroup>
<tbody>
<tr id="rust_binary.name">
<td><code>name</code></td>
<td>
<p><code><a href="https://bazel.build/docs/build-ref.html#name">Name</a>; Required</code></p>
<p>This name will also be used as the name of the binary crate built by
this rule.</p>
</td>
</tr>
<tr id="rust_binary.deps">
<td><code>deps</code></td>
<td>
<p><code>List of <a href="https://bazel.build/docs/build-ref.html#labels">labels</a>; Optional; Default is []</code></p>
<p>List of other libraries to be linked to this library target.</p>
<p>These must be <code>rust_library</code> targets.</p>
</td>
</tr>
<tr id="rust_binary.data">
<td><code>data</code></td>
<td>
<p><code>List of <a href="https://bazel.build/docs/build-ref.html#labels">labels</a>; Optional; Default is []</code></p>
<p>List of files used by this rule at runtime.</p>
<p>This attribute can be used to specify any data files that are embedded into
the library, such as via the
<a href="https://doc.rust-lang.org/std/macro.include_str!.html"><code>include_str!</code></a>
macro.</p>
</td>
</tr>
<tr id="rust_binary.srcs">
<td><code>srcs</code></td>
<td>
<p><code>List of <a href="https://bazel.build/docs/build-ref.html#labels">labels</a>; Optional; Default is []</code></p>
<p>List of Rust <code>.rs</code> source files used to build the test.</p>
<p>If <code>srcs</code> contains more than one file, then there must be a file either
named <code>lib.rs</code>. Otherwise, <code>crate_root</code> must be set to the source file that
is the root of the crate to be passed to rustc to build this crate.</p>
</td>
</tr>
<tr id="rust_binary.crate_features">
<td><code>crate_features</code></td>
<td>
<p><code>List of strings; Optional; Default is []</code></p>
<p>List of features to enable for this crate.</p>
<p>Features are defined in the code using the <code>#[cfg(feature = "foo")]</code>
configuration option. The features listed here will be passed to <code>rustc</code>
with <code>--cfg feature="${feature_name}"</code> flags.</p>
</td>
</tr>
<tr id="rust_binary.crate_root">
<td><code>crate_root</code></td>
<td>
<p><code><a href="https://bazel.build/docs/build-ref.html#labels">Label</a>; Optional</code></p>
<p>The file that will be passed to <code>rustc</code> to be used for building
this crate.</p>
<p>If <code>crate_root</code> is not set, then this rule will look for a <code>lib.rs</code> file or
the single file in <code>srcs</code> if <code>srcs</code> contains only one file.</p>
</td>
</tr>
<tr id="rust_binary.rustc_flags">
<td><code>rustc_flags</code></td>
<td>
<p><code>List of strings; Optional; Default is []</code></p>
<p>List of compiler flags passed to <code>rustc</code>.</p>
</td>
</tr>
</tbody>
</table>
<h3 id="rust_binary_examples">Examples</h3>
<p>Suppose you have the following directory structure for a Rust project with a
library crate, <code>hello_lib</code>, and a binary crate, <code>hello_world</code> that uses the
<code>hello_lib</code> library:</p>
<pre><code>[workspace]/
WORKSPACE
hello_lib/
BUILD
src/
lib.rs
hello_world/
BUILD
src/
main.rs
</code></pre>
<p><code>hello_lib/src/lib.rs</code>:</p>
<pre><code class="lang-rust">pub struct Greeter {
greeting: String,
}
impl Greeter {
pub fn new(greeting: &amp;str) -&gt; Greeter {
Greeter { greeting: greeting.to_string(), }
}
pub fn greet(&amp;self, thing: &amp;str) {
println!(&quot;{} {}&quot;, &amp;self.greeting, thing);
}
}
</code></pre>
<p><code>hello_lib/BUILD</code>:</p>
<pre><code class="lang-python">package(default_visibility = [&quot;//visibility:public&quot;])
load(&quot;@io_bazel_rules_rust//rust:rust.bzl&quot;, &quot;rust_library&quot;)
rust_library(
name = &quot;hello_lib&quot;,
srcs = [&quot;src/lib.rs&quot;],
)
</code></pre>
<p><code>hello_world/src/main.rs</code>:</p>
<pre><code class="lang-rust">extern crate hello_lib;
fn main() {
let hello = hello_lib::Greeter::new(&quot;Hello&quot;);
hello.greet(&quot;world&quot;);
}
</code></pre>
<p><code>hello_world/BUILD</code>:</p>
<pre><code class="lang-python">load(&quot;@io_bazel_rules_rust//rust:rust.bzl&quot;, &quot;rust_binary&quot;)
rust_binary(
name = &quot;hello_world&quot;,
srcs = [&quot;src/main.rs&quot;],
deps = [&quot;//hello_lib&quot;],
)
</code></pre>
<p>Build and run <code>hello_world</code>:</p>
<pre><code>$ bazel run //hello_world
INFO: Found 1 target...
Target //examples/rust/hello_world:hello_world up-to-date:
bazel-bin/examples/rust/hello_world/hello_world
INFO: Elapsed time: 1.308s, Critical Path: 1.22s
INFO: Running command line: bazel-bin/examples/rust/hello_world/hello_world
Hello world
</code></pre>
<hr>
<h2 id="rust_doc">rust_doc</h2>
<pre>rust_doc(<a href="#rust_doc.name">name</a>, <a href="#rust_doc.dep">dep</a>, <a href="#rust_doc.html_after_content">html_after_content</a>, <a href="#rust_doc.html_before_content">html_before_content</a>, <a href="#rust_doc.html_in_header">html_in_header</a>, <a href="#rust_doc.markdown_css">markdown_css</a>)</pre>
<p>Generates code documentation.</p>
<h3 id="rust_doc_args">Attributes</h3>
<table class="params-table">
<colgroup>
<col class="col-param" />
<col class="col-description" />
</colgroup>
<tbody>
<tr id="rust_doc.name">
<td><code>name</code></td>
<td>
<p><code><a href="https://bazel.build/docs/build-ref.html#name">Name</a>; Required</code></p>
<p>A unique name for this rule.</p>
</td>
</tr>
<tr id="rust_doc.dep">
<td><code>dep</code></td>
<td>
<p><code><a href="https://bazel.build/docs/build-ref.html#labels">Label</a>; Required</code></p>
<p>The label of the target to run documentation tests for.</p>
<p><code>rust_doc_test</code> can run documentation tests for the source files of
<code>rust_library</code> or <code>rust_binary</code> targets.</p>
</td>
</tr>
<tr id="rust_doc.html_after_content">
<td><code>html_after_content</code></td>
<td>
<p><code><a href="https://bazel.build/docs/build-ref.html#labels">Label</a>; Optional</code></p>
<p>File to add in <code>&amp;lt;body&amp;gt;</code>, after content.</p>
</td>
</tr>
<tr id="rust_doc.html_before_content">
<td><code>html_before_content</code></td>
<td>
<p><code><a href="https://bazel.build/docs/build-ref.html#labels">Label</a>; Optional</code></p>
<p>File to add in <code>&amp;lt;body&amp;gt;</code>, before content.</p>
</td>
</tr>
<tr id="rust_doc.html_in_header">
<td><code>html_in_header</code></td>
<td>
<p><code><a href="https://bazel.build/docs/build-ref.html#labels">Label</a>; Optional</code></p>
<p>File to add to <code>&amp;lt;head&amp;gt;</code>.</p>
</td>
</tr>
<tr id="rust_doc.markdown_css">
<td><code>markdown_css</code></td>
<td>
<p><code>List of <a href="https://bazel.build/docs/build-ref.html#labels">labels</a>; Optional; Default is []</code></p>
<p>CSS files to include via <code>&amp;lt;link&amp;gt;</code> in a rendered
Markdown file.</p>
</td>
</tr>
</tbody>
</table>
<h3 id="rust_doc_examples">Examples</h3>
<p>Suppose you have the following directory structure for a Rust library crate:</p>
<pre><code>[workspace]/
WORKSPACE
hello_lib/
BUILD
src/
lib.rs
</code></pre>
<p>To build <a href="https://doc.rust-lang.org/book/documentation.html"><code>rustdoc</code></a> documentation for the <code>hello_lib</code> crate, define
a <code>rust_doc</code> rule that depends on the the <code>hello_lib</code> <code>rust_library</code> target:</p>
<pre><code class="lang-python">package(default_visibility = [&quot;//visibility:public&quot;])
load(&quot;@io_bazel_rules_rust//rust:rust.bzl&quot;, &quot;rust_library&quot;, &quot;rust_doc&quot;)
rust_library(
name = &quot;hello_lib&quot;,
srcs = [&quot;src/lib.rs&quot;],
)
rust_doc(
name = &quot;hello_lib_doc&quot;,
dep = &quot;:hello_lib&quot;,
)
</code></pre>
<p>Running <code>bazel build //hello_lib:hello_lib_doc</code> will build a zip file containing
the documentation for the <code>hello_lib</code> library crate generated by <code>rustdoc</code>.</p>
<hr>
<h2 id="rust_doc_test">rust_doc_test</h2>
<pre>rust_doc_test(<a href="#rust_doc_test.name">name</a>, <a href="#rust_doc_test.dep">dep</a>)</pre>
<p>Runs Rust documentation tests.</p>
<h3 id="rust_doc_test_args">Attributes</h3>
<table class="params-table">
<colgroup>
<col class="col-param" />
<col class="col-description" />
</colgroup>
<tbody>
<tr id="rust_doc_test.name">
<td><code>name</code></td>
<td>
<p><code><a href="https://bazel.build/docs/build-ref.html#name">Name</a>; Required</code></p>
<p>A unique name for this rule.</p>
</td>
</tr>
<tr id="rust_doc_test.dep">
<td><code>dep</code></td>
<td>
<p><code><a href="https://bazel.build/docs/build-ref.html#labels">Label</a>; Required</code></p>
<p>The label of the target to run documentation tests for.</p>
<p><code>rust_doc_test</code> can run documentation tests for the source files of
<code>rust_library</code> or <code>rust_binary</code> targets.</p>
</td>
</tr>
</tbody>
</table>
<h3 id="rust_doc_test_examples">Examples</h3>
<p>Suppose you have the following directory structure for a Rust library crate:</p>
<pre><code>[workspace]/
WORKSPACE
hello_lib/
BUILD
src/
lib.rs
</code></pre>
<p>To run <a href="https://doc.rust-lang.org/book/documentation.html#documentation-as-tests">documentation tests</a> for the <code>hello_lib</code> crate, define a
<code>rust_doc_test</code> target that depends on the <code>hello_lib</code> <code>rust_library</code> target:</p>
<pre><code class="lang-python">package(default_visibility = [&quot;//visibility:public&quot;])
load(&quot;@io_bazel_rules_rust//rust:rust.bzl&quot;, &quot;rust_library&quot;, &quot;rust_doc_test&quot;)
rust_library(
name = &quot;hello_lib&quot;,
srcs = [&quot;src/lib.rs&quot;],
)
rust_doc_test(
name = &quot;hello_lib_doc_test&quot;,
dep = &quot;:hello_lib&quot;,
)
</code></pre>
<p>Running <code>bazel test //hello_lib:hello_lib_doc_test</code> will run all documentation
tests for the <code>hello_lib</code> library crate.</p>
<hr>
<h2 id="rust_library">rust_library</h2>
<pre>rust_library(<a href="#rust_library.name">name</a>, <a href="#rust_library.deps">deps</a>, <a href="#rust_library.data">data</a>, <a href="#rust_library.srcs">srcs</a>, <a href="#rust_library.crate_features">crate_features</a>, <a href="#rust_library.crate_root">crate_root</a>, <a href="#rust_library.crate_type">crate_type</a>, <a href="#rust_library.rustc_flags">rustc_flags</a>)</pre>
<p>Builds a Rust library crate.</p>
<h3 id="rust_library_args">Attributes</h3>
<table class="params-table">
<colgroup>
<col class="col-param" />
<col class="col-description" />
</colgroup>
<tbody>
<tr id="rust_library.name">
<td><code>name</code></td>
<td>
<p><code><a href="https://bazel.build/docs/build-ref.html#name">Name</a>; Required</code></p>
<p>This name will also be used as the name of the library crate built by
this rule.</p>
</td>
</tr>
<tr id="rust_library.deps">
<td><code>deps</code></td>
<td>
<p><code>List of <a href="https://bazel.build/docs/build-ref.html#labels">labels</a>; Optional; Default is []</code></p>
<p>List of other libraries to be linked to this library target.</p>
<p>These must be <code>rust_library</code> targets.</p>
</td>
</tr>
<tr id="rust_library.data">
<td><code>data</code></td>
<td>
<p><code>List of <a href="https://bazel.build/docs/build-ref.html#labels">labels</a>; Optional; Default is []</code></p>
<p>List of files used by this rule at runtime.</p>
<p>This attribute can be used to specify any data files that are embedded into
the library, such as via the
<a href="https://doc.rust-lang.org/std/macro.include_str!.html"><code>include_str!</code></a>
macro.</p>
</td>
</tr>
<tr id="rust_library.srcs">
<td><code>srcs</code></td>
<td>
<p><code>List of <a href="https://bazel.build/docs/build-ref.html#labels">labels</a>; Optional; Default is []</code></p>
<p>List of Rust <code>.rs</code> source files used to build the test.</p>
<p>If <code>srcs</code> contains more than one file, then there must be a file either
named <code>lib.rs</code>. Otherwise, <code>crate_root</code> must be set to the source file that
is the root of the crate to be passed to rustc to build this crate.</p>
</td>
</tr>
<tr id="rust_library.crate_features">
<td><code>crate_features</code></td>
<td>
<p><code>List of strings; Optional; Default is []</code></p>
<p>List of features to enable for this crate.</p>
<p>Features are defined in the code using the <code>#[cfg(feature = "foo")]</code>
configuration option. The features listed here will be passed to <code>rustc</code>
with <code>--cfg feature="${feature_name}"</code> flags.</p>
</td>
</tr>
<tr id="rust_library.crate_root">
<td><code>crate_root</code></td>
<td>
<p><code><a href="https://bazel.build/docs/build-ref.html#labels">Label</a>; Optional</code></p>
<p>The file that will be passed to <code>rustc</code> to be used for building
this crate.</p>
<p>If <code>crate_root</code> is not set, then this rule will look for a <code>lib.rs</code> file or
the single file in <code>srcs</code> if <code>srcs</code> contains only one file.</p>
</td>
</tr>
<tr id="rust_library.crate_type">
<td><code>crate_type</code></td>
<td>
<p><code>String; Optional; Default is ''</code></p>
</td>
</tr>
<tr id="rust_library.rustc_flags">
<td><code>rustc_flags</code></td>
<td>
<p><code>List of strings; Optional; Default is []</code></p>
<p>List of compiler flags passed to <code>rustc</code>.</p>
</td>
</tr>
</tbody>
</table>
<h3 id="rust_library_examples">Examples</h3>
<p>Suppose you have the following directory structure for a simple Rust library
crate:</p>
<pre><code>[workspace]/
WORKSPACE
hello_lib/
BUILD
src/
greeter.rs
lib.rs
</code></pre>
<p><code>hello_lib/src/greeter.rs</code>:</p>
<pre><code class="lang-rust">pub struct Greeter {
greeting: String,
}
impl Greeter {
pub fn new(greeting: &amp;str) -&gt; Greeter {
Greeter { greeting: greeting.to_string(), }
}
pub fn greet(&amp;self, thing: &amp;str) {
println!(&quot;{} {}&quot;, &amp;self.greeting, thing);
}
}
</code></pre>
<p><code>hello_lib/src/lib.rs</code>:</p>
<pre><code class="lang-rust">pub mod greeter;
</code></pre>
<p><code>hello_lib/BUILD</code>:</p>
<pre><code class="lang-python">package(default_visibility = [&quot;//visibility:public&quot;])
load(&quot;@io_bazel_rules_rust//rust:rust.bzl&quot;, &quot;rust_library&quot;)
rust_library(
name = &quot;hello_lib&quot;,
srcs = [
&quot;src/greeter.rs&quot;,
&quot;src/lib.rs&quot;,
],
)
</code></pre>
<p>Build the library:</p>
<pre><code>$ bazel build //hello_lib
INFO: Found 1 target...
Target //examples/rust/hello_lib:hello_lib up-to-date:
bazel-bin/examples/rust/hello_lib/libhello_lib.rlib
INFO: Elapsed time: 1.245s, Critical Path: 1.01s
</code></pre>
<hr>
<h2 id="rust_test">rust_test</h2>
<pre>rust_test(<a href="#rust_test.name">name</a>, <a href="#rust_test.deps">deps</a>, <a href="#rust_test.data">data</a>, <a href="#rust_test.srcs">srcs</a>, <a href="#rust_test.crate_features">crate_features</a>, <a href="#rust_test.crate_root">crate_root</a>, <a href="#rust_test.rustc_flags">rustc_flags</a>)</pre>
<p>Builds a Rust test crate.</p>
<h3 id="rust_test_args">Attributes</h3>
<table class="params-table">
<colgroup>
<col class="col-param" />
<col class="col-description" />
</colgroup>
<tbody>
<tr id="rust_test.name">
<td><code>name</code></td>
<td>
<p><code><a href="https://bazel.build/docs/build-ref.html#name">Name</a>; Required</code></p>
<p>This name will also be used as the name of the binary crate built by
this rule.</p>
</td>
</tr>
<tr id="rust_test.deps">
<td><code>deps</code></td>
<td>
<p><code>List of <a href="https://bazel.build/docs/build-ref.html#labels">labels</a>; Optional; Default is []</code></p>
<p>List of other libraries to be linked to this library target.</p>
<p>These must be <code>rust_library</code> targets.</p>
</td>
</tr>
<tr id="rust_test.data">
<td><code>data</code></td>
<td>
<p><code>List of <a href="https://bazel.build/docs/build-ref.html#labels">labels</a>; Optional; Default is []</code></p>
<p>List of files used by this rule at runtime.</p>
<p>This attribute can be used to specify any data files that are embedded into
the library, such as via the
<a href="https://doc.rust-lang.org/std/macro.include_str!.html"><code>include_str!</code></a>
macro.</p>
</td>
</tr>
<tr id="rust_test.srcs">
<td><code>srcs</code></td>
<td>
<p><code>List of <a href="https://bazel.build/docs/build-ref.html#labels">labels</a>; Optional; Default is []</code></p>
<p>List of Rust <code>.rs</code> source files used to build the test.</p>
<p>If <code>srcs</code> contains more than one file, then there must be a file either
named <code>lib.rs</code>. Otherwise, <code>crate_root</code> must be set to the source file that
is the root of the crate to be passed to rustc to build this crate.</p>
</td>
</tr>
<tr id="rust_test.crate_features">
<td><code>crate_features</code></td>
<td>
<p><code>List of strings; Optional; Default is []</code></p>
<p>List of features to enable for this crate.</p>
<p>Features are defined in the code using the <code>#[cfg(feature = "foo")]</code>
configuration option. The features listed here will be passed to <code>rustc</code>
with <code>--cfg feature="${feature_name}"</code> flags.</p>
</td>
</tr>
<tr id="rust_test.crate_root">
<td><code>crate_root</code></td>
<td>
<p><code><a href="https://bazel.build/docs/build-ref.html#labels">Label</a>; Optional</code></p>
<p>The file that will be passed to <code>rustc</code> to be used for building
this crate.</p>
<p>If <code>crate_root</code> is not set, then this rule will look for a <code>lib.rs</code> file or
the single file in <code>srcs</code> if <code>srcs</code> contains only one file.</p>
</td>
</tr>
<tr id="rust_test.rustc_flags">
<td><code>rustc_flags</code></td>
<td>
<p><code>List of strings; Optional; Default is []</code></p>
<p>List of compiler flags passed to <code>rustc</code>.</p>
</td>
</tr>
</tbody>
</table>
<h3 id="rust_test_examples">Examples</h3>
<p>Suppose you have the following directory structure for a Rust library crate
with unit test code in the library sources:</p>
<pre><code>[workspace]/
WORKSPACE
hello_lib/
BUILD
src/
lib.rs
</code></pre>
<p><code>hello_lib/src/lib.rs</code>:</p>
<pre><code class="lang-rust">pub struct Greeter {
greeting: String,
}
impl Greeter {
pub fn new(greeting: &amp;str) -&gt; Greeter {
Greeter { greeting: greeting.to_string(), }
}
pub fn greet(&amp;self, thing: &amp;str) {
println!(&quot;{} {}&quot;, &amp;self.greeting, thing);
}
}
#[cfg(test)]
mod test {
use super::Greeter;
#[test]
fn test_greeting() {
let hello = Greeter::new(&quot;Hi&quot;);
assert_eq!(&quot;Hi Rust&quot;, hello.greeting(&quot;Rust&quot;));
}
}
</code></pre>
<p>To build and run the tests, simply add a <code>rust_test</code> rule with no <code>srcs</code> and
only depends on the <code>hello_lib</code> <code>rust_library</code> target:</p>
<p><code>hello_lib/BUILD</code>:</p>
<pre><code class="lang-python">package(default_visibility = [&quot;//visibility:public&quot;])
load(&quot;@io_bazel_rules_rust//rust:rust.bzl&quot;, &quot;rust_library&quot;, &quot;rust_test&quot;)
rust_library(
name = &quot;hello_lib&quot;,
srcs = [&quot;src/lib.rs&quot;],
)
rust_test(
name = &quot;hello_lib_test&quot;,
deps = [&quot;:hello_lib&quot;],
)
</code></pre>
<p>Run the test with <code>bazel build //hello_lib:hello_lib_test</code>.</p>
<h3>Example: <code>test</code> directory</h3>
<p>Integration tests that live in the <a href="http://doc.rust-lang.org/book/testing.html#the-tests-directory"><code>tests</code> directory</a>, they are
essentially built as separate crates. Suppose you have the following directory
structure where <code>greeting.rs</code> is an integration test for the <code>hello_lib</code>
library crate:</p>
<pre><code>[workspace]/
WORKSPACE
hello_lib/
BUILD
src/
lib.rs
tests/
greeting.rs
</code></pre>
<p><code>hello_lib/tests/greeting.rs</code>:</p>
<pre><code class="lang-rust">extern crate hello_lib;
use hello_lib;
#[test]
fn test_greeting() {
let hello = greeter::Greeter::new(&quot;Hello&quot;);
assert_eq!(&quot;Hello world&quot;, hello.greeting(&quot;world&quot;));
}
</code></pre>
<p>To build the <code>greeting.rs</code> integration test, simply add a <code>rust_test</code> target
with <code>greeting.rs</code> in <code>srcs</code> and a dependency on the <code>hello_lib</code> target:</p>
<p><code>hello_lib/BUILD</code>:</p>
<pre><code class="lang-python">package(default_visibility = [&quot;//visibility:public&quot;])
load(&quot;@io_bazel_rules_rust//rust:rust.bzl&quot;, &quot;rust_library&quot;, &quot;rust_test&quot;)
rust_library(
name = &quot;hello_lib&quot;,
srcs = [&quot;src/lib.rs&quot;],
)
rust_test(
name = &quot;greeting_test&quot;,
srcs = [&quot;tests/greeting.rs&quot;],
deps = [&quot;:hello_lib&quot;],
)
</code></pre>
<p>Run the test with <code>bazel build //hello_lib:hello_lib_test</code>.</p>
</div>
<footer class="mdl-mini-footer">
<div class="mdl-mini-footer__left-section">
<div class="mdl-logo">Bazel</div>
<ul class="mdl-mini-footer__link-list">
<li><a href="http://bazel.io">Home</a></li>
<li><a href="https://github.com/bazelbuild">GitHub</a></li>
</ul>
</div>
</footer>
</main>
</div>
</body>
</html>