{ # Use master branch of the overlay by default mozillaOverlay ? import (builtins.fetchTarball https://github.com/mozilla/nixpkgs-mozilla/archive/master.tar.gz), rustManifest ? ./channel-rust-nightly.toml, }: let pkgs = import { overlays = [ mozillaOverlay ]; }; in with pkgs; let rustcSrc = pkgs.fetchgit { url = https://github.com/rust-lang/rust.git; # master of 2019-11-09 rev = "ac162c6abe34cdf965afc0389f6cefa79653c63b"; sha256 = "06c5gws1mrpr69z1gzs358zf7hcsg6ky8n4ha0vv2s9d9w93x1kj"; fetchSubmodules = true; }; target = "thumbv7em-none-eabihf"; targets = [ target ]; rustChannelOfTargets = _channel: _date: targets: (pkgs.lib.rustLib.fromManifestFile rustManifest { inherit (pkgs) stdenv fetchurl patchelf; }).rust.override { inherit targets; }; rust = rustChannelOfTargets "nightly" null targets; rustPlatform = recurseIntoAttrs (makeRustPlatform { rustc = rust // { src = rustcSrc; }; cargo = rust; }); gcc = pkgsCross.armv7l-hf-multiplatform.buildPackages.gcc; xbuildRustPackage = attrs: let buildPkg = rustPlatform.buildRustPackage attrs; in buildPkg.overrideAttrs ({ name, nativeBuildInputs, ... }: { nativeBuildInputs = nativeBuildInputs ++ [ cargo-xbuild ]; buildPhase = '' cargo xbuild --release --frozen ''; XARGO_RUST_SRC = "${rustcSrc}/src"; installPhase = '' mkdir $out cp target/${target}/release/${name} $out/${name}.elf ''; }); firmware = xbuildRustPackage { name = "firmware"; src = ./firmware; cargoSha256 = "0lf8h5g8sas36cxzqy0p65qqivnihh4gn4mkc1k210xp7niaymc5"; nativeBuildInputs = [ gcc ]; "CC_${target}" = "${gcc}/bin/armv7l-unknown-linux-gnueabihf-gcc"; RUST_COMPILER_RT_ROOT = "${rustcSrc}/src/llvm-project/compiler-rt"; checkPhase = '' cargo test --target=${hostPlatform.config} ''; }; in { inherit pkgs rustPlatform rustcSrc gcc firmware; }