{ lib, stdenv, fetchFromGitHub, fetchpatch, libftdi
, infnoise, testers }:

stdenv.mkDerivation rec {
  pname = "infnoise";
  version = "0.3.2";

  src = fetchFromGitHub {
    owner = "leetronics";
    repo = "infnoise";
    rev = "e80ddd78085abf3d06df2e0d8c08fd33dade78eb";
    sha256 = "sha256-9MKG1InkV+yrQPBTgi2gZJ3y9Fokb6WbxuAnM7n7FyA=";
  };

  patches = [
    # Patch makefile so we can set defines from the command line instead of it depending on .git
    ./makefile.patch

    # Fix getc return type
    (fetchpatch {
      url = "https://github.com/leetronics/infnoise/commit/7ed7014e14253311c07e530c8f89f1c8f4705c2b.patch";
      sha256 = "sha256-seB/fJaxQ/rXJp5iPtnobXXOccQ2KUAk6HFx31dhOhs=";
    })
  ];

  GIT_COMMIT = src.rev;
  GIT_VERSION = version;
  GIT_DATE = "2019-08-12";

  buildInputs = [ libftdi ];

  makefile = "Makefile.linux";
  makeFlags = [ "PREFIX=$(out)" ];
  postPatch = ''
    cd software
    substituteInPlace init_scripts/infnoise.service --replace "/usr/local" "$out"
  '';

  postInstall = ''
    make -C tools
    find ./tools/ -executable -type f -exec \
      sh -c "install -Dm755 {} $out/bin/infnoise-\$(basename {})" \;
  '';

  passthru = {
    tests.version = testers.testVersion { package = infnoise; };
  };

  meta = with lib; {
    homepage = "https://github.com/leetronics/infnoise";
    description = "Driver for the Infinite Noise TRNG";
    longDescription = ''
      The Infinite Noise TRNG is a USB key hardware true random number generator.
      It can either provide rng for userland applications, or provide rng for the OS entropy.
    '';
    license = licenses.cc0;
    maintainers = with maintainers; [ StijnDW zhaofengli ];
    platforms = platforms.linux;
  };
}
