with import <nixpkgs> {};

let
  py = python36;
  # crc16 does not exist in pythonPackages - bring in our own.
  crc16 = py.pkgs.buildPythonPackage rec {
    pname = "crc16";
    version = "0.1.1";

    src = py.pkgs.fetchPypi {
      inherit pname version;
      sha256 = "15nkx0pa4lskwin84flpk8fsw3jqg6wic6v3s83syjqg76h6my61";
    };
  };
in stdenv.mkDerivation rec {
  name = "card10";
  nativeBuildInputs = [
    bash
    crc16
    gcc-arm-embedded
    meson
    ninja
    py
    py.pkgs.pillow
  ];
  src = ./.;
  buildCommand = ''
    build=$(pwd)/build

    # Copy source over, as dev sources from '.' thend to have odd permissions.
    cp -r $src $(pwd)/src
    cd $(pwd)/src
    # Ensure we have write right to patch shebangs.
    chmod -R +w .

    # The nix sandbox does not have /usr/bin/env bash, patch things up.
    for f in lib/micropython/*.sh tools/*.sh; do
      patchShebangs "$f"
    done

    # Actually run the build.
    meson --cross-file card10-cross.ini "$build"
    ninja -C "$build" -j $NIX_BUILD_CORES

    # Copy artifacts to derivation outputs.
    install -D -m 444 "$build/bootloader/bootloader.elf" -t "$out/bootloader"
    install -D -m 444 "$build/pycardium/pycardium_epicardium.bin" -t "$out/pycardium"
    install -D -m 444 "$build/epicardium/epicardium.elf" -t "$out/epicardium"
    install -D -m 444 "$build/pycardium/pycardium.elf" -t "$out/pycardium"
  '';
}