Fenix provides the minimal, default, and complete profile of rust toolchains, latest profile of nightly toolchains, nightly version of rust analyzer and its vscode extension.
It aims to be a replacement for rustup and the rust overlay provided by nixpkgs-mozilla.
Binary cache is available for x86_64-linux on cachix
cachix use nix-communityAs a flake (recommended)
# flake.nix
{
inputs = {
fenix = {
url = "github:nix-community/fenix";
inputs.nixpkgs.follows = "nixpkgs";
};
nixpkgs.url = "nixpkgs/nixpkgs-unstable";
};
outputs = { self, fenix, nixpkgs }: {
## as a set of packages
# fenix.packages.x86_64-linux.minimal.toolchain
# fenix.packages.x86_64-linux.stable.defaultToolchain
# fenix.packages.x86_64-linux.beta.completeToolchain
# fenix.packages.x86_64-linux.targets.aarch64-unknown-linux-gnu.latest.rust-std
# fenix.packages.x86_64-linux.targets.wasm32-unknown-unknown.stable.rust-std
# fenix.packages.x86_64-linux.rust-analyzer
# fenix.packages.x86_64-linux.rust-analyzer-vscode-extension
## as an overlay (in your nixos configuration)
# nixpkgs.overlays = [ fenix.overlay ];
# environment.systemPackages = with pkgs; [
# (with fenix;
# combine (with default; [
# cargo
# clippy-preview
# rust-std
# rustc
# rustfmt-preview
# latest.rust-src
# ]))
# (vscode-with-extensions.override {
# vscodeExtensions = [
# vscode-extensions.matklad.rust-analyzer-nightly
# ];
# })
# ];
};
}As an overlay
# configuration.nix
{
nixpkgs.overlays = [
(import (fetchTarball
"https://github.com/nix-community/fenix/archive/main.tar.gz"))
];
environment.systemPackages = [ pkgs.rust-nightly.default.toolchain ];
}As a set of packages
let
fenix = import "${
fetchTarball "https://github.com/nix-community/fenix/archive/main.tar.gz"
}/packages.nix";
in fenix.default.rustcall profiles (minimal, default, complete, and latest)
| platform | target |
|---|---|
| aarch64-linux | aarch64-unknown-linux-gnu |
| i686-linux | i686-unknown-linux-gnu |
| x86_64-darwin | x86_64-apple-darwin |
| x86_64-linux | x86_64-unknown-linux-gnu |
only rust-std (for cross compiling)
- aarch64-apple-darwin
- aarch64-apple-ios
- aarch64-linux-android
- aarch64-pc-windows-msvc
- aarch64-unknown-fuchsia
- aarch64-unknown-linux-musl
- arm-linux-androideabi
- arm-unknown-linux-gnueabi
- arm-unknown-linux-gnueabihf
- arm-unknown-linux-musleabi
- arm-unknown-linux-musleabihf
- armv5te-unknown-linux-gnueabi
- armv7-linux-androideabi
- armv7-unknown-linux-gnueabihf
- armv7-unknown-linux-musleabihf
- asmjs-unknown-emscripten
- i586-pc-windows-msvc
- i586-unknown-linux-gnu
- i586-unknown-linux-musl
- i686-linux-android
- i686-pc-windows-gnu
- i686-pc-windows-msvc
- i686-unknown-freebsd
- i686-unknown-linux-musl
- mips-unknown-linux-gnu
- mips-unknown-linux-musl
- mips64-unknown-linux-gnuabi64
- mips64el-unknown-linux-gnuabi64
- mipsel-unknown-linux-gnu
- mipsel-unknown-linux-musl
- powerpc-unknown-linux-gnu
- powerpc64-unknown-linux-gnu
- powerpc64le-unknown-linux-gnu
- s390x-unknown-linux-gnu
- sparc64-unknown-linux-gnu
- sparcv9-sun-solaris
- wasm32-unknown-emscripten
- wasm32-unknown-unknown
- x86_64-apple-ios
- x86_64-linux-android
- x86_64-pc-windows-gnu
- x86_64-pc-windows-msvc
- x86_64-rumprun-netbsd
- x86_64-sun-solaris
- x86_64-unknown-freebsd
- x86_64-unknown-fuchsia
- x86_64-unknown-illumos
- x86_64-unknown-linux-gnux32
- x86_64-unknown-linux-musl
- x86_64-unknown-netbsd
- x86_64-unknown-redox
The latest profile is a custom profile that contains all the components from the complete profile but not from necessarily the same date.
Components from this profile are more bleeding edge, but there is also a larger chance of incompatibility.
Examples to build rust programs with flake-utils and naersk
building with makeRustPlatform
# flake.nix
{
inputs = {
fenix = {
url = "github:nix-community/fenix";
inputs.nixpkgs.follows = "nixpkgs";
};
flake-utils.url = "github:numtide/flake-utils";
nixpkgs.url = "nixpkgs/nixpkgs-unstable";
};
outputs = { self, fenix, flake-utils, nixpkgs }:
flake-utils.lib.eachDefaultSystem (system:
let pkgs = nixpkgs.legacyPackages.${system};
in {
defaultPackage = (pkgs.makeRustPlatform {
inherit (fenix.packages.${system}.minimal) cargo rustc;
}).buildRustPackage {
pname = "hello";
version = "0.1.0";
src = ./.;
cargoSha256 = nixpkgs.lib.fakeSha256;
};
});
}building with naersk
# flake.nix
{
inputs = {
fenix = {
url = "github:nix-community/fenix";
inputs.nixpkgs.follows = "nixpkgs";
};
flake-utils.url = "github:numtide/flake-utils";
naersk = {
url = "github:nmattia/naersk";
inputs.nixpkgs.follows = "nixpkgs";
};
nixpkgs.url = "nixpkgs/nixpkgs-unstable";
};
outputs = { self, fenix, flake-utils, naersk, nixpkgs }:
flake-utils.lib.eachDefaultSystem (system: {
defaultPackage = (naersk.lib.${system}.override {
inherit (fenix.packages.${system}.minimal) cargo rustc;
}).buildPackage { src = ./.; };
});
}cross compiling with naersk
# flake.nix
{
inputs = {
fenix = {
url = "github:nix-community/fenix";
inputs.nixpkgs.follows = "nixpkgs";
};
flake-utils.url = "github:numtide/flake-utils";
naersk = {
url = "github:nmattia/naersk";
inputs.nixpkgs.follows = "nixpkgs";
};
nixpkgs.url = "nixpkgs/nixpkgs-unstable";
};
outputs = { self, fenix, flake-utils, naersk, nixpkgs }:
flake-utils.lib.eachDefaultSystem (system: {
defaultPackage = let
pkgs = nixpkgs.legacyPackages.${system};
target = "aarch64-unknown-linux-gnu";
toolchain = with fenix.packages.${system};
combine [
minimal.rustc
minimal.cargo
targets.${target}.latest.rust-std
];
in (naersk.lib.${system}.override {
cargo = toolchain;
rustc = toolchain;
}).buildPackage {
src = ./.;
CARGO_BUILD_TARGET = target;
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER =
"${pkgs.pkgsCross.aarch64-multiplatform.stdenv.cc}/bin/${target}-gcc";
};
});
}