summaryrefslogtreecommitdiff
path: root/pkgs/by-name/lu/lua-language-server/package.nix
blob: 923b0a1fc4179cd4883bf6777ac8102249a26aa6 (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
{
  lib,
  stdenv,
  fetchFromGitHub,

  # nativeBuildInputs
  ninja,
  makeWrapper,

  # buildInputs
  fmt,
  rsync,

  versionCheckHook,
  nix-update-script,
}:

stdenv.mkDerivation (finalAttrs: {
  pname = "lua-language-server";
  version = "3.13.9";

  src = fetchFromGitHub {
    owner = "luals";
    repo = "lua-language-server";
    tag = finalAttrs.version;
    hash = "sha256-zttTtMAeBsHBqgDm3CAvp54Tp2bfQUhk5/lKgKWUeJY=";
    fetchSubmodules = true;
  };

  nativeBuildInputs = [
    ninja
    makeWrapper
  ];

  buildInputs =
    [
      fmt
    ]
    ++ lib.optionals stdenv.hostPlatform.isDarwin [
      rsync
    ];

  env.NIX_LDFLAGS = "-lfmt";

  postPatch =
    ''
      # filewatch tests are failing on darwin
      # this feature is not used in lua-language-server
      substituteInPlace 3rd/bee.lua/test/test.lua \
        --replace-fail 'require "test_filewatch"' ""

      # use nixpkgs fmt library
      for d in 3rd/bee.lua 3rd/luamake/bee.lua
      do
        rm -r $d/3rd/fmt/*
        touch $d/3rd/fmt/format.cc
        substituteInPlace $d/bee/nonstd/format.h $d/bee/nonstd/print.h \
          --replace-fail "include <3rd/fmt/fmt" "include <fmt"
      done

      # flaky tests on linux
      # https://github.com/LuaLS/lua-language-server/issues/2926
      substituteInPlace test/tclient/init.lua \
        --replace-fail "require 'tclient.tests.load-relative-library'" ""

      pushd 3rd/luamake
    ''
    + lib.optionalString stdenv.hostPlatform.isDarwin (
      # This package uses the program clang for C and C++ files. The language
      # is selected via the command line argument -std, but this do not work
      # in combination with the nixpkgs clang wrapper. Therefor we have to
      # find all c++ compiler statements and replace $cc (which expands to
      # clang) with clang++.
      ''
        sed -i compile/ninja/macos.ninja \
          -e '/c++/s,$cc,clang++,' \
          -e '/test.lua/s,= .*,= true,' \
          -e '/ldl/s,$cc,clang++,'
        sed -i scripts/compiler/gcc.lua \
          -e '/cxx_/s,$cc,clang++,'
      ''
      # Avoid relying on ditto (impure)
      + ''
        substituteInPlace compile/ninja/macos.ninja \
          --replace-fail "ditto" "rsync -a"

        substituteInPlace scripts/writer.lua \
          --replace-fail "ditto" "rsync -a"
      ''
    );

  ninjaFlags = [
    "-fcompile/ninja/${if stdenv.hostPlatform.isDarwin then "macos" else "linux"}.ninja"
  ];

  postBuild = ''
    popd
    ./3rd/luamake/luamake rebuild
  '';

  installPhase = ''
    runHook preInstall

    install -Dt "$out"/share/lua-language-server/bin bin/lua-language-server
    install -m644 -t "$out"/share/lua-language-server/bin bin/*.*
    install -m644 -t "$out"/share/lua-language-server {debugger,main}.lua
    cp -r locale meta script "$out"/share/lua-language-server

    # necessary for --version to work:
    install -m644 -t "$out"/share/lua-language-server changelog.md

    makeWrapper "$out"/share/lua-language-server/bin/lua-language-server \
      $out/bin/lua-language-server \
      --add-flags "-E $out/share/lua-language-server/main.lua \
      --logpath=\''${XDG_CACHE_HOME:-\$HOME/.cache}/lua-language-server/log \
      --metapath=\''${XDG_CACHE_HOME:-\$HOME/.cache}/lua-language-server/meta"

    runHook postInstall
  '';

  # some tests require local networking
  __darwinAllowLocalNetworking = true;

  nativeInstallCheckInputs = [
    versionCheckHook
  ];
  versionCheckProgramArg = [ "--version" ];
  doInstallCheck = true;

  passthru.updateScript = nix-update-script { };

  meta = {
    description = "Language server that offers Lua language support";
    homepage = "https://github.com/luals/lua-language-server";
    changelog = "https://github.com/LuaLS/lua-language-server/blob/${finalAttrs.version}/changelog.md";
    license = lib.licenses.mit;
    maintainers = with lib.maintainers; [
      figsoda
      gepbird
      sei40kr
    ];
    mainProgram = "lua-language-server";
    platforms = lib.platforms.linux ++ lib.platforms.darwin;
  };
})