blob: 30ab2b979435081301e570f691d8d3c29d43f769 [file] [log] [blame] [view]
# 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