aboutsummaryrefslogtreecommitdiff
path: root/contrib/flake.nix
blob: ef3174dda1ee58b35616ef3608587c67b705ed10 (plain) (blame)
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
{
  description = "Neovim flake";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
    flake-utils.url = "github:numtide/flake-utils";
  };

  outputs = { self, nixpkgs, flake-utils }:
    {
      overlay = final: prev:
        let
          pkgs = nixpkgs.legacyPackages.${prev.system};
        in
        rec {
          neovim = pkgs.neovim-unwrapped.overrideAttrs (oa: {
            version = "master";
            src = ../.;

            buildInputs = oa.buildInputs ++ pkgs.lib.optionals pkgs.stdenv.isDarwin (with pkgs.darwin.apple_sdk.frameworks; [
              CoreServices
            ]);
          });

          # a development binary to help debug issues
          neovim-debug =
            let
              stdenv = if pkgs.stdenv.isLinux then pkgs.llvmPackages_latest.stdenv else pkgs.stdenv;
            in
            ((neovim.override {
              lua = pkgs.luajit;
              inherit stdenv;
            }).overrideAttrs (oa: {

              dontStrip = true;
              NIX_CFLAGS_COMPILE = " -ggdb -Og";

              cmakeBuildType = "Debug";
              cmakeFlags = oa.cmakeFlags ++ [
                "-DMIN_LOG_LEVEL=0"
              ];

              disallowedReferences = [ ];
            }));

          # for neovim developers, beware of the slow binary
          neovim-developer =
            let
              lib = nixpkgs.lib;
              luacheck = pkgs.luaPackages.luacheck;
            in
            (neovim-debug.override ({ doCheck = pkgs.stdenv.isLinux; })).overrideAttrs (oa: {
              cmakeFlags = oa.cmakeFlags ++ [
                "-DLUACHECK_PRG=${luacheck}/bin/luacheck"
                "-DMIN_LOG_LEVEL=0"
                "-DENABLE_LTO=OFF"
              ] ++ pkgs.lib.optionals pkgs.stdenv.isLinux [
                # https://github.com/google/sanitizers/wiki/AddressSanitizerFlags
                # https://clang.llvm.org/docs/AddressSanitizer.html#symbolizing-the-reports
                "-DCLANG_ASAN_UBSAN=ON"
              ];
            });
        };
    } //
    flake-utils.lib.eachDefaultSystem (system:
      let
        pkgs = import nixpkgs {
          overlays = [ self.overlay ];
          inherit system;
        };

        lua = pkgs.lua5_1;

        pythonEnv = pkgs.python3.withPackages (ps: [
          ps.msgpack
          ps.flake8 # for 'make pylint'
        ]);
      in
      rec {

        packages = with pkgs; {
          default = neovim;
          inherit neovim neovim-debug neovim-developer;
        };

        checks = {
          pylint = pkgs.runCommandNoCC "pylint"
            {
              nativeBuildInputs = [ pythonEnv ];
              preferLocalBuild = true;
            } "make -C ${./..} pylint > $out";

          shlint = pkgs.runCommandNoCC "shlint"
            {
              nativeBuildInputs = [ pkgs.shellcheck ];
              preferLocalBuild = true;
            } "make -C ${./..} shlint > $out";
        };

        # kept for backwards-compatibility
        defaultPackage = pkgs.neovim;

        devShells = {
          default = pkgs.neovim-developer.overrideAttrs (oa: {

            buildInputs = with pkgs; oa.buildInputs ++ [
              cmake
              lua.pkgs.luacheck
              sumneko-lua-language-server
              pythonEnv
              include-what-you-use # for scripts/check-includes.py
              jq # jq for scripts/vim-patch.sh -r
              shellcheck # for `make shlint`
              doxygen # for script/gen_vimdoc.py
              clang-tools # for clangd to find the correct headers
            ];

            shellHook = oa.shellHook + ''
              export NVIM_PYTHON_LOG_LEVEL=DEBUG
              export NVIM_LOG_FILE=/tmp/nvim.log
              export ASAN_SYMBOLIZER_PATH=${pkgs.llvm_11}/bin/llvm-symbolizer

              # ASAN_OPTIONS=detect_leaks=1
              export ASAN_OPTIONS="log_path=./test.log:abort_on_error=1"
              export UBSAN_OPTIONS=print_stacktrace=1
              mkdir -p build/runtime/parser
              # nvim looks into CMAKE_INSTALL_DIR. Hack to avoid errors
              # when running the functionaltests
              mkdir -p outputs/out/share/nvim/syntax
              touch outputs/out/share/nvim/syntax/syntax.vim

              # for treesitter functionaltests
              mkdir -p runtime/parser
              cp -f ${pkgs.tree-sitter.builtGrammars.tree-sitter-c}/parser runtime/parser/c.so
            '';
          });
        };
      });
}