commit | 0e7cec27124ba7b19704e1cb89c800ceabf0fd3b | [log] [tgz] |
---|---|---|
author | David Chen <dzc@google.com> | Thu Jun 18 12:28:02 2015 +0000 |
committer | Damien Martin-Guillerez <dmarting@google.com> | Thu Jun 18 15:57:13 2015 +0000 |
tree | 9fe8c828c4aa96e03edd9450219333c52d130ccd |
Add initial Rust rules to Bazel. Todo: * Implement rust_bench_test for running benchmarks * Enable rust_test to depend solely on a rust_library (since many projects intermix #[test] methods in lib source). * Improve error checking and handling and prevent rust_binary from directly depending on cc_library. * Implement rust_doc for generating rustdoc. -- MOS_MIGRATED_REVID=96297772
These build rules are used for building Rust projects with Bazel.
Install Rust following the instructions on the Rust website. The version of Rust currently supported by these build rules is Rust 1.0.0. These build rules also assume that Rust is installed either either /usr
or /usr/local
.
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_library
rust_library(name, srcs, deps, data, features, rustc_flags)
rust_binary
rust_binary(name, srcs, deps, data, features, rustc_flags)
rust_test
rust_test(name, srcs, deps, data, 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.