Build a custom Rust toolchain for Fuchsia
This guide explains how to build a Rust compiler for use with the Fuchsia. This is useful if you need to build Fuchsia with a patched compiler, or a compiler built with custom options. Building a custom Rust toolchain is not always necessary for building Fuchsia with a different version of Rust; see Build Fuchsia with a custom Rust toolchain for details.
Prerequisites
Prior to building a custom Rust toolchain for Fuchsia, you need to do the following:
- Run the following command to install cmake:
- Run the following command to obtain the infra sources:
DEV_ROOT={{ '<var>' }}DEV_ROOT{{ '</var> '}} # parent of your Rust directory
mkdir -p $DEV_ROOT/infra && \
( \
builtin cd $DEV_ROOT/infra && \
jiri init && \
jiri import -overwrite -name=fuchsia/manifest infra \
https://fuchsia.googlesource.com/manifest && \
jiri update \
)
Note: Running jiri update from the infra directory ensures that you
have the most recent configurations and tools.
-
Download and extract the Fuchsia core IDK to
$DEV_ROOT/sdk. For more information, see Download the Fuchsia IDK. -
Run the following command to use
cipdto get the linuxsysrootpackage for your host platform:
# You may want to: rm -rf $DEV_ROOT/sysroot
mkdir -p $DEV_ROOT/sysroot
cipd install fuchsia/third_party/sysroot/linux latest -root $DEV_ROOT/sysroot/linux
- If you haven't already, clone the Rust source. The Guide to Rustc Development is a good resource to reference whenever you're working on the compiler.
Configure Rust for Fuchsia
- Change into your Rust directory.
- Run the following command to generate a configuration for the Rust toolchain:
DEV_ROOT={{ '<var>' }}DEV_ROOT{{ '</var>' }}
$DEV_ROOT/infra/fuchsia/prebuilt/tools/vpython \
$DEV_ROOT/infra/fuchsia/recipes/recipes/contrib/rust_toolchain.resources/generate_config.py \
config_toml \
--clang-prefix=$DEV_ROOT/fuchsia/prebuilt/third_party/clang/linux-x64 \
--host-sysroot=$DEV_ROOT/sysroot/linux \
--prefix=$(pwd)/install/fuchsia-rust \
| tee fuchsia-config.toml
$DEV_ROOT/infra/fuchsia/prebuilt/tools/vpython \
$DEV_ROOT/infra/fuchsia/recipes/recipes/contrib/rust_toolchain.resources/generate_config.py \
environment \
--eval \
--clang-prefix=$DEV_ROOT/fuchsia/prebuilt/third_party/clang/linux-x64 \
--sdk-dir=$DEV_ROOT/sdk \
--linux-amd64-sysroot=$DEV_ROOT/sysroot/linux \
--linux-arm64-sysroot=$DEV_ROOT/sysroot/linux \
| tee fuchsia-env.sh
- (Optional) Run the following command to tell git to ignore the generated files:
- (Optional) Customize
fuchsia-config.toml.
Build and install Rust
- Change into your Rust source directory.
- Run the following command to build and install Rust plus the Fuchsia runtimes spec:
DEV_ROOT={{ '<var>' }}DEV_ROOT{{ '</var>' }}
rm -rf install/fuchsia-rust
mkdir -p install/fuchsia-rust
# Copy and paste the following subshell to build and install Rust, as needed.
# The subshell avoids polluting your environment with fuchsia-specific rust settings.
( source fuchsia-env.sh && ./x.py install --config fuchsia-config.toml ) && \
rm -rf install/fuchsia-rust/lib/.build-id && \
$DEV_ROOT/infra/fuchsia/prebuilt/tools/vpython \
$DEV_ROOT/infra/fuchsia/recipes/recipes/contrib/rust_toolchain.resources/generate_config.py \
runtime \
| $DEV_ROOT/infra/fuchsia/prebuilt/tools/vpython \
$DEV_ROOT/infra/fuchsia/recipes/recipe_modules/toolchain/resources/runtimes.py \
--dir install/fuchsia-rust/lib \
--readelf fuchsia-build/*/llvm/bin/llvm-readelf \
--objcopy fuchsia-build/*/llvm/bin/llvm-objcopy \
> install/fuchsia-rust/lib/runtime.json
Build only (optional)
If you want to skip the install step, for instance during development of Rust itself, you can do so with the following command.
Troubleshooting
If you are getting build errors, try deleting the Rust build directory:
Then re-run the command to build Rust.
Building Fuchsia with a custom Rust toolchain
With a newly compiled custom Rust toolchain, you're ready to use it to build Fuchsia. Directions on how to do so are available in a [dedicated guide].