These build rules are used for building Rust projects with Bazel.
To use the Rust rules, simply copy the contents of rust.WORKSPACE to your WORKSPACE file.
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:
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:
pub mod greeter;
hello_lib/BUILD:
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:
extern crate hello_lib; use hello_lib::greeter; fn main() { let hello = greeter::Greeter::new("Hello"); hello.greet("world"); }
hello_world/BUILD:
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
rust_libraryrust_library(name, srcs, deps, data, crate_features, rustc_flags)
rust_binaryrust_binary(name, srcs, deps, data, crate_features, rustc_flags)
rust_testrust_test(name, srcs, deps, data, crate_features, rustc_flags)
rust_bench_test rule for running benchmarks.rust_test to depend solely on a rust_library since many projects intermix #[test] methods in implementation source.rust_doc rule for generating rustdoc documentation.Cargo.toml and generating a WORKSPACE file with workspace rules for pulling external dependencies.cargo_crate workspace rule for pulling crates from Cargo.