blob: 9d075a1b8905d77bba4fa1887e1fac0223b6a56b [file] [log] [blame] [view]
# Rust
## Build
There are two GN target templates which should be used for Rust projects:
- [`rustc_library`][target-library-rustc] defines a library which can be used by
other targets.
- [`rustc_binary`][target-binary-rustc] defines an executable.
The [examples/rust][rust-examples] directory has some examples of Rust
packages that use these targets, as do the [Rust FIDL examples][fidl-tutorial].
### 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 during a normal build, and as
such, do not require `Cargo.toml` files. However, having a `Cargo.toml` file for
your target is useful for integration with IDEs such as Intellij and VS Code, and
for using the [`fargo`][fargo] tool to build and test targets without going
through a full GN build and run cycle each time.
A `Cargo.toml` file can be automatically generated for `rustc_library` and
`rustc_binary` targets based on their .gn file definitions by running:
```sh
fx build path/from/fuchsia_/root/to/target:label_cargo
fx gen-cargo path/from/fuchsia/root/to/target:label
```
Note that the label you use must be the GN label for a `rustc_...` GN template
invocation, not a Fuchsia package or other GN rule.
Or, if you're already in a directory with a single Rust target:
```sh
fx gen-cargo .
```
Note: You must build the target via a regular Fuchsia build before running this
command.
## Autogenerated docs
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.
## Warnings & 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
- bwb@google.com
- nickpollard@google.com
- tmandry@google.com
- turnage@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.com] mailing list. For
Googler-only channels, see [go/fuchsia-rust-googlers].
## 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]
- [Syslog API](syslog.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"
[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/tutorial/tutorial-rust.md
[rust@fuchsia.com]: https://groups.google.com/a/fuchsia.com/forum/#!forum/rust-fuchsia
[go/fuchsia-rust-googlers]: https://goto.google.com/fuchsia-rust-googlers