| # Rust | |
| ## Build | |
| There are four GN target templates which should be used for Rust projects: | |
| - [`rustc_library`][target-library-rustc] defines a library and optionally a | |
| unit test target. The library can be depended on by other targets. | |
| - [`rustc_binary`][target-binary-rustc] defines an executable and optionally a | |
| unit test target. | |
| - [`rustc_test`][target-test-rustc] defines a test-only target. | |
| - [`rustc_macro`][target-macro-rustc] defines a | |
| [procedural macro][rust-proc-macros] target. | |
| The [examples/rust][rust-examples] directory has some examples of Rust | |
| packages that use these targets, as do the [Rust FIDL examples][fidl-tutorial]. | |
| Note: The example [Rust BUILD.gn file](/examples/rust/BUILD.gn) | |
| contains the line `group("rust")`. In this instance, `rust` refers to the directory | |
| the `.gn` file is in, not the language. | |
| ### Building with a custom toolchain | |
| If you want to test out Fuchsia with your own custom-built versions of rustc or | |
| cargo, you can set the `rustc_prefix` argument to `fx set`, like this: | |
| ``` | |
| fx set core.x64 --release --args "rustc_prefix=\"/path/to/bin/dir\"" | |
| ``` | |
| ## Cargo.toml | |
| Fuchsia Rust targets are not built with cargo. That said, you can | |
| [generate Cargo.toml files](cargo.md) for use with external tooling. This | |
| functionality is not guaranteed to work. | |
| ## Autogenerated documentation | |
| You can generate and browse HTML documentation for your target and its | |
| dependencies by running: | |
| ```sh | |
| fx rustdoc path/from/fuchsia/root/to/target:label --open | |
| ``` | |
| ## Tests | |
| You can run unit tests on connected devices using `fx`, with the `fx test | |
| {package name}` command. See [Testing Rust code](testing.md) for information | |
| on adding and running tests. | |
| ## Procedural macros | |
| Procedural macro targets are executed on the host at compile time. Therefore, | |
| they cannot depend on other crates which are only available on device, e.g. | |
| zircon. | |
| Negative tests, e.g. asserting that a macro fails to compile with a specific | |
| error, are currently not supported. | |
| ## Warnings and errors | |
| By default our build configuration makes all Rust warnings into errors. This requirement can be | |
| onerous during development, and on your local machine you may wish to see warnings as warnings and | |
| let CQ enforce the hard boundary. | |
| The `rust_cap_lints` GN arg allows you to control this behavior in your development environment. | |
| Setting `rust_cap_lints = "warn"` in `fx args` or `fx set` will allow you to develop locally without | |
| being blocked by warnings. | |
| ## Style | |
| We don't currently have a style guide for Rust, but you should run `fx rustfmt` | |
| or `fx format-code` before submitting. We mostly use the rustfmt defaults, but | |
| have a couple [custom settings][rustfmt-toml]. | |
| ## Rust Idiomatic Usage Review | |
| If you're new to Rust, and would like someone to review your changes to | |
| validate that your usage of Rust is idiomatic, contact one of the following | |
| (or add them as a reviewer to your change.) | |
| - adamperry@google.com | |
| - belgum@google.com | |
| - dnordstrom@google.com | |
| - jamuraa@google.com | |
| - nickpollard@google.com | |
| - tmandry@google.com | |
| (To volunteer for this, please add yourself to the list above and upload the | |
| change with one of the above as the reviewer). | |
| ## Communication channels | |
| Public discussion happens on the [rust-fuchsia@fuchsia.com] mailing list. | |
| {% dynamic if user.is_googler %} | |
| **[Googlers only]** For Googler-only channels, see | |
| [go/fuchsia-rust-googlers]. | |
| {% dynamic endif %} | |
| ## Existing Fuchsia Rust libraries | |
| - [List of crates](crates.md) | |
| - [Autogenerated documentation for crates](https://fuchsia-docs.firebaseapp.com) | |
| ## Going further | |
| - [Editor setup](editors.md) | |
| - [Measuring binary bloat](bloat.md) | |
| - [Managing third-party dependencies](third_party.md) | |
| - [Unsafe code](unsafe.md) | |
| - [Unstable features](unstable.md) | |
| - [Rust FIDL server/client tutorial][fidl-tutorial] | |
| - [Logging](logging.md) | |
| - [Add logging to hello world](add-logging.md) | |
| [target-library-rustc]: /build/rust/rustc_library.gni "Rust library" | |
| [target-binary-rustc]: /build/rust/rustc_binary.gni "Rust binary" | |
| [target-test-rustc]: /build/rust/rustc_test.gni "Rust test" | |
| [target-macro-rustc]: /build/rust/rustc_macro.gni "Rust proc macro" | |
| [rust-examples]: /examples/rust/ | |
| [fargo]: https://fuchsia.googlesource.com/fargo | |
| [rustfmt-install]: https://github.com/rust-lang-nursery/rustfmt#quick-start | |
| [rustfmt-toml]: /rustfmt.toml | |
| [fidl-tutorial]: /docs/development/languages/fidl/tutorials/rust | |
| [rust-fuchsia@fuchsia.com]: https://groups.google.com/a/fuchsia.com/forum/#!forum/rust-fuchsia | |
| [go/fuchsia-rust-googlers]: https://goto.google.com/fuchsia-rust-googlers | |
| [rust-proc-macros]: https://doc.rust-lang.org/reference/procedural-macros.html |