{ inputs = { fenix.url = "github:nix-community/fenix"; flake-utils.url = "github:numtide/flake-utils"; naersk.url = "github:nix-community/naersk"; nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; }; outputs = { self, fenix, flake-utils, naersk, nixpkgs }: flake-utils.lib.eachDefaultSystem (system: let pkgs = (import nixpkgs) { inherit system; }; fenix' = fenix.packages.${system}; toolchain = with fenix'; combine [ minimal.rustc minimal.cargo stable.rust-src stable.rustfmt targets.riscv32imc-unknown-none-elf.latest.rust-std # ESP32-C3 RISC-V targets.riscv32imac-unknown-none-elf.latest.rust-std # ESP32-C3 RISC-V \w atomic emulation ]; naersk' = naersk.lib.${system}.override { cargo = toolchain; rustc = toolchain; }; in rec { defaultPackage = packages.riscv32-embedded; packages.riscv32-embedded = naersk'.buildPackage rec { src = self; depsBuildBuild = with pkgs; [ pkgsCross.riscv32-embedded.stdenv.cc ]; doCheck = true; # CARGO_UNSTABLE_BUILD_STD = "true"; "CARGO_TARGET_${pkgs.lib.toUpper CARGO_BUILD_TARGET}_LINKER" = "riscv32-none-elf-gcc"; "CARGO_TARGET_${pkgs.lib.toUpper CARGO_BUILD_TARGET}_RUNNER" = "espflash --monitor"; CARGO_BUILD_TARGET = "riscv32imac-unknown-none-elf"; shellHook = '' ''; }; devShell = with pkgs; mkShell ({ RUST_SRC_PATH = "${fenix'.complete.rust-src}/lib/rustlib/src/rust/library"; nativeBuildInputs = [ toolchain cargo-espmonitor cargo-espflash ] ++ defaultPackage.depsBuildBuild; } // (lib.filterAttrs (name: _: lib.hasPrefix "CARGO_" name || lib.hasPrefix "RUST" name) defaultPackage)); } ); }