# Rust Rules for Bazel ## Overview These build rules are used for building [Rust][rust] projects with Bazel. * [Setup](#setup) * [Basic Example](#basic-example) * [Build Rule Reference](#reference) * [`rust_library`](#reference-rust_library) * [`rust_binary`](#reference-rust_binary) * [`rust_test`](#reference-rust_test) * [`rust_docs`](#reference-rust_docs) * [Roadmap](#roadmap) [rust]: http://www.rust-lang.org/ ## Setup To use the Rust rules, simply copy the contents of `rust.WORKSPACE` to your `WORKSPACE` file. ## Basic Example Suppose you have the following directory structure for a simple Rust library crate: ``` [workspace]/ WORKSPACE hello_lib/ BUILD src/ greeter.rs lib.rs ``` `hello_lib/src/greeter.rs`: ```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); } } ``` `hello_lib/src/lib.rs`: ```rust pub mod greeter; ``` `hello_lib/BUILD`: ```python package(default_visibility = ["//visibility:public"]) load("/tools/build_rules/rust/rust", "rust_library") rust_library( name = "hello_lib", srcs = [ "src/greeter.rs", "src/lib.rs", ], ) ``` Build the library: ``` $ 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 ``` Now, let's add a binary crate that uses the `hello_lib` library. The directory structure now looks like the following: ``` [workspace]/ WORKSPACE hello_lib/ BUILD src/ greeter.rs lib.rs hello_world/ BUILD src/ main.rs ``` `hello_world/src/main.rs`: ```rust extern crate hello_lib; use hello_lib::greeter; fn main() { let hello = greeter::Greeter::new("Hello"); hello.greet("world"); } ``` `hello_world/BUILD`: ```python load("/tools/build_rules/rust/rust", "rust_binary") rust_binary( name = "hello_world", srcs = ["src/main.rs"], deps = ["//hello_lib"], ) ``` Build and run `hello_world`: ``` $ 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 ``` ## Build Rule Reference ### `rust_library` `rust_library(name, srcs, deps, data, crate_features, rustc_flags)`
Attribute Description
name Name, required

A unique name for this rule.

This name will also be used as the name of the library crate built by this rule.

srcs List of labels, required

List of Rust .rs source files used to build the library.

There must be a file either named lib.rs or with a name matching the name of this crate. For example, if the name of a given rule is foo, then there must be a file named lib.rs or foo.rs in srcs. This file will be passed to rustc as the crate root.

deps List of labels, optional

List of other libraries to be linked to this library target.

These can be either other rust_library targets or cc_library targets if linking a native library.

data List of labels, optional

List of files used by this rule at runtime.

This attribute can be used to specify any data files that are embedded into the library, such as via the include_str! macro.

crate_features List of strings, optional

List of features to enable for this crate.

Features are defined in the code using the #[cfg(feature = "foo")] configuration option. The features listed here will be passed to rustc with --cfg feature="${feature_name}" flags.

rustc_flags List of strings, optional

List of compiler flags passed to rustc.

### `rust_binary` `rust_binary(name, srcs, deps, data, crate_features, rustc_flags)`
Attribute Description
name Name, required

A unique name for this rule.

This name will also be used as the name of the binary crate built by this rule.

srcs List of labels, required

List of Rust .rs source files used to build the binary.

There must be a file either named main.rs or with a name matching the name of this crate that contains the main function. For example, if the name of a given rule is foo, then there must be a file named main.rs or foo.rs in srcs. This file will be passed to rustc as the crate root.

deps List of labels, optional

List of other libraries to be linked to this library target.

These must be rust_library targets.

data List of labels, optional

List of files used by this rule at runtime.

This attribute can be used to specify any data files that are embedded into the library, such as via the include_str! macro.

crate_features List of strings, optional

List of features to enable for this crate.

Features are defined in the code using the #[cfg(feature = "foo")] configuration option. The features listed here will be passed to rustc with --cfg feature="${feature_name}" flags.

rustc_flags List of strings, optional

List of compiler flags passed to rustc.

### `rust_test` ```python rust_test(name, srcs, deps, data, crate_features, rustc_flags) ```
Attribute Description
name Name, required

A unique name for this rule.

This name will also be used as the name of the binary test crate built by this rule.

srcs List of labels, required

List of Rust .rs source files used to build the library.

There must be a file either with a name matching the name of this test. For example, if the name of a rust_test rule is foo, then there must be a file named foo.rs in srcs. This file will be passed to rustc as the crate root.

deps List of labels, optional

List of other libraries to be linked to this test target.

These must be rust_library targets.

data List of labels, optional

List of files used by this rule at runtime.

This attribute can be used to specify any data files that are embedded into the library, such as via the include_str! macro.

crate_features List of strings, optional

List of features to enable for this crate.

Features are defined in the code using the #[cfg(feature = "foo")] configuration option. The features listed here will be passed to rustc with --cfg feature="${feature_name}" flags.

rustc_flags List of strings, optional

List of compiler flags passed to rustc.

### `rust_docs` ```python rust_docs(name, dep, markdown_css, html_in_header, html_before_content, html_after_content) ```
Attribute Description
name Name, required

A unique name for this rule.

dep Label, required

The label of the target to generate code documentation for.

rust_docs can generate HTML code documentation for the source files of rust_library or rust_binary targets.

markdown_css List of Labels, optional

CSS files to include via <link> in a rendered Markdown file.

html_in_header Label, optional

File to add to <head>.

html_before_content Label, optional

File to add in <body>, before content.

html_after_content Label, optional

File to add in <body>, after content.

## Roadmap ### Near-term roadmap * Enable `rust_test` to depend solely on a `rust_library` since many projects intermix `#[test]` methods in implementation source. * Improve documentation with more detailed examples. ### Longer-term roadmap * Add tool for taking `Cargo.toml` and generating a `WORKSPACE` file with workspace rules for pulling external dependencies. * Improve expressiveness of features and support for [Cargo's feature groups](http://doc.crates.io/manifest.html#the-[features]-section). * Add `cargo_crate` workspace rule for pulling crates from [Cargo](https://crates.io/).