1{
2 lib,
3 ocaml,
4 buildDunePackage,
5 lsp,
6 xdg,
7 re,
8 fiber,
9 makeWrapper,
10 dot-merlin-reader,
11 spawn,
12 ocamlc-loc,
13 merlin,
14 merlin-lib,
15 astring,
16 camlp-streams,
17 base,
18}:
19
20# Freeze ocaml-lsp-version at 1.17.0 for OCaml 5.0
21# for which merlin 4.16 is not available
22let
23 lsp_v =
24 if lib.versions.majorMinor ocaml.version == "5.0" then
25 lsp.override { version = "1.17.0"; }
26 else
27 lsp;
28in
29
30let
31 lsp = lsp_v;
32in
33
34# Use merlin < 4.17 for OCaml < 5.2
35let
36 merlin-lib_v =
37 if lib.versions.majorMinor ocaml.version == "4.14" then
38 merlin-lib.override {
39 merlin = merlin.override {
40 version = "4.16-414";
41 };
42 }
43 else if lib.versions.majorMinor ocaml.version == "5.1" then
44 merlin-lib.override {
45 merlin = merlin.override {
46 version = "4.16-501";
47 };
48 }
49 else
50 merlin-lib;
51in
52let
53 merlin-lib = merlin-lib_v;
54in
55
56buildDunePackage rec {
57 pname = "ocaml-lsp-server";
58 inherit (lsp) version src preBuild;
59
60 buildInputs =
61 lsp.buildInputs
62 ++ [
63 lsp
64 re
65 ]
66 ++ lib.optional (lib.versionAtLeast version "1.9") spawn
67 ++ lib.optionals (lib.versionAtLeast version "1.10") [
68 fiber
69 xdg
70 ]
71 ++ lib.optional (lib.versionAtLeast version "1.14.2") ocamlc-loc
72 ++ lib.optionals (lib.versionAtLeast version "1.17.0") [
73 astring
74 camlp-streams
75 merlin-lib
76 ]
77 ++ lib.optional (lib.versionAtLeast version "1.18.0") base;
78
79 nativeBuildInputs = [ makeWrapper ];
80
81 postInstall = ''
82 wrapProgram $out/bin/ocamllsp --prefix PATH : ${dot-merlin-reader}/bin
83 '';
84
85 meta = lsp.meta // {
86 description = "OCaml Language Server Protocol implementation";
87 mainProgram = "ocamllsp";
88 };
89}