Rust
The languages.rust module provides comprehensive support for Rust development, offering flexible toolchain management through two distinct approaches.
Getting started
Section titled “Getting started”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.
Toolchain management
Section titled “Toolchain management”devenv supports two approaches for managing Rust toolchains:
1. nixpkgs channel (default)
Section titled “1. nixpkgs channel (default)”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 };}2. rust-overlay channels
Section titled “2. rust-overlay channels”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" };}Examples
Section titled “Examples”Basic setup with latest stable
Section titled “Basic setup with latest stable”{ languages.rust = { enable = true; channel = "stable"; };}Nightly Rust with extra components
Section titled “Nightly Rust with extra components”{ languages.rust = { enable = true; channel = "nightly"; components = [ "rustc" "cargo" "clippy" "rustfmt" "rust-analyzer" "miri" ]; };}Cross-compilation setup
Section titled “Cross-compilation setup”{ languages.rust = { enable = true; channel = "stable"; targets = [ "wasm32-unknown-unknown" "aarch64-unknown-linux-gnu" ]; };}Minimal installation
Section titled “Minimal installation”{ languages.rust = { enable = true; channel = "stable"; components = [ "rustc" "cargo" "rust-std" ]; };}Using rust-toolchain.toml
Section titled “Using rust-toolchain.toml”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"Integration with other tools
Section titled “Integration with other tools”Git hooks
Section titled “Git hooks”Rust tools integrate seamlessly with git hooks:
{ languages.rust.enable = true;
git-hooks.hooks = { rustfmt.enable = true; clippy.enable = true; };}Options
Section titled “Options”languages.rust.enable
Section titled “languages.rust.enable”Whether to enable tools for Rust development.
Type: boolean
Default:
falseExample:
trueDeclared by:
languages.rust.channel
Section titled “languages.rust.channel”The rustup toolchain to install.
Type: one of “nixpkgs”, “stable”, “beta”, “nightly”
Default:
"nixpkgs"Declared by:
languages.rust.clangLinker.enable
Section titled “languages.rust.clangLinker.enable”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.isLinuxDeclared by:
languages.rust.components
Section titled “languages.rust.components”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:
languages.rust.cranelift.enable
Section titled “languages.rust.cranelift.enable”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:
falseDeclared by:
languages.rust.cranelift.excludePackages
Section titled “languages.rust.cranelift.excludePackages”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:
falseDeclared by:
languages.rust.import
Section titled “languages.rust.import”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:
letmypackage = 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:
languages.rust.lld.enable
Section titled “languages.rust.lld.enable”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:
falseDeclared by:
languages.rust.lsp.enable
Section titled “languages.rust.lsp.enable”Whether to enable Rust Language Server.
Type: boolean
Default:
trueExample:
trueDeclared by:
languages.rust.lsp.package
Section titled “languages.rust.lsp.package”The Rust language server package to use.
Type: package
Default: Depends on the configured toolchain:
nixpkgschannel:pkgs.rust-analyzer.- non-nixpkgs channel: the
rust-analyzercomponent from the rust-overlay toolchain, with a fallback topkgs.rust-analyzerif not present in the manifest. toolchainFile: the aggregated toolchain package derived from the file.
Declared by:
languages.rust.mold.enable
Section titled “languages.rust.mold.enable”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:
falseDeclared by:
languages.rust.rustdocflags
Section titled “languages.rust.rustdocflags”Extra flags to pass to Rustdoc.
Type: string
Default:
""Declared by:
languages.rust.rustflags
Section titled “languages.rust.rustflags”Extra flags to pass to the Rust compiler.
Type: string
Default:
""Declared by:
languages.rust.targets
Section titled “languages.rust.targets”List of extra targets to install. Defaults to only the native target.
Type: list of string
Default:
[ ]Declared by:
languages.rust.toolchain
Section titled “languages.rust.toolchain”Rust component packages. May optionally define additional components, for example miri.
Type: open submodule of attribute set of package
Default:
nixpkgsDeclared by:
languages.rust.toolchain.cargo
Section titled “languages.rust.toolchain.cargo”cargo package
Type: null or package
Default:
pkgs.cargoDeclared by:
languages.rust.toolchain.clippy
Section titled “languages.rust.toolchain.clippy”clippy package
Type: null or package
Default:
pkgs.clippyDeclared by:
languages.rust.toolchain.rust-analyzer
Section titled “languages.rust.toolchain.rust-analyzer”rust-analyzer package
Type: null or package
Default:
pkgs.rust-analyzerDeclared by:
languages.rust.toolchain.rustc
Section titled “languages.rust.toolchain.rustc”rustc package
Type: null or package
Default:
pkgs.rustcDeclared by:
languages.rust.toolchain.rustfmt
Section titled “languages.rust.toolchain.rustfmt”rustfmt package
Type: null or package
Default:
pkgs.rustfmtDeclared by:
languages.rust.toolchainFile
Section titled “languages.rust.toolchainFile”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:
nullExample:
./rust-toolchain.tomlDeclared by:
languages.rust.toolchainPackage
Section titled “languages.rust.toolchainPackage”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:
languages.rust.version
Section titled “languages.rust.version”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:
languages.rust.wild.enable
Section titled “languages.rust.wild.enable”Use wild as the linker.
wild is a very fast linker for Linux.
Type: boolean
Default:
falseDeclared by:

