| |
| |
| <!-- |
| 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 = "io_bazel_rules_rust", |
| remote = "https://github.com/bazelbuild/rules_rust.git", |
| tag = "0.0.5", |
| ) |
| load("@io_bazel_rules_rust//rust:rust.bzl", "rust_repositories") |
| |
| 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) -> u64 { |
| if n < 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: &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 = ["//visibility:public"]) |
| |
| load("@io_bazel_rules_rust//rust:rust.bzl", "rust_library", "rust_benchmark") |
| |
| rust_library( |
| name = "fibonacci", |
| srcs = ["src/lib.rs"], |
| ) |
| |
| rust_benchmark( |
| name = "fibonacci_bench", |
| srcs = ["benches/fibonacci_bench.rs"], |
| deps = [":fibonacci"], |
| ) |
| </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: &str) -> Greeter { |
| Greeter { greeting: greeting.to_string(), } |
| } |
| |
| pub fn greet(&self, thing: &str) { |
| println!("{} {}", &self.greeting, thing); |
| } |
| } |
| </code></pre> |
| <p><code>hello_lib/BUILD</code>:</p> |
| <pre><code class="lang-python">package(default_visibility = ["//visibility:public"]) |
| |
| load("@io_bazel_rules_rust//rust:rust.bzl", "rust_library") |
| |
| rust_library( |
| name = "hello_lib", |
| srcs = ["src/lib.rs"], |
| ) |
| </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("Hello"); |
| hello.greet("world"); |
| } |
| </code></pre> |
| <p><code>hello_world/BUILD</code>:</p> |
| <pre><code class="lang-python">load("@io_bazel_rules_rust//rust:rust.bzl", "rust_binary") |
| |
| rust_binary( |
| name = "hello_world", |
| srcs = ["src/main.rs"], |
| deps = ["//hello_lib"], |
| ) |
| </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>&lt;body&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>&lt;body&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>&lt;head&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>&lt;link&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 = ["//visibility:public"]) |
| |
| load("@io_bazel_rules_rust//rust:rust.bzl", "rust_library", "rust_doc") |
| |
| rust_library( |
| name = "hello_lib", |
| srcs = ["src/lib.rs"], |
| ) |
| |
| rust_doc( |
| name = "hello_lib_doc", |
| dep = ":hello_lib", |
| ) |
| </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 = ["//visibility:public"]) |
| |
| load("@io_bazel_rules_rust//rust:rust.bzl", "rust_library", "rust_doc_test") |
| |
| rust_library( |
| name = "hello_lib", |
| srcs = ["src/lib.rs"], |
| ) |
| |
| rust_doc_test( |
| name = "hello_lib_doc_test", |
| dep = ":hello_lib", |
| ) |
| </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: &str) -> Greeter { |
| Greeter { greeting: greeting.to_string(), } |
| } |
| |
| pub fn greet(&self, thing: &str) { |
| println!("{} {}", &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 = ["//visibility:public"]) |
| |
| load("@io_bazel_rules_rust//rust:rust.bzl", "rust_library") |
| |
| rust_library( |
| name = "hello_lib", |
| srcs = [ |
| "src/greeter.rs", |
| "src/lib.rs", |
| ], |
| ) |
| </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: &str) -> Greeter { |
| Greeter { greeting: greeting.to_string(), } |
| } |
| |
| pub fn greet(&self, thing: &str) { |
| println!("{} {}", &self.greeting, thing); |
| } |
| } |
| |
| #[cfg(test)] |
| mod test { |
| use super::Greeter; |
| |
| #[test] |
| fn test_greeting() { |
| let hello = Greeter::new("Hi"); |
| assert_eq!("Hi Rust", hello.greeting("Rust")); |
| } |
| } |
| </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 = ["//visibility:public"]) |
| |
| load("@io_bazel_rules_rust//rust:rust.bzl", "rust_library", "rust_test") |
| |
| rust_library( |
| name = "hello_lib", |
| srcs = ["src/lib.rs"], |
| ) |
| |
| rust_test( |
| name = "hello_lib_test", |
| deps = [":hello_lib"], |
| ) |
| </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("Hello"); |
| assert_eq!("Hello world", hello.greeting("world")); |
| } |
| </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 = ["//visibility:public"]) |
| |
| load("@io_bazel_rules_rust//rust:rust.bzl", "rust_library", "rust_test") |
| |
| rust_library( |
| name = "hello_lib", |
| srcs = ["src/lib.rs"], |
| ) |
| |
| rust_test( |
| name = "greeting_test", |
| srcs = ["tests/greeting.rs"], |
| deps = [":hello_lib"], |
| ) |
| </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> |