let
  mozillaOverlay = import (builtins.fetchTarball https://github.com/mozilla/nixpkgs-mozilla/archive/master.tar.gz);
  pkgs = import <nixpkgs> { overlays = [ mozillaOverlay ]; };
in
with pkgs;
let
  openocd = callPackage ./openocd.nix {};
  rust = rustChannelOfTargets "nightly" null [ "thumbv7em-none-eabi" ];
  rustPlatform = makeRustPlatform {
    rustc = rust;
    cargo = rust;
  };
  epic-stubs = stdenv.mkDerivation {
    name = "epic-stubs";
    src = ./c;
    buildInputs = [ gcc python3 ];
    buildPhase = ''
      ${python3}/bin/python epicardium/api/genapi.py -H epicardium/epicardium.h -c client.c -s server.c
    '';
    installPhase = ''
      mkdir $out
      cp client.c server.c $out/
    '';
  };
  firmware = rustPlatform.buildRustPackage rec {
    name = "rust-card10";
    version = "0.0.0";
    src = ./.;
    cargoSha256 = "10qv30p3kr570glnyn37b6r8pgx48zj0mr9qf84m4wk4sjp3wxsd";
    buildInputs = [ pkgsCross.arm-embedded.stdenv.cc glibc_multi ];
    prePatch = ''
      cp ${epic-stubs}/client.c l0dable/src/
    '';
    preBuild = ''
      export LIBCLANG_PATH=${llvmPackages.libclang}/lib
      export CPATH=${glibc_multi.dev}/include
      export CARGO_HOME=$(mktemp -d cargo-home.XXX)
      cd example
    '';
    doCheck = false;
    installPhase = ''
      mkdir -p $out/lib
      cp target/thumbv7em-none-eabi/release/example $out/lib/example.elf
    '';
  };
in {
  inherit rust rustPlatform firmware epic-stubs;
}