{ lib, stdenv, fetchurl, perl
, bdftopcf, bdf2psf, mkfontdir
, fonttosfnt
, targetsDat  ? null
, variantsDat ? null
}:

stdenv.mkDerivation rec {
  pname = "uw-ttyp0";
  version = "1.3";

  src = fetchurl {
    url = "https://people.mpi-inf.mpg.de/~uwe/misc/${pname}/${pname}-${version}.tar.gz";
    sha256 = "1vp053bwv8sr40p3pn4sjaiq570zp7knh99z9ynk30v7ml4cz2i8";
  };

  # remove for version >1.3
  patches = [ ./determinism.patch ];

  nativeBuildInputs = [ perl bdftopcf bdf2psf fonttosfnt mkfontdir ];

  # configure sizes, encodings and variants
  preConfigure =
    (if targetsDat == null
      then ''
        cat << EOF > TARGETS.dat
        SIZES = 11 12 13 14 15 16 17 18 22 \
        11b 12b 13b 14b 15b 16b 17b 18b 22b 15i 16i 17i 18i
        ENCODINGS = uni
        EOF
      ''
      else ''cp "${targetsDat}" TARGETS.dat'') +
    (if variantsDat == null
      then ''
        cat << EOF > VARIANTS.dat
        COPYTO AccStress PApostropheAscii
        COPYTO PAmComma AccGraveAscii
        COPYTO Digit0Slashed Digit0
        EOF
      ''
      else ''cp "${variantsDat}" VARIANTS.dat'');

  postBuild = ''
    # convert bdf fonts to psf
    build=$(pwd)
    mkdir {psf,otb}
    cd ${bdf2psf}/share/bdf2psf
    for i in $build/genbdf/*.bdf; do
      name="$(basename $i .bdf)"
      bdf2psf \
        --fb "$i" standard.equivalents \
        ascii.set+useful.set+linux.set 512 \
        "$build/psf/$name.psf"
    done
    cd -

    # convert unicode bdf fonts to otb
    for i in $build/genbdf/*-uni.bdf; do
      name="$(basename $i .bdf)"
      fonttosfnt -v -o "$build/otb/$name.otb" "$i"
    done
  '';

  postInstall = ''
    # install psf fonts
    fontDir="$out/share/consolefonts"
    install -m 644 -D psf/*.psf -t "$fontDir"

    # install otb fonts
    fontDir="$out/share/fonts/X11/misc"
    install -m 644 -D otb/*.otb -t "$fontDir"
    mkfontdir "$fontDir"
  '';

  # Nix with multiple outputs adds several flags
  # that the ./configure script doesn't understand.
  configurePhase = ''
    runHook preConfigure
    ./configure --prefix="$out"
    runHook postConfigure
  '';

  meta = with lib; {
    description = "Monospace bitmap screen fonts for X11";
    homepage = "https://people.mpi-inf.mpg.de/~uwe/misc/uw-ttyp0/";
    license = with licenses; [ free mit ];
    maintainers = with maintainers; [ rnhmjoj ];
  };

}
