Many tools in the Rust ecosystem assume you are using cargo. For tools like
this, which don't have a counterpart in our build, there is a utility for
generating Cargo.toml
files. You can run cargo itself (cargo check
for
instance) using it.
This functionality is maintained by volunteers. GN and Cargo have some design
mismatches that may result in the generated Cargo.toml
files not working at
all or needing manual tweaks. Because of this, cargo in the Fuchsia tree is
not officially supported; things may break from time to time.
In order to generate the cargo files based on the build graph of GN, add --cargo-toml-gen
to
the fx set
command or the //build/rust:cargo_toml_gen
target to $OUT_DIR/args.gn
's
universe_package_labels
. This adds a few seconds to gn gen
. Make sure to run
a full fx build
after updating the setting:
fx set PRODUCT.BOARD --cargo-toml-gen <other fx args>
fx build
Note: If a Cargo.toml
is required to complete an fx build
, such as in the
case cbindgen
needs to be run to generate new C bindings for a Rust crate, you may
need to use the //build/rust:cargo_toml_gen
build target instead. This target will only
build the Cargo.toml
files.
Most editors require the Cargo.toml
file to be in a location that is adjacent to
the src/
directory. Symlinks to these files can be generated using the following
commands, where //foo/path/to/target:some_label
is the GN target that you want
to work on:
fx gen-cargo foo/path/to/target:some_label
Note: The above will not work for rustc_staticlib
targets, e.g. Rust
crates used to generate C bindings generally use the rustc_staticlib
target
template. For rustc_staticlib
targets, you should use the following command instead.
fx gen-cargo foo/path/to/target:_some_label_rustc_static
Note that this label must point to a rustc_...
GN template
(not a Fuchsia package or other GN target). For example:
rustc_binary("some_label") {
...
}
Some plugins require a .cargo/config
file to allow cargo to operate correctly for Fuchsia
(e.g. to run cargo check
). To easily generate this file, use the fargo
tool.
-
Configure
rustup
to use the Fuchsia Rust toolchain by running:rustup toolchain link fuchsia $($FUCHSIA_DIR/scripts/youcompleteme/paths.py VSCODE_RUST_TOOLCHAIN) rustup default fuchsia
-
Clone and install the
fargo
tool within your$FUCHSIA_DIR
by following the getting started instructions for fargo. -
Create your config:
cd $FUCHSIA_DIR && fargo write-config # Note the caveats about changing architecture in the fargo readme # https://fuchsia.googlesource.com/fargo/#creating-a-cargo_config