lol
1{
2 lib,
3 stdenv,
4 ocaml,
5 findlib,
6 dune_1,
7 dune_2,
8 dune_3,
9}:
10
11lib.extendMkDerivation {
12 constructDrv = stdenv.mkDerivation;
13 excludeDrvArgNames = [
14 "minimalOCamlVersion"
15 "duneVersion"
16 ];
17 extendDrvArgs =
18 finalAttrs:
19 {
20 pname,
21 version,
22 nativeBuildInputs ? [ ],
23 enableParallelBuilding ? true,
24 ...
25 }@args:
26
27 let
28 Dune =
29 let
30 dune-version = args.duneVersion or "3";
31 in
32 {
33 "1" = dune_1;
34 "2" = dune_2;
35 "3" = dune_3;
36 }
37 ."${dune-version}";
38 in
39
40 if args ? minimalOCamlVersion && lib.versionOlder ocaml.version args.minimalOCamlVersion then
41 throw "${pname}-${version} is not available for OCaml ${ocaml.version}"
42 else
43 {
44 name = "ocaml${ocaml.version}-${pname}-${version}";
45
46 strictDeps = true;
47
48 inherit enableParallelBuilding;
49 dontAddStaticConfigureFlags = true;
50 configurePlatforms = [ ];
51
52 nativeBuildInputs = [
53 ocaml
54 Dune
55 findlib
56 ]
57 ++ nativeBuildInputs;
58
59 buildPhase =
60 args.buildPhase or ''
61 runHook preBuild
62 dune build -p ${pname} ''${enableParallelBuilding:+-j $NIX_BUILD_CORES}
63 runHook postBuild
64 '';
65
66 installPhase =
67 args.installPhase or ''
68 runHook preInstall
69 dune install --prefix $out --libdir $OCAMLFIND_DESTDIR ${pname} \
70 ${
71 if lib.versionAtLeast Dune.version "2.9" then
72 "--docdir $out/share/doc --mandir $out/share/man"
73 else
74 ""
75 }
76 runHook postInstall
77 '';
78
79 checkPhase =
80 args.checkPhase or ''
81 runHook preCheck
82 dune runtest -p ${pname} ''${enableParallelBuilding:+-j $NIX_BUILD_CORES}
83 runHook postCheck
84 '';
85
86 meta = (args.meta or { }) // {
87 platforms = args.meta.platforms or ocaml.meta.platforms;
88 };
89 };
90}