{ stdenv, fetchurl, ocaml, findlib, dune, opaline }: { pname, version, buildInputs ? [], ... }@args: if args ? minimumOCamlVersion && ! stdenv.lib.versionAtLeast ocaml.version args.minimumOCamlVersion then throw "${pname}-${version} is not available for OCaml ${ocaml.version}" else stdenv.mkDerivation ({ buildPhase = '' runHook preBuild dune build -p ${pname} runHook postBuild ''; checkPhase = '' runHook preCheck dune runtest -p ${pname} runHook postCheck ''; installPhase = '' runHook preInstall ${opaline}/bin/opaline -prefix $out -libdir $OCAMLFIND_DESTDIR runHook postInstall ''; meta.platform = ocaml.meta.platform; } // args // { name = "ocaml${ocaml.version}-${pname}-${version}"; buildInputs = [ ocaml dune findlib ] ++ buildInputs; })