Skip to content

Rust

The languages.rust module provides comprehensive support for Rust development, offering flexible toolchain management through two distinct approaches.

Enable Rust support in your devenv.nix:

{
languages.rust.enable = true;
}

This will provide a complete Rust development environment with rustc, cargo, clippy, rustfmt, and rust-analyzer.

devenv supports two approaches for managing Rust toolchains:

The nixpkgs channel is easy to set up and uses the Rust version currently available in your nixpkgs revision. However, it’s limited to the version in nixpkgs.

{
languages.rust = {
enable = true;
channel = "nixpkgs"; # default
};
}

For more control over versions and features, use the stable, beta, or nightly channels powered by rust-overlay:

  • ✅ Rustup-like channel selection
  • ✅ Access to any Rust version
  • ✅ Support for cross-compilation targets
{
languages.rust = {
enable = true;
channel = "stable";
version = "1.81.0"; # or "latest"
};
}
{
languages.rust = {
enable = true;
channel = "stable";
};
}
{
languages.rust = {
enable = true;
channel = "nightly";
components = [ "rustc" "cargo" "clippy" "rustfmt" "rust-analyzer" "miri" ];
};
}
{
languages.rust = {
enable = true;
channel = "stable";
targets = [ "wasm32-unknown-unknown" "aarch64-unknown-linux-gnu" ];
};
}
{
languages.rust = {
enable = true;
channel = "stable";
components = [ "rustc" "cargo" "rust-std" ];
};
}

If your project uses a rust-toolchain.toml file, devenv can automatically configure the toolchain from it:

{
languages.rust = {
enable = true;
toolchainFile = ./rust-toolchain.toml;
};
}

Example rust-toolchain.toml:

[toolchain]
channel = "stable"
components = ["rustfmt", "clippy"]
profile = "minimal"

Rust tools integrate seamlessly with git hooks:

{
languages.rust.enable = true;
git-hooks.hooks = {
rustfmt.enable = true;
clippy.enable = true;
};
}

Whether to enable tools for Rust development.

Type: boolean

Default:

false

Example:

true

Declared by:

The rustup toolchain to install.

Type: one of “nixpkgs”, “stable”, “beta”, “nightly”

Default:

"nixpkgs"

Declared by:

Use Clang as the Rust linker driver on Linux.

This avoids GCC’s collect2 wrapper, which can hit Argument list too long in large Nix development environments before the final linker receives Rust’s response file.

On x86_64 Linux (glibc), Clang uses LLD unless another linker is enabled.

Type: boolean

Default:

pkgs.stdenv.hostPlatform.isLinux

Declared by:

List of Rustup components to install. Defaults to those available in nixpkgs.

Type: list of string

Default:

[ "rustc" "cargo" "clippy" "rustfmt" "rust-analyzer" ]

Declared by:

Use Cranelift as the codegen backend for dev builds.

Cranelift compiles significantly faster than LLVM at the cost of less optimized output. Requires the nightly channel.

Type: boolean

Default:

false

Declared by:

List of crate names that should use the LLVM backend instead of Cranelift.

Generates per-package overrides in .cargo/config.toml.

Type: list of string

Default:

[ ]

Example:

[
"aws-lc-sys"
"aws-lc-rs"
"rustls"
]

Declared by:

languages.rust.cranelift.forceBuildScriptsLlvm

Section titled “languages.rust.cranelift.forceBuildScriptsLlvm”

Force build scripts and proc macros to use the LLVM backend.

Some build scripts may not work with Cranelift. Enable this to fall back to LLVM for build scripts while keeping Cranelift for regular code.

Type: boolean

Default:

false

Declared by:

Import a Cargo project using crate2nix.

This function takes a path to a directory containing a Cargo.toml file and returns a derivation that builds the Rust project using crate2nix.

Example usage:

let
mypackage = config.languages.rust.import ./path/to/cargo/project {};
in {
languages.rust.enable = true;
packages = [ mypackage ];
}

Type: function that evaluates to a(n) function that evaluates to a(n) package

Declared by:

Use lld as the linker.

lld is LLVM’s linker and is the recommended fast linker for Darwin. Works on both Linux and macOS.

Type: boolean

Default:

false

Declared by:

Whether to enable Rust Language Server.

Type: boolean

Default:

true

Example:

true

Declared by:

The Rust language server package to use.

Type: package

Default: Depends on the configured toolchain:

  • nixpkgs channel: pkgs.rust-analyzer.
  • non-nixpkgs channel: the rust-analyzer component from the rust-overlay toolchain, with a fallback to pkgs.rust-analyzer if not present in the manifest.
  • toolchainFile: the aggregated toolchain package derived from the file.

Declared by:

Use mold as the linker.

mold is a faster drop-in replacement for existing Unix linkers. It is several times quicker than the LLVM lld linker.

Type: boolean

Default:

false

Declared by:

Extra flags to pass to Rustdoc.

Type: string

Default:

""

Declared by:

Extra flags to pass to the Rust compiler.

Type: string

Default:

""

Declared by:

List of extra targets to install. Defaults to only the native target.

Type: list of string

Default:

[ ]

Declared by:

Rust component packages. May optionally define additional components, for example miri.

Type: open submodule of attribute set of package

Default:

nixpkgs

Declared by:

cargo package

Type: null or package

Default:

pkgs.cargo

Declared by:

clippy package

Type: null or package

Default:

pkgs.clippy

Declared by:

rust-analyzer package

Type: null or package

Default:

pkgs.rust-analyzer

Declared by:

rustc package

Type: null or package

Default:

pkgs.rustc

Declared by:

rustfmt package

Type: null or package

Default:

pkgs.rustfmt

Declared by:

Path to a rust-toolchain or rust-toolchain.toml file for automatic toolchain configuration.

When set, devenv will use rust-overlay’s fromRustupToolchainFile to automatically configure the toolchain based on the file contents (channel, components, targets, profile).

This follows the standard Rust toolchain file format documented at: https://rust-lang.github.io/rustup/overrides.html#the-toolchain-file

Cannot be used together with manual channel or version configuration.

Example:

languages.rust.toolchainFile = ./rust-toolchain.toml;

Type: null or absolute path

Default:

null

Example:

./rust-toolchain.toml

Declared by:

The aggregated toolchain package, which includes the configured components and targets. This is automatically set based on the channel and components configuration.

Type: package

Declared by:

Which version of rust to use, this value could be latest,1.81.0, 2021-01-01. Only works when languages.rust.channel is NOT nixpkgs.

Type: string

Default:

"latest"

Declared by:

Use wild as the linker.

wild is a very fast linker for Linux.

Type: boolean

Default:

false

Declared by: