| # Rust |
| |
| ## Build |
| |
| There are four GN target templates that 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. |
| |
| See also: [Build Fuchsia with a custom Rust toolchain](../../build/rust_toolchain.md) |
| |
| ## 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 |
| |
| Once you have a Cargo.toml for your target 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 that 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 `deny_warnings` GN arg allows you to control this behavior in your development environment. |
| Setting `deny_warnings = false` in `fx args` or adding `--args=deny_warnings=false` to |
| your `fx set` will allow you to develop locally without being blocked by warnings. You can |
| add the argument to [`local/args.gn`][local-args] in your checkout so that it will be applied |
| to all builds without needing to type it in your terminal each time. |
| |
| [local-args]: /docs/development/build/fx.md#defining-persistent-local-build-arguments |
| |
| ## 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 or would like someone to review your changes to |
| validate that your usage of Rust is idiomatic, add "Fuchsia Rust Reviewers" |
| as a reviewer to your CL in Gerrit and a reviewer will be assigned. |
| |
| Email tq-rust-reviewers@google.com with any issues. |
| |
| {% dynamic if user.is_googler %} |
| |
| **[Googlers only]** You can view the |
| [list of Rust Reviewers](https://goto.corp.google.com/tq-rust-reviewers-list). |
| New reviewers can be nominated by an existing reviewer using |
| [this form](https://goto.corp.google.com/tq-rust-reviewers-nominate). |
| |
| {% dynamic endif %} |
| |
| ## Communication channels |
| |
| Public discussion happens on the [rust-users@fuchsia.dev] 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](/docs/reference/rust/crates.md) |
| - [Autogenerated documentation for crates](https://fuchsia-docs.firebaseapp.com/rust/) |
| |
| ## Going further |
| |
| - [Editor setup](editors.md) |
| - [Measuring binary bloat](bloat.md) |
| - [Managing external dependencies](external_crates.md) |
| - [Unsafe code](unsafe.md) |
| - [Unstable features](unstable.md) |
| - [Rust FIDL server/client tutorial][fidl-tutorial] |
| - [Logging](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-users@fuchsia.dev]: https://groups.google.com/a/fuchsia.dev/g/rust-users |
| [go/fuchsia-rust-googlers]: https://goto.google.com/fuchsia-rust-googlers |
| [rust-proc-macros]: https://doc.rust-lang.org/reference/procedural-macros.html |