{ lib, stdenv, fetchurl, ocaml, findlib, ocamlbuild, ounit }:

let
  # ounit is only available for OCaml >= 4.08
  doCheck = lib.versionAtLeast ocaml.version "4.08";
in

lib.throwIf (lib.versionAtLeast ocaml.version "5.0")
  "ocamlmod is not available for OCaml ≥ 5.0"

stdenv.mkDerivation {
  pname = "ocamlmod";
  version = "0.0.9";

  src = fetchurl {
    url = "https://forge.ocamlcore.org/frs/download.php/1702/ocamlmod-0.0.9.tar.gz";
    sha256 = "0cgp9qqrq7ayyhddrmqmq1affvfqcn722qiakjq4dkywvp67h4aa";
  };

  strictDeps = !doCheck;

  nativeBuildInputs = [ ocaml findlib ocamlbuild ];

  configurePhase = "ocaml setup.ml -configure --prefix $out"
    + lib.optionalString doCheck " --enable-tests";
  buildPhase     = "ocaml setup.ml -build";
  installPhase   = "ocaml setup.ml -install";

  inherit doCheck;
  nativeCheckInputs = [ ounit ];

  checkPhase = "ocaml setup.ml -test";

  dontStrip = true;

  meta = {
    homepage = "https://forge.ocamlcore.org/projects/ocamlmod/ocamlmod";
    description = "Generate OCaml modules from source files";
    platforms = ocaml.meta.platforms or [];
    maintainers = with lib.maintainers; [
      maggesi
    ];
  };
}