# Build Fuchsia with a custom Rust toolchain

This guide explains how to build Fuchsia with a custom Rust compiler. This is
useful if you need to build Fuchsia with a patched compiler, or a compiler built
with custom options.

### Use another version of Rust

If all you need to do is use a different version than the one currently being
used, most of this doc is not necessary. Fuchsia builders [build Rust] after
every change to Rust's main branch.

1. Find the commit hash you want to use.
2. Run the following commands from your Fuchsia directory:

   ```posix-terminal
   # Replace COMMIT with the full Rust commit hash.
   # This command updates the manifests in the integration repo, which you can
   # then commit or revert as necessary.
   fx roll-compiler --package rust git_revision:{{ '<var>' }}COMMIT{{ '</var>' }}

   # Fetch the package versions you specified and install them in `prebuilt/`.
   jiri fetch-packages -local-manifest
   ```

3. Run the following command to build Fuchsia:

   ```posix-terminal
   fx build
   ```

   The Fuchsia build now uses the updated compiler.

   Note: A clean build is not necessary; the build automatically detects
   the new compiler version.

[build Rust]: https://ci.chromium.org/p/fuchsia/g/rust/console

## Prerequisites

Prior to building Fuchsia with a custom Rust toolchain, you need to do the following:

Note: These instructions are for Debian-based systems, but you should use the
correct package manager for your machine.

1. [Build a custom Rust toolchain](/docs/development/build/rust_toolchain.md)
   for Fuchsia.

1. Complete the following guide to download the Fuchsia source:
   [Get Fuchsia source code](/docs/get-started/get_fuchsia_source.md).
   To confirm that jiri is in your PATH run <code>jiri -help</code>.

   Note: The below commands assume `DEV_ROOT` is set to the parent directory of
   your Fuchsia checkout.

## Build Fuchsia with your custom Rust toolchain

1. Change into your Fuchsia directory.

1. Run the following command to use the newly built toolchain:

   ```posix-terminal
   DEV_ROOT={{ '<var>' }}DEV_ROOT{{ '</var>' }}

   fx set core.x64 \
     --args=rustc_prefix="\"$DEV_ROOT/rust/install/fuchsia-rust\"" \
     --args=rustc_version_string='"1"'
   # plus other settings such as:
   #   --with //bundles/kitchen_sink
   #   --variant=coverage-rust  # to enable coverage profiling of fuchsia binaries
   #   --variant=host_coverage-rust  # to enable coverage profiling of host binaries
   ```

   Note: `rustc_version_string` can be any string, and it’s used to force a
   recompile after a custom toolchain changes. If you rebuild the toolchain,
   change the value so Rust targets get rebuilt.

1. Run the following command to rebuild Fuchsia:

   ```posix-terminal
   fx build
   ```
