flake.nix 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. {
  2. description = "Neovim flake";
  3. inputs = {
  4. nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
  5. flake-utils.url = "github:numtide/flake-utils";
  6. };
  7. outputs = { self, nixpkgs, flake-utils }:
  8. {
  9. overlay = final: prev:
  10. let
  11. pkgs = nixpkgs.legacyPackages.${prev.system};
  12. in
  13. rec {
  14. neovim = pkgs.neovim-unwrapped.overrideAttrs (oa: {
  15. version = "master";
  16. src = ../.;
  17. buildInputs = oa.buildInputs ++ ([
  18. pkgs.tree-sitter
  19. ]);
  20. cmakeFlags = oa.cmakeFlags ++ [
  21. "-DUSE_BUNDLED=OFF"
  22. ];
  23. });
  24. # a development binary to help debug issues
  25. neovim-debug = let
  26. stdenv = pkgs.stdenvAdapters.keepDebugInfo (if pkgs.stdenv.isLinux then pkgs.llvmPackages_latest.stdenv else pkgs.stdenv);
  27. in
  28. pkgs.enableDebugging ((neovim.override {
  29. lua = pkgs.enableDebugging pkgs.luajit;
  30. inherit stdenv;
  31. }).overrideAttrs (oa: {
  32. cmakeBuildType = "Debug";
  33. cmakeFlags = oa.cmakeFlags ++ [
  34. "-DMIN_LOG_LEVEL=0"
  35. ];
  36. disallowedReferences = [];
  37. }));
  38. # for neovim developers, builds a slow binary
  39. # huge closure size but aims at covering all scripts
  40. # brings development tools as well
  41. neovim-developer =
  42. let
  43. lib = nixpkgs.lib;
  44. pythonEnv = pkgs.python3.withPackages(ps: [
  45. ps.msgpack
  46. ps.flake8 # for 'make pylint'
  47. ]);
  48. luacheck = pkgs.luaPackages.luacheck;
  49. in
  50. (neovim-debug.override ({ doCheck = pkgs.stdenv.isLinux; })).overrideAttrs (oa: {
  51. cmakeFlags = oa.cmakeFlags ++ [
  52. "-DLUACHECK_PRG=${luacheck}/bin/luacheck"
  53. "-DMIN_LOG_LEVEL=0"
  54. "-DENABLE_LTO=OFF"
  55. "-DUSE_BUNDLED=OFF"
  56. ] ++ pkgs.lib.optionals pkgs.stdenv.isLinux [
  57. # https://github.com/google/sanitizers/wiki/AddressSanitizerFlags
  58. # https://clang.llvm.org/docs/AddressSanitizer.html#symbolizing-the-reports
  59. "-DCLANG_ASAN_UBSAN=ON"
  60. ];
  61. nativeBuildInputs = oa.nativeBuildInputs ++ (with pkgs; [
  62. pythonEnv
  63. include-what-you-use # for scripts/check-includes.py
  64. jq # jq for scripts/vim-patch.sh -r
  65. shellcheck # for `make shlint`
  66. doxygen # for script/gen_vimdoc.py
  67. clang-tools # for clangd to find the correct headers
  68. ]);
  69. shellHook = oa.shellHook + ''
  70. export NVIM_PYTHON_LOG_LEVEL=DEBUG
  71. export NVIM_LOG_FILE=/tmp/nvim.log
  72. export ASAN_OPTIONS="log_path=./test.log:abort_on_error=1"
  73. export UBSAN_OPTIONS=print_stacktrace=1
  74. '';
  75. });
  76. };
  77. } //
  78. flake-utils.lib.eachDefaultSystem (system:
  79. let
  80. pkgs = import nixpkgs {
  81. overlays = [ self.overlay ];
  82. inherit system;
  83. };
  84. in
  85. rec {
  86. packages = with pkgs; {
  87. inherit neovim neovim-debug neovim-developer;
  88. };
  89. defaultPackage = pkgs.neovim;
  90. apps = {
  91. nvim = flake-utils.lib.mkApp { drv = pkgs.neovim; name = "nvim"; };
  92. nvim-debug = flake-utils.lib.mkApp { drv = pkgs.neovim-debug; name = "nvim"; };
  93. };
  94. defaultApp = apps.nvim;
  95. devShell = pkgs.neovim-developer;
  96. });
  97. }