about summary refs log tree commit diff
diff options
context:
space:
mode:
authorYilin Wei <yilin@kebab-ca.se>2022-10-11 15:24:58 +0100
committerYilin Wei <yilin@kebab-ca.se>2022-10-12 19:11:33 +0100
commit2142ce3789d2ac230a225eb078d3bf2f85046532 (patch)
tree1f25cef296cf0c1b85d2cb0d09bc00125c051bd4
parentd04558957e2bef64780144486becbdc1c731fe7f (diff)
downloadnixlib-2142ce3789d2ac230a225eb078d3bf2f85046532.tar
nixlib-2142ce3789d2ac230a225eb078d3bf2f85046532.tar.gz
nixlib-2142ce3789d2ac230a225eb078d3bf2f85046532.tar.bz2
nixlib-2142ce3789d2ac230a225eb078d3bf2f85046532.tar.lz
nixlib-2142ce3789d2ac230a225eb078d3bf2f85046532.tar.xz
nixlib-2142ce3789d2ac230a225eb078d3bf2f85046532.tar.zst
nixlib-2142ce3789d2ac230a225eb078d3bf2f85046532.zip
Add `feature/tree-sitter` derivation to emacs overlay
Adds the branch `feature/tree-sitter` to allow testing of tree-sitter
integration and exposes it as `emacsGitTreeSitter` in the `emacs`
overlay.

Introduces `withTreeSitter` and `withTreeSitterPlugins`.
-rw-r--r--overlays/emacs.nix38
-rw-r--r--repos/emacs/emacs-feature_tree-sitter.json1
-rw-r--r--repos/emacs/test.nix1
-rwxr-xr-xrepos/emacs/update1
4 files changed, 37 insertions, 4 deletions
diff --git a/overlays/emacs.nix b/overlays/emacs.nix
index 1b93d4473ec0..4e2a6aaed6c1 100644
--- a/overlays/emacs.nix
+++ b/overlays/emacs.nix
@@ -14,9 +14,9 @@ let
     builtins.foldl'
       (drv: fn: fn drv)
       super.emacs
-      [
+      ([
 
-        (drv: drv.override ({ srcRepo = true; } // args))
+        (drv: drv.override ({ srcRepo = true; } // builtins.removeAttrs args [ "withTreeSitterPlugins" "withTreeSitter" ]))
 
         (
           drv: drv.overrideAttrs (
@@ -68,7 +68,26 @@ let
           in
           result
         )
-      ];
+      ]
+      ++ (super.lib.optional (args ? "withTreeSitter") (
+        drv: drv.overrideAttrs (old:
+          let
+            libName = drv: super.lib.removeSuffix "-grammar" drv.pname;
+            lib = drv: ''lib${libName drv}.so'';
+            linkCmd = drv: "ln -s ${drv}/parser $out/lib/${lib drv}";
+            linkerFlag = drv: "-l" + libName drv;
+            plugins = args.withTreeSitterPlugins super.pkgs.tree-sitter-grammars;
+            tree-sitter-grammars = super.runCommand "tree-sitter-grammars" {
+            } (super.lib.concatStringsSep "\n" (["mkdir -p $out/lib"] ++ (map linkCmd plugins)));
+          in {
+            buildInputs = old.buildInputs ++ [ super.pkgs.tree-sitter tree-sitter-grammars ];
+            # before building the `.el` files, we need to allow the `tree-sitter` libraries
+            # bundled in emacs to be dynamically loaded.
+            TREE_SITTER_LIBS = super.lib.concatStringsSep " " ([ "-ltree-sitter" ] ++ (map linkerFlag plugins)); 
+          }
+        )
+      )));
+
 
   mkPgtkEmacs = namePrefix: jsonFile: { ... }@args: (mkGitEmacs namePrefix jsonFile args).overrideAttrs (
     old: {
@@ -86,13 +105,22 @@ let
     withWebP = true;
     nativeComp = true;
   };
-
+  
   emacsPgtk = mkPgtkEmacs "emacs-pgtk" ../repos/emacs/emacs-master.json { withSQLite3 = true; withGTK3 = true; };
 
   emacsPgtkNativeComp = mkPgtkEmacs "emacs-pgtk-native-comp" ../repos/emacs/emacs-master.json { nativeComp = true; withSQLite3 = true; withGTK3 = true; };
 
   emacsUnstable = (mkGitEmacs "emacs-unstable" ../repos/emacs/emacs-unstable.json { });
 
+  emacsGitTreeSitter = mkGitEmacs "emacs-git-tree-sitter" ../repos/emacs/emacs-feature_tree-sitter.json {
+    withTreeSitter = true;
+    withTreeSitterPlugins = (plugins: with plugins; [
+      tree-sitter-python
+      tree-sitter-javascript
+      tree-sitter-json
+    ]);
+  };
+
 in
 {
   inherit emacsGit emacsUnstable;
@@ -133,6 +161,8 @@ in
     )
   );
 
+  inherit emacsGitTreeSitter;
+
   emacsWithPackagesFromUsePackage = import ../elisp.nix { pkgs = self; };
 
   emacsWithPackagesFromPackageRequires = import ../packreq.nix { pkgs = self; };
diff --git a/repos/emacs/emacs-feature_tree-sitter.json b/repos/emacs/emacs-feature_tree-sitter.json
new file mode 100644
index 000000000000..52f67cc64d6a
--- /dev/null
+++ b/repos/emacs/emacs-feature_tree-sitter.json
@@ -0,0 +1 @@
+{"type": "savannah", "repo": "emacs", "rev": "57e37e9128b4f6f9a2aae0bc25de6c208d58e5d0", "sha256": "1h6zicpj6bym4nclcgwvjbdisi1v5psvmpz1lik7ha85jdscpnd2", "version": "20221010.0"}
diff --git a/repos/emacs/test.nix b/repos/emacs/test.nix
index 24ed78a07cc3..fe0aa713d0c9 100644
--- a/repos/emacs/test.nix
+++ b/repos/emacs/test.nix
@@ -7,6 +7,7 @@ let
   in emacsWithPackages(epkgs: [ ]);
 
 in {
+  emacsGitTreeSitter = mkTestBuild pkgs.emacsGitTreeSitter;
   emacsUnstable = mkTestBuild pkgs.emacsUnstable;
   emacsGit = mkTestBuild pkgs.emacsGit;
   emacsGitNativeComp = mkTestBuild pkgs.emacsGitNativeComp;
diff --git a/repos/emacs/update b/repos/emacs/update
index 3de0f5309c5b..12b7daa45f4d 100755
--- a/repos/emacs/update
+++ b/repos/emacs/update
@@ -52,5 +52,6 @@ function update_release() {
 
 update_savannah_branch master
 update_release
+update_savannah_branch feature/tree-sitter
 
 nix-build --no-out-link --show-trace ./test.nix