{ # Use master branch of the overlay by default mozillaOverlay ? import (builtins.fetchTarball https://github.com/mozilla/nixpkgs-mozilla/archive/master.tar.gz), }: let pkgs = import { overlays = [ mozillaOverlay ]; }; targets = [ "thumbv7em-none-eabihf" ]; rustManifest = pkgs.fetchurl { url = "https://static.rust-lang.org/dist/2024-06-13/channel-rust-stable.toml"; sha256 = "sha256-Ngiz76YP4HTY75GGdH2P+APE/DEIx2R/Dn+BwwOyzZU="; }; rustChannelOfTargets = _channel: _date: targets: (pkgs.lib.rustLib.fromManifestFile rustManifest { inherit (pkgs) stdenv lib fetchurl patchelf; }).rust.override { inherit targets; extensions = ["rust-src"]; }; rust = rustChannelOfTargets "nightly" null targets; rustPlatform = pkgs.recurseIntoAttrs (pkgs.makeRustPlatform { rustc = rust // { # https://github.com/oxalica/rust-overlay/commit/c48c2d76b68dd9ede0815fec53479375c61af857 targetPlatforms = pkgs.lib.platforms.all; tier1TargetPlatforms = pkgs.lib.platforms.all; badTargetPlatforms = [ ]; }; cargo = rust; }); buildStm32Firmware = { name, src, cargoDepsName ? name, patchPhase ? "", extraNativeBuildInputs ? [], checkPhase ? "", doCheck ? true, binaryName ? name, extraCargoBuildArgs ? "", outputHashes ? {} }: rustPlatform.buildRustPackage rec { inherit name cargoDepsName; version = "0.0.0"; inherit src; cargoLock = { lockFile = "${src}/Cargo.lock"; inherit outputHashes; }; inherit patchPhase; nativeBuildInputs = [ pkgs.llvm ] ++ extraNativeBuildInputs; buildPhase = '' export CARGO_HOME=$(mktemp -d cargo-home.XXX) cargo build --release --bin ${binaryName} ${extraCargoBuildArgs} ''; inherit checkPhase doCheck; # binaryName defaults to the `name` arg (i.e. the Rust package name); # it is used as the Cargo binary filename installPhase = '' mkdir -p $out $out/nix-support cp target/thumbv7em-none-eabihf/release/${binaryName} $out/${name}.elf echo file binary-dist $out/${name}.elf >> $out/nix-support/hydra-build-products llvm-objcopy -O binary target/thumbv7em-none-eabihf/release/${binaryName} $out/${name}.bin echo file binary-dist $out/${name}.bin >> $out/nix-support/hydra-build-products ''; dontFixup = true; auditable = false; }; in pkgs.lib.attrsets.mapAttrs' (name: value: pkgs.lib.attrsets.nameValuePair ("stabilizer-" + name) (buildStm32Firmware ({ name = "stabilizer-" + name; # If binaryName is not specified, use the attribute name as binaryName by default. binaryName = name; cargoDepsName = "stabilizer"; src = ; patchPhase = '' patch -p1 < ${./pounder-725.diff} ''; doCheck = false; } // value))) { dual-iir = {}; dual-iir-pounder_v1_0 = { binaryName = "dual-iir"; extraCargoBuildArgs = "--features pounder_v1_0"; }; lockin = {}; }