]> git.eshelyaron.com Git - emacs.git/commitdiff
Future-proof loading tree-sitter library on MS-Windows
authorEli Zaretskii <eliz@gnu.org>
Thu, 21 Nov 2024 12:55:38 +0000 (14:55 +0200)
committerEshel Yaron <me@eshelyaron.com>
Wed, 27 Nov 2024 19:50:19 +0000 (20:50 +0100)
* src/treesit.c (syms_of_treesit) <tree-sitter--library-abi>: New
internal variable.

* lisp/term/w32-win.el (dynamic-library-alist): Use
'tree-sitter--library-abi' to select a proper libtree-sitter DLL
version.

(cherry picked from commit 83fc3cf53a4b54a4ec3bf464cfea97f74522cd8d)

lisp/term/w32-win.el
src/treesit.c

index 911bd72184dc836825e0676aa3d1dc35ba1cd2d5..7d46c4d4d968067b8d816086a65b85d604f375a3 100644 (file)
@@ -313,8 +313,18 @@ See the documentation of `create-fontset-from-fontset-spec' for the format.")
        '(lcms2 "liblcms2-2.dll")
        '(gccjit "libgccjit-0.dll")
        ;; MSYS2 distributes libtree-sitter.dll, without API version
-       ;; number...
-       '(tree-sitter "libtree-sitter.dll" "libtree-sitter-0.dll")))
+       ;; number, upto and including version 0.24.3-2; later versions
+       ;; come with libtree-sitter-major.minor.dll (as in
+       ;; libtree-sitter-0.24.dll).  Sadly, the header files don't have
+       ;; any symbols for library version, so we can only use the
+       ;; library-language ABI version; according to
+       ;; https://github.com/tree-sitter/tree-sitter/issues/3925, the
+       ;; language ABI must change when the library's ABI is modified.
+       (if (<= tree-sitter--library-abi 14)
+           '(tree-sitter "libtree-sitter-0.24.dll"
+                         "libtree-sitter.dll"
+                         "libtree-sitter-0.dll")
+         '(tree-sitter "libtree-sitter-0.25.dll"))))
 
 ;;; multi-tty support
 (defvar w32-initialized nil
index 6677158b9de0c4fcac7674f93af80e3438ec2afe..5e1e9b0105929c112630c5dd17b1e1eec282e52f 100644 (file)
@@ -4516,4 +4516,15 @@ applies to LANGUAGE-A will be redirected to LANGUAGE-B instead.  */);
   defsubr (&Streesit_subtree_stat);
 #endif /* HAVE_TREE_SITTER */
   defsubr (&Streesit_available_p);
+#ifdef WINDOWSNT
+  DEFSYM (Qtree_sitter__library_abi, "tree-sitter--library-abi");
+  Fset (Qtree_sitter__library_abi,
+#if HAVE_TREE_SITTER
+       make_fixnum (TREE_SITTER_LANGUAGE_VERSION)
+#else
+       make_fixnum (-1)
+#endif
+       );
+#endif
+
 }