1. Quick Start
The rust-lang/rust repository is the monorepo that produces the Rust programming language compiler (rustc), the standard library (core, alloc, std, proc_macro), and the complete development toolchain including Clippy, rustfmt, Miri, rust-analyzer, and rustdoc. If you want to use Rust to compile your own programs, install via rustup instead — building from source is for contributors and distribution builders.
Key features:
- Multi-stage bootstrapping compiler written in Rust, targeting LLVM for code generation
- Experimental Cranelift and GCC codegen backends for faster debug builds and broader platform support
- Standard library spanning
no_stdembedded (core) through full OS integration (std) - Bundled tools: Clippy (800+ lints), rustfmt (auto-formatting), Miri (undefined behavior detection), rust-analyzer (IDE), rustdoc (documentation generation)
- 50,000+ tests across UI diagnostics, MIR optimizations, codegen, and integration suites
- Cross-compilation for 80+ target triples
- Incremental compilation to speed up rebuilds during development
Prerequisites: Python 3, a C/C++ compiler (GCC or Clang on Linux, MSVC on Windows, Xcode on macOS), cmake, curl, and 30+ GB of disk space.
Quick build:
git clone https://github.com/rust-lang/rust.git
cd rust
./x setup compiler
./x build
Building bootstrap
Finished `dev` profile [unoptimized] target(s)
Building stage0 library artifacts (x86_64-unknown-linux-gnu)
Building stage0 compiler artifacts (x86_64-unknown-linux-gnu)
Building stage1 library artifacts (x86_64-unknown-linux-gnu)
Building stage1 compiler artifacts (x86_64-unknown-linux-gnu)
Tip
Run
./x setupinteractively to choose a profile (compiler,library,tools,codegen,dist, ornone). Each profile pre-configuresbootstrap.tomlwith sensible defaults for your workflow.
What to try next: Run ./x test tests/ui to exercise the compiler's diagnostic test suite, or ./x doc library --open to build and browse the standard library documentation.
2. Installation
System Requirements
| Resource | Minimum | Recommended |
|---|---|---|
| Disk space | 15 GB (single stage) | 30+ GB (full build + tests) |
| RAM | 4 GB | 8+ GB |
| CPU | 2 cores | 8+ cores |
| Python | 3.x | 3.8+ |
| C/C++ compiler | GCC 7+ / Clang 8+ / MSVC 2019+ | Latest stable |
Getting the Source
git clone https://github.com/rust-lang/rust.git
cd rust
Important
The repository is large (~2 GB clone). Use
--depth 1for a shallow clone if you only need to build without full history:git clone --depth 1 https://github.com/rust-lang/rust.git.
Platform Dependencies
Linux (Debian/Ubuntu)
sudo apt-get install build-essential python3 cmake curl ninja-build pkg-config libssl-dev
Linux (Fedora/RHEL)
sudo dnf install gcc gcc-c++ python3 cmake curl ninja-build pkgconfig openssl-devel
macOS
xcode-select --install
brew install cmake ninja python3
Windows
Install Visual Studio 2019+ with the "Desktop development with C++" workload.
Ensure Python 3 is on PATH.
Install CMake and Ninja via winget or the official installers.
Initial Configuration
Run the interactive setup wizard:
./x setup
Welcome to the Rust compiler build system!
The following profiles are available:
a] compiler: Contribute to the compiler itself
b] library: Contribute to the standard library
c] tools: Contribute to tools (Clippy, rustfmt, etc.)
d] codegen: Contribute to code generation (LLVM, Cranelift)
e] dist: Build a full distribution
f] none: Start from a blank slate
Please choose a profile (a-f):
This generates a bootstrap.toml configuration file. You can also copy and edit the annotated example:
cp bootstrap.example.toml bootstrap.toml
Note
The build system uses
x.py(aliased as./xon Unix,x.ps1on Windows) to orchestrate multi-stage builds. All./xcommands documented here also work aspython3 x.pyif the shell alias is not available. TheRUST_IGNORE_OLD_PYTHONenvironment variable suppresses warnings about older Python versions.
Building the Compiler
# Build the compiler (stage 1 by default for the "compiler" profile)
./x build
# Build a specific component
./x build compiler
./x build library
./x build src/tools/clippy
# Build stage 2 compiler (full self-hosted, slower)
./x build --stage 2
Post-Build Verification
# Run the built compiler
./build/host/stage1/bin/rustc --version
rustc 1.XX.0-dev
# Create a rustup toolchain link to your build
rustup toolchain link stage1 build/host/stage1
rustc +stage1 --version
Tip
Linking your build as a rustup toolchain lets you test it on real projects:
cargo +stage1 build.
Install Troubleshooting
Error: python3: command not found
Cause: Python 3 is not installed or not on PATH.
Solution:
- Install Python 3 from your package manager or python.org
- Verify:
python3 --version
Prevention: The x wrapper script checks for Python at startup.
Error: CMake not found
Cause: CMake is required to build LLVM from source.
Solution:
- Install CMake via your package manager
- Alternatively, set
download-ci-llvm = trueinbootstrap.tomlto skip the LLVM build entirely
Error: LLVM build failed with out of memory
Cause: LLVM compilation is memory-intensive. Systems with less than 8 GB RAM may fail.
Solution:
- Set
download-ci-llvm = truein[llvm]inbootstrap.toml(recommended — downloads pre-built LLVM) - Or limit parallelism:
./x build -j 2 - Or set
ninja = falseunder[llvm]to reduce peak memory
Prevention: Use download-ci-llvm = true on memory-constrained machines.
Error: error: linking with cc failed
Cause: System linker cannot find required libraries.
Solution:
- Debian/Ubuntu:
sudo apt-get install libc6-dev - Fedora:
sudo dnf install glibc-devel - macOS: ensure Xcode command line tools are installed
Error: Could not find C compiler
Cause: No C/C++ toolchain installed.
Solution:
- Linux:
sudo apt-get install build-essential - macOS:
xcode-select --install - Windows: install Visual Studio with the C++ workload
3. Configuration
bootstrap.toml Overview
The primary configuration file is bootstrap.toml at the repository root, generated by ./x setup or copied from bootstrap.example.toml. It controls every aspect of the build.
| Section | Purpose |
|---|---|
[build] |
Host/target triples, parallelism, submodules, documentation |
[install] |
Installation prefix and paths |
[llvm] |
LLVM build options (download pre-built, assertions, targets) |
[rust] |
Compiler options (debug assertions, codegen backends, LTO, incremental) |
[target.<triple>] |
Per-target linker, C compiler, LLVM config |
[dist] |
Distribution packaging options |
Recommended development configuration:
# Fast builds for compiler contributors
[llvm]
download-ci-llvm = true # Skip LLVM build, download pre-built
[rust]
debug-assertions = true # Catch internal bugs
incremental = true # Faster rebuilds
Key Environment Variables
| Variable | Purpose |
|---|---|
RUSTC_BOOTSTRAP |
Enable unstable features (1 to enable). Set automatically during bootstrap. |
RUSTC_BREAK_ON_ICE |
Set to 1 to trigger a debugger breakpoint on Internal Compiler Errors |
RUST_BACKTRACE |
1 or full for backtraces on panics |
RUST_TEST_THREADS |
Number of parallel test threads |
RUST_TEST_SHUFFLE |
Randomize test execution order |
RUST_TEST_SHUFFLE_SEED |
Seed for test shuffle ordering |
RUST_TEST_NOCAPTURE |
Show stdout/stderr from tests |
RAYON_NUM_THREADS |
Thread pool size for parallel compilation passes |
RAYON_RS_NUM_CPUS |
Override detected CPU count for Rayon thread pool |
Warning
Setting
RUSTC_BOOTSTRAP=1enables nightly-only features on any toolchain. The build system uses this internally. Never set it in production builds — it voids all stability guarantees.
See the Admin Guide for the full configuration reference including all bootstrap.toml sections, internal environment variables, and per-tool configuration knobs.
4. Core Usage
The x Build System
All interaction with the Rust build system goes through the x command (a wrapper around x.py):
| Command | Purpose |
|---|---|
./x build |
Build compiler, library, or tools |
./x test |
Run tests |
./x check |
Type-check without code generation (fast) |
./x doc |
Build documentation |
./x fmt |
Format source code with rustfmt |
./x clippy |
Run Clippy lints on the codebase |
./x clean |
Remove build artifacts |
./x setup |
Interactive configuration wizard |
./x suggest |
Suggest tests to run based on changed files |
./x dist |
Build distribution tarballs |
./x install |
Install the built toolchain |
./x bench |
Run benchmarks |
./x run |
Build and run a specific tool |
./x perf |
Run performance benchmarks |
./x vendor |
Vendor all Cargo dependencies |
Common flags:
| Flag | Purpose |
|---|---|
--stage N |
Build or test at stage N (0, 1, or 2) |
-j N |
Limit build parallelism to N jobs |
--keep-stage N |
Reuse existing stage N artifacts (fast incremental) |
-v / -vv |
Increase build output verbosity |
--warnings deny |
Treat warnings as errors |
--target <triple> |
Cross-compile for a specific target |
Tip
Use
./x checkduring development for rapid feedback. It runs type checking without code generation, completing in a fraction of the time of a full./x build.
Understanding Build Stages
The Rust compiler uses a multi-stage bootstrap process:
| Stage | What it is | When to use |
|---|---|---|
| Stage 0 | Pre-existing compiler downloaded from CI (beta channel) | Automatically used — you don't invoke it directly |
| Stage 1 | Compiler built by Stage 0 from your local source | Most development and testing |
| Stage 2 | Compiler built by Stage 1 (self-hosted) | Release validation, CI, confirming self-host |
Most contributors work exclusively with Stage 1. A Stage 2 build proves the compiler can compile itself but takes significantly longer.
Note
The
--keep-stage 1flag tells the build system to reuse existing Stage 1 artifacts, rebuilding only what changed. This dramatically speeds up the edit-compile-test cycle. If you see unexpected behavior, do a clean rebuild:./x clean && ./x build.
Running the Built Compiler
# Direct invocation
./build/host/stage1/bin/rustc my_program.rs
# Through rustup toolchain link
rustup toolchain link stage1 build/host/stage1
rustc +stage1 my_program.rs
cargo +stage1 build
Using Bundled Tools
Clippy (Linter)
Clippy provides 800+ lints for catching common mistakes, style issues, and performance pitfalls.
# Build and test Clippy
./x build src/tools/clippy
./x test src/tools/clippy
# Run Clippy on the compiler source
./x clippy compiler
./x clippy library
| Environment Variable | Purpose |
|---|---|
CLIPPY_CONF_DIR |
Path to Clippy configuration directory |
CLIPPY_ARGS |
Additional arguments passed to the Clippy driver |
CLIPPY_TERMINAL_WIDTH |
Terminal width for output formatting |
CLIPPY_DISABLE_DOCS_LINKS |
Disable documentation links in lint output |
CARGO_PRIMARY_PACKAGE |
Used by Clippy to identify the primary package in a workspace |
rustfmt (Formatter)
# Build rustfmt
./x build src/tools/rustfmt
# Format the entire repository
./x fmt
# Check formatting without modifying files
./x fmt --check
Warning
CI rejects pull requests with formatting errors. Always run
./x fmtbefore pushing.
Miri (MIR Interpreter)
Miri interprets Rust's Mid-level Intermediate Representation to detect undefined behavior, data races, and memory leaks.
./x build src/tools/miri
./x test src/tools/miri
| Environment Variable | Purpose |
|---|---|
MIRIFLAGS |
Additional flags for the Miri interpreter |
MIRI_VERBOSE |
Enable verbose diagnostic output |
MIRI_LOCAL_CRATES |
Comma-separated list of crates considered "local" for diagnostics |
rust-analyzer (IDE Support)
./x build src/tools/rust-analyzer
./x test src/tools/rust-analyzer
| Environment Variable | Purpose |
|---|---|
RA_TARGET |
Override the target triple for analysis |
RA_LRU_CAP |
LRU cache capacity for analysis results |
RUST_SRC_PATH |
Path to Rust source for standard library analysis |
SKIP_SLOW_TESTS |
Skip slow integration tests during development |
Important
When developing the rust-lang/rust repo, the
./x setupwizard configures rust-analyzer to use the proc-macro server built from the tree. Using a mismatched system-installed version can cause spurious errors in your IDE.
5. Common Tasks
Task: Run the Test Suite
Goal: Verify your changes pass existing tests.
# Run UI tests (the primary compiler diagnostic test suite)
./x test tests/ui
# Run a specific test file
./x test tests/ui/borrowck/borrowck-moved-value-into-closure.rs
# Run all tests for a component
./x test compiler
./x test library
./x test src/tools/clippy
# Run tests matching a filter
./x test tests/ui -- my_test_name
# Run the full test suite (takes hours)
./x test
Tip
Use
./x suggestto automatically determine which tests to run based on changed files. This is much faster than running the entire suite.
Task: Add a New UI Test
Goal: Create a test verifying specific compiler behavior.
-
Create a
.rsfile in the appropriate test directory:// tests/ui/my-new-test.rs fn main() { let x: i32 = "not a number"; //~ ERROR mismatched types } -
Run the test to generate expected output:
./x test tests/ui/my-new-test.rs --bless -
Review the generated
tests/ui/my-new-test.stderrto confirm it matches your intent. -
Commit both the
.rsfile and the.stderrfile.
Important
The
--blessflag overwrites expected output files with actual compiler output. Always review the generated.stderrbefore committing.
Task: Build for a Different Target
Goal: Cross-compile the standard library for another platform.
-
Add the target to
bootstrap.toml:[build] target = ["x86_64-unknown-linux-gnu", "aarch64-unknown-linux-gnu"] -
Build:
./x build --target aarch64-unknown-linux-gnu library
Task: Build Standard Library Documentation
# Build and open in browser
./x doc library --open
# Build compiler internals documentation
./x doc compiler
Task: Debug an Internal Compiler Error (ICE)
-
Reproduce with backtraces:
RUST_BACKTRACE=1 ./build/host/stage1/bin/rustc failing_code.rs -
Enable debug assertions in
bootstrap.toml:[rust] debug-assertions = true -
Rebuild and trigger the ICE under a debugger with
RUSTC_BREAK_ON_ICE=1. -
File an issue at https://github.com/rust-lang/rust/issues with the backtrace, input code, and output of
rustc --version --verbose.
Task: Profile Compiler Performance
# Time individual compiler passes
./build/host/stage1/bin/rustc -Z time-passes my_crate.rs
Task: Run the Tidy Linter
The tidy tool enforces repository-wide style and hygiene rules.
./x test tidy
Task: Build Distribution Tarballs
./x setup dist
./x dist
# Outputs in build/dist/
Task: Format Changed Files Before Committing
# Auto-format
./x fmt
# Check only (no modifications)
./x fmt --check
Task: Use an Alternative Codegen Backend
Cranelift (faster debug builds, less optimized output):
# bootstrap.toml
[rust]
codegen-backends = ["cranelift"]
GCC (experimental, broader platform support):
The rustc_codegen_gcc backend uses libgccjit. Environment variables for debugging:
| Variable | Purpose |
|---|---|
CG_GCCJIT_DUMP_GIMPLE |
Dump GIMPLE representation |
CG_GCCJIT_DUMP_RTL |
Dump RTL representation |
CG_GCCJIT_DUMP_CODE |
Dump generated assembly |
CG_GCCJIT_DUMP_EVERYTHING |
Enable all GCC debug dumps |
CG_GCCJIT_VERBOSE |
Verbose GCC backend output |
CG_GCCJIT_KEEP_INTERMEDIATES |
Keep intermediate compilation files |
Task: Vendor Dependencies for Offline Builds
./x vendor
This copies all Cargo dependencies into the repository for offline or air-gapped builds.
6. Troubleshooting
Diagnostic Decision Tree
Build fails?
├── LLVM error? → Set download-ci-llvm = true in bootstrap.toml
├── Stage 0 download fails? → Check internet, delete build/cache, retry
├── Linker error? → Install C/C++ toolchain and development libraries
├── Out of memory? → Reduce parallelism (-j 2) or use download-ci-llvm
└── Unexpected warnings/errors? → Run ./x clean, then rebuild
Test failure?
├── Output mismatch? → Review diff, use --bless if intentional
├── Timeout? → Increase RUST_TEST_THREADS or run specific tests
├── ICE during test? → Set RUST_BACKTRACE=1, check issue tracker
└── Flaky? → Re-run, check RUST_TEST_SHUFFLE_SEED for ordering issues
IDE errors?
├── Proc-macro mismatch? → Re-run ./x setup for VS Code configuration
├── Missing standard library? → Set RUST_SRC_PATH or rebuild library
└── Slow analysis? → Adjust RA_LRU_CAP, close unused workspaces
Error: error: failed to run custom build command for rustc_llvm
Cause: LLVM build failure — missing dependencies, insufficient memory, or CMake misconfiguration.
Solution:
- Set
download-ci-llvm = truein the[llvm]section ofbootstrap.toml - If building from source: ensure CMake and Ninja are installed, and you have 10+ GB free disk space
Prevention: Use download-ci-llvm = true unless you are specifically modifying LLVM integration.
Error: error[E0554]: #![feature] may not be used on the stable release channel
Cause: Attempting to build compiler crates with cargo build instead of ./x build.
Solution:
- Always use
./x build— it manages the bootstrap compiler and setsRUSTC_BOOTSTRAPcorrectly - Never run
cargo builddirectly on the compiler workspace
Prevention: Use ./x build, ./x test, ./x check for all compiler work.
Error: test failed: unexpected output difference
Cause: A UI test's actual stderr/stdout differs from the expected .stderr/.stdout file.
Solution:
- Review the diff shown in the test output
- If the change is intentional:
./x test tests/ui/path/to/test.rs --bless - If unintentional: revert or fix your compiler change
Error: thread 'main' panicked at 'bootstrap artifacts not found'
Cause: The bootstrap process could not download or locate the Stage 0 compiler.
Solution:
- Check internet connectivity
- Delete
build/cache/and retry:rm -rf build/cache && ./x build - Verify
src/stage0is intact
Issue: Build is extremely slow
Cause: Building LLVM and a full stage 2 compiler from scratch is resource-intensive.
Solution:
- Use
download-ci-llvm = true(saves 20-40 minutes) - Use
./x checkfor type-checking only (no codegen) - Use
--keep-stage 1for incremental rebuilds after small changes - Set
incremental = truein[rust] - Reduce parallelism on memory-constrained machines:
./x build -j 4
Issue: --keep-stage produces stale or incorrect results
Cause: Cached artifacts from a previous build don't reflect your latest source changes.
Solution:
- Do a clean build:
./x clean && ./x build - Only use
--keep-stagewhen your change is isolated to one stage
ICE: Wrust-2021-incompatible-closure-captures (GitHub #155497)
Cause: Internal compiler error in closure capture analysis during edition 2021 migration.
Solution:
- Check if reproducible on latest nightly
- File or update the tracking issue with a minimal reproduction case
ICE: InterpErrorInfo / UndefinedBehavior(ValidationError ...) (GitHub #155496)
Cause: MIR interpreter validation error during const evaluation.
Solution:
- Simplify the const expression to isolate the trigger
- Search the issue tracker for known instances
Error: llvm error: export_name (GitHub #155495)
Cause: LLVM backend error related to symbol export naming.
Solution:
- Check if the target triple is supported for the feature being used
- Try building without LTO to isolate the issue
7. FAQ
Q: What is rust-lang/rust and who is it for?
This repository contains the source code for the Rust compiler, standard library, and toolchain. It is for compiler contributors, language designers, standard library developers, tool maintainers, and distribution packagers. Regular Rust users should install via rustup.
Q: Should I use cargo build or ./x build?
Always ./x build. The Rust compiler has a multi-stage bootstrap that cargo build cannot manage. The x.py script handles downloading the bootstrap compiler, managing stages, and setting internal environment variables.
Q: How long does a full build take?
A clean build with LLVM from source: 30–90 minutes depending on hardware. With download-ci-llvm = true: 10–30 minutes. Incremental rebuilds with --keep-stage 1: under 5 minutes for small changes.
Q: Which stage should I test against?
Stage 1 for almost all development work. Stage 2 only when verifying self-hosting behavior or preparing release builds.
Q: How do I run only tests relevant to my change?
Use ./x suggest to auto-detect affected tests. Or target specific suites: ./x test tests/ui, ./x test tests/mir-opt, ./x test src/tools/clippy.
Q: What does --bless do?
It updates the expected output files (.stderr, .stdout) for UI tests to match the current compiler output. Use it when you have intentionally changed compiler diagnostics.
Q: Can I cross-compile Rust programs with a from-source build?
Yes. Add target triples to [build] target in bootstrap.toml, build with ./x build --target <triple>, then use cargo +stage1 build --target <triple>.
Q: What are the test suite directories?
| Directory | What it tests |
|---|---|
tests/ui |
Compiler diagnostics (errors, warnings, suggestions) |
tests/mir-opt |
MIR optimization passes |
tests/codegen-llvm |
LLVM IR generation |
tests/run-make |
Integration tests (compile + run) |
tests/run-make-cargo |
Cargo-based integration tests |
tests/rustdoc-js |
Rustdoc search functionality |
tests/rustdoc-gui |
Rustdoc HTML rendering |
tests/ui-fulldeps |
Tests requiring full compiler dependencies |
Q: Where is the rustc dev guide?
The comprehensive contributor guide is at https://rustc-dev-guide.rust-lang.org/ with source in src/doc/rustc-dev-guide/.
Q: How do I debug a specific compiler pass?
Set RUSTC_LOG=<crate_name>=debug to enable logging. For example: RUSTC_LOG=rustc_borrowck=debug ./build/host/stage1/bin/rustc test.rs. The rustc_log crate manages the logging infrastructure using the tracing framework.
Q: What is RUSTC_BOOTSTRAP?
An environment variable that enables #![feature(...)] attributes on any compiler channel. The build system sets it automatically. Setting it manually in end-user code voids Rust's stability guarantees.
Q: How do I build a distributable release?
Use the dist profile: ./x setup dist && ./x dist. Tarballs are produced in build/dist/.