diff --git a/default.nix b/default.nix index a3d5ebe..52848ac 100644 --- a/default.nix +++ b/default.nix @@ -14,7 +14,11 @@ }: let packages = lib.makeScope pkgs.newScope (self: { - ivy = self.callPackage ./pkgs/ivy/package.nix { inherit ivyVersion; }; + neovim = self.callPackage ./pkgs/neovim/package.nix { inherit (inputs) neovim-src; }; + ivy = self.callPackage ./pkgs/ivy/package.nix { + inherit ivyVersion; + neovim-unwrapped = self.neovim; + }; ivyPlugins = self.callPackage ./pkgs/ivy-plugins/package.nix { }; inherit (inputs.gift-wrap.legacyPackages.${pkgs.stdenv.hostPlatform.system}) wrapNeovim; }); diff --git a/flake.lock b/flake.lock index 055c4de..308fdec 100644 --- a/flake.lock +++ b/flake.lock @@ -1,26 +1,5 @@ { "nodes": { - "flake-parts": { - "inputs": { - "nixpkgs-lib": [ - "neovim-nightly-overlay", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1772408722, - "narHash": "sha256-rHuJtdcOjK7rAHpHphUb1iCvgkU3GpfvicLMwwnfMT0=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "f20dc5d9b8027381c474144ecabc9034d6a839a3", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, "gift-wrap": { "inputs": { "nixpkgs": [ @@ -41,30 +20,6 @@ "type": "github" } }, - "neovim-nightly-overlay": { - "inputs": { - "flake-parts": "flake-parts", - "neovim-src": [ - "neovim-src" - ], - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1773705884, - "narHash": "sha256-2atzXVl7CB+46HcuFRe3cUleEJdn2KoUdVOPQHyZBpg=", - "owner": "nix-community", - "repo": "neovim-nightly-overlay", - "rev": "3c143994a616ebc45c69dfa0487e171b7b5c0da6", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "neovim-nightly-overlay", - "type": "github" - } - }, "neovim-src": { "flake": false, "locked": { @@ -97,7 +52,6 @@ "root": { "inputs": { "gift-wrap": "gift-wrap", - "neovim-nightly-overlay": "neovim-nightly-overlay", "neovim-src": "neovim-src", "nixpkgs": "nixpkgs" } diff --git a/flake.nix b/flake.nix index 281c941..a7f5807 100644 --- a/flake.nix +++ b/flake.nix @@ -9,14 +9,6 @@ inputs.nixpkgs.follows = "nixpkgs"; }; - neovim-nightly-overlay = { - url = "github:nix-community/neovim-nightly-overlay"; - inputs = { - nixpkgs.follows = "nixpkgs"; - neovim-src.follows = "neovim-src"; - }; - }; - neovim-src = { url = "github:neovim/neovim"; flake = false; @@ -27,7 +19,6 @@ inputs@{ self, nixpkgs, - neovim-nightly-overlay, ... }: let @@ -41,7 +32,6 @@ import nixpkgs { inherit system; config.allowUnfree = true; - overlays = [ neovim-nightly-overlay.overlays.default ]; } ) ); diff --git a/modules/home-manager.nix b/modules/home-manager.nix index 2d4356b..dc714ee 100644 --- a/modules/home-manager.nix +++ b/modules/home-manager.nix @@ -41,7 +41,7 @@ in programs.ivy = { package = pkgs'.ivy.override { inherit (cfg) includePerLanguageTooling; - basePackage = inputs.neovim-nightly-overlay.packages.${pkgs.stdenv.hostPlatform.system}.neovim; + basePackage = inputs.self.packages.${pkgs.stdenv.hostPlatform.system}.neovim; }; gui.package = pkgs.symlinkJoin { diff --git a/pkgs/neovim/dependencies.nix b/pkgs/neovim/dependencies.nix new file mode 100644 index 0000000..a4ae661 --- /dev/null +++ b/pkgs/neovim/dependencies.nix @@ -0,0 +1,27 @@ +{ + lib, + fetchurl, + neovim-src, + ... +}: +lib.pipe "${neovim-src}/cmake.deps/deps.txt" [ + builtins.readFile + (lib.splitString "\n") + (map (builtins.match "([A-Z0-9_]+)_(URL|SHA256)[[:space:]]+([^[:space:]]+)[[:space:]]*")) + (lib.remove null) + (lib.flip builtins.foldl' { } ( + acc: matches: + let + name = lib.toLower (builtins.elemAt matches 0); + key = lib.toLower (builtins.elemAt matches 1); + value = lib.toLower (builtins.elemAt matches 2); + in + acc + // { + ${name} = acc.${name} or { } // { + ${key} = value; + }; + } + )) + (builtins.mapAttrs (lib.const fetchurl)) +] diff --git a/pkgs/neovim/package.nix b/pkgs/neovim/package.nix new file mode 100644 index 0000000..674eea7 --- /dev/null +++ b/pkgs/neovim/package.nix @@ -0,0 +1,62 @@ +{ + lib, + stdenv, + callPackage, + neovim-src, + + libuv, + gettext, + + neovim-unwrapped, + baseNeovimUnwrapped ? neovim-unwrapped, + ... +}: +let + src = neovim-src; + + tree-sitter = callPackage ./tree-sitter-bundled.nix { + inherit dependencies; + }; + + dependencies = callPackage ./dependencies.nix { + inherit neovim-src; + }; + + # The following overrides will only take effect for linux hosts + linuxOnlyOverrides = lib.optionalAttrs stdenv.isLinux { + gettext = gettext.overrideAttrs { + # FIXME: nixpkgs' gettext is now at version 0.22.5 whereas neovim's is pinned at 0.20.5 + # Overriding the source leads to a build error of gettext. + # Neovim seems to build fine with nixpkgs' gettext, so we use that in the meantime. + # src = dependencies.gettext; + }; + }; + + overrides = { + libuv = libuv.overrideAttrs { + # FIXME: overriding libuv casues high CPU usage on darwin + # https://github.com/nix-community/neovim-nightly-overlay/issues/538 + # src = dependencies.libuv; + }; + inherit tree-sitter; + + treesitter-parsers = + let + grammars = lib.filterAttrs (name: _: lib.hasPrefix "treesitter_" name) dependencies; + in + lib.mapAttrs' ( + name: value: lib.nameValuePair (lib.removePrefix "treesitter_" name) { src = value; } + ) grammars; + } + // linuxOnlyOverrides; +in +(baseNeovimUnwrapped.override overrides).overrideAttrs (oa: { + version = "${neovim-src.shortRev or "dirty"}"; + inherit src; + + preConfigure = '' + ${oa.preConfigure} + substituteInPlace cmake.config/versiondef.h.in \ + --replace-fail '@NVIM_VERSION_PRERELEASE@' '-nightly+${neovim-src.shortRev or "dirty"}' + ''; +}) diff --git a/pkgs/neovim/tree-sitter-bundled.nix b/pkgs/neovim/tree-sitter-bundled.nix new file mode 100644 index 0000000..1528b15 --- /dev/null +++ b/pkgs/neovim/tree-sitter-bundled.nix @@ -0,0 +1,37 @@ +{ + lib, + tree-sitter, + clang, + libclang, + rustPlatform, + dependencies, +}: +let + cargoHash = "sha256-zh6KsnZ7s6VXGCggoYbLGeGnEZ7g7anjkz8C5/L4yXQ="; +in +tree-sitter.overrideAttrs (oa: { + src = dependencies.treesitter; + version = "bundled"; + inherit cargoHash; + cargoDeps = rustPlatform.fetchCargoVendor { + name = "${oa.pname}-cargo-deps"; + src = dependencies.treesitter; + hash = cargoHash; + }; + # Disable patches applied by the nixpkgs tree-sitter derivation as they clash with this revision of TS. + # The equivalent patching is done below in `postPatch` + patches = [ ]; + + # clang is needed by the quickjs-sys crate to compile quickjs + nativeBuildInputs = [ + clang + ] + ++ oa.nativeBuildInputs; + env.LIBCLANG_PATH = "${lib.getLib libclang}/lib"; + + postPatch = '' + ${oa.postPatch} + sed -e 's/playground::serve(.*$/println!("ERROR: web-ui is not available in this nixpkgs build; enable the webUISupport"); std::process::exit(1);/' \ + -i crates/cli/src/main.rs + ''; +})