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

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

  outputs = { self, nixpkgs }: let
    system = "x86_64-linux";
    legacyPkgs = nixpkgs.legacyPackages."${system}".pkgs;
    pkgs = legacyPkgs;
  in {

    packages."${system}" = rec {

      neovim = legacyPkgs.neovim-unwrapped.overrideAttrs(oa: {
        version = "master";
        src = ../.;

        buildInputs = oa.buildInputs ++ ([
          pkgs.tree-sitter
        ]);

        cmakeFlags = oa.cmakeFlags ++ [
          "-DUSE_BUNDLED=OFF"
        ];
      });

      # a development binary to help debug issues
      neovim-debug = (neovim.override {
          stdenv = pkgs.llvmPackages_latest.stdenv;
          lua = pkgs.enableDebugging legacyPkgs.luajit;
        }).overrideAttrs(oa:{
          cmakeBuildType="Debug";
          cmakeFlags = oa.cmakeFlags ++ [
            "-DMIN_LOG_LEVEL=0"
          ];
      });

      # for neovim developers, very slow
      # brings development tools as well
      neovim-developer = let
        lib = nixpkgs.lib;
        pythonEnv = legacyPkgs.python3;
        luacheck = legacyPkgs.luaPackages.luacheck;
      in
        neovim-debug.overrideAttrs(oa: {
          cmakeFlags = oa.cmakeFlags ++ [
            "-DLUACHECK_PRG=${luacheck}/bin/luacheck"
            "-DMIN_LOG_LEVEL=0"
            "-DENABLE_LTO=OFF"
            "-DUSE_BUNDLED=OFF"
            # https://github.com/google/sanitizers/wiki/AddressSanitizerFlags
            # https://clang.llvm.org/docs/AddressSanitizer.html#symbolizing-the-reports
            "-DCLANG_ASAN_UBSAN=ON"
          ];

        nativeBuildInputs = oa.nativeBuildInputs ++ (with pkgs; [
            pythonEnv
            include-what-you-use  # for scripts/check-includes.py
            jq                    # jq for scripts/vim-patch.sh -r
            doxygen
        ]);

        shellHook = oa.shellHook + ''
          export NVIM_PYTHON_LOG_LEVEL=DEBUG
          export NVIM_LOG_FILE=/tmp/nvim.log

          export ASAN_OPTIONS="log_path=./test.log:abort_on_error=1"
          export UBSAN_OPTIONS=print_stacktrace=1
        '';
      });
    };

    defaultPackage."${system}" = self.packages."${system}".neovim;

    overlay = final: prev: {
      inherit (self.packages."${system}") neovim neovim-debug;
    };

    apps."${system}" = let
      mkApp = pkg: {
        type = "app";
        program = pkg + "/bin/nvim";
      };
    in {
      nvim = mkApp self.packages."${system}".neovim;
      nvim-debug = mkApp self.packages."${system}".neovim-debug;
    };

    defaultApp."${system}" = self.apps."${system}".nvim;

    devShell."${system}" = self.packages."${system}".neovim-developer;
  };
}