| # 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 |