diff mbox series

[bug#49946,07/31] gnu: Add tree-sitter.

Message ID 20210808233354.6745-7-pierre.langlois@gmx.com
State New
Headers show
Series Tree-sitter, node-gyp addon support and emacs-tree-sitter | expand

Commit Message

Pierre Langlois Aug. 8, 2021, 11:33 p.m. UTC
* gnu/packages/tree-sitter.scm: New file.
* gnu/local.mk (GNU_SYSTEM_MODULES): Register it.
---
 gnu/local.mk                 |  1 +
 gnu/packages/tree-sitter.scm | 98 ++++++++++++++++++++++++++++++++++++
 2 files changed, 99 insertions(+)
 create mode 100644 gnu/packages/tree-sitter.scm

--
2.32.0

Comments

Pierre Langlois Aug. 13, 2021, 1:17 p.m. UTC | #1
Pierre Langlois <pierre.langlois@gmx.com> writes:

> * gnu/packages/tree-sitter.scm: New file.
> * gnu/local.mk (GNU_SYSTEM_MODULES): Register it.
> ---
>  gnu/local.mk                 |  1 +
>  gnu/packages/tree-sitter.scm | 98 ++++++++++++++++++++++++++++++++++++
>  2 files changed, 99 insertions(+)
>  create mode 100644 gnu/packages/tree-sitter.scm
>
> diff --git a/gnu/local.mk b/gnu/local.mk
> index 3f09b167b1..3763df0821 100644
> --- a/gnu/local.mk
> +++ b/gnu/local.mk
> @@ -559,6 +559,7 @@ GNU_SYSTEM_MODULES =				\
>    %D%/packages/tls.scm				\
>    %D%/packages/tmux.scm				\
>    %D%/packages/tor.scm				\
> +  %D%/packages/tree-sitter.scm			\
>    %D%/packages/tv.scm				\
>    %D%/packages/uglifyjs.scm			\
>    %D%/packages/uml.scm				\
> diff --git a/gnu/packages/tree-sitter.scm b/gnu/packages/tree-sitter.scm
> new file mode 100644
> index 0000000000..2c749dc0a8
> --- /dev/null
> +++ b/gnu/packages/tree-sitter.scm
> @@ -0,0 +1,98 @@
> +;;; GNU Guix --- Functional package management for GNU
> +;;; Copyright © 2021 Pierre Langlois <pierre.langlois@gmx.com>
> +;;;
> +;;; This file is part of GNU Guix.
> +;;;
> +;;; GNU Guix is free software; you can redistribute it and/or modify it
> +;;; under the terms of the GNU General Public License as published by
> +;;; the Free Software Foundation; either version 3 of the License, or (at
> +;;; your option) any later version.
> +;;;
> +;;; GNU Guix is distributed in the hope that it will be useful, but
> +;;; WITHOUT ANY WARRANTY; without even the implied warranty of
> +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +;;; GNU General Public License for more details.
> +;;;
> +;;; You should have received a copy of the GNU General Public License
> +;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
> +
> +(define-module (gnu packages tree-sitter)
> +  #:use-module ((guix licenses) #:prefix license:)
> +  #:use-module (guix build-system cargo)
> +  #:use-module (guix git-download)
> +  #:use-module (guix packages)
> +  #:use-module (gnu packages crates-io)
> +  #:use-module (gnu packages crates-graphics))
> +
> +(define-public tree-sitter
> +  (package
> +    (name "tree-sitter")
> +    (version "0.19.5")
> +    (source
> +      (origin
> +        (method git-fetch)
> +        (uri (git-reference
> +              (url "https://github.com/tree-sitter/tree-sitter")
> +              (commit (string-append "v" version))))
> +        (file-name (git-file-name name version))
> +        (sha256
> +         (base32
> +          "1qmb0sva28zv6r3c3j7xs9pc8bpwwhkb9vxxndw2zbdn9wkvmbmn"))))
> +    (build-system cargo-build-system)

The tree-sitter package here both ships the `tree-sitter' command-line
program, written in Rust, and the runtime library, written in C.  I
think it would be better to split this into two packages, `tree-sitter'
for the runtime and `tree-sitter-cli` for the Rust program.

That way, a potential future Emacs will be able to link against
libtree-sitter *without* bringing in Rust as a hard dependency. I saw
that native tree-sitter support was being worked on on emacs-devel
list. One would still need Rust to actually use it, but at least it
remains an optional dependency.

Thanks,
Pierre
Luis Henrique Gomes Higino March 7, 2022, 6:30 p.m. UTC | #2
Hi Guix, Hi Pierre,

I apologize for my delay, the last few weeks were quite busy :-/.

Pierre Langlois <pierre.langlois@gmx.com> writes:

> I'm sharing it early as a WIP first, as I just noticed the other 
> day
> that Luis also contributed a patches for tree-sitter for 
> neovim[0]. The
> series I have here is quite a lot bigger though so I'm happy to 
> rebase
> it on top of yours, Luis :-). The package I had for tree-sitter 
> looks
> basically the same, I would then move it to a new file with all
> tree-sitter related packages, if you're happy with that.

That's OK by me!

> So I'm wondering, are these tree-sitter grammar packages also 
> useful for
> the neovim package for tree-sitter?

I'm not exactly sure about this. Currently, most Neovim users 
install their grammars through the installer included in 
https://github.com/nvim-treesitter/nvim-treesitter. That ensures 
the user gets the version that is ABI compatible with 
nvim-treesitter. That makes me uncertain if we could use the same 
grammar packages for Neovim and Emacs, at least for now.

> I do wonder if I'm going about it the right way for Guix though, 
> for
> instance I'm wondering if I should rewrite the grammar packages 
> using a
> new custom build system, do people think it would be worth it? 
> That
> could be done as a follow-up of course.

I'm not a very experienced packager myself, but from what I saw in 
your patch, it seems rather unnecessary, as the grammar packages 
are very simple.
diff mbox series

Patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 3f09b167b1..3763df0821 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -559,6 +559,7 @@  GNU_SYSTEM_MODULES =				\
   %D%/packages/tls.scm				\
   %D%/packages/tmux.scm				\
   %D%/packages/tor.scm				\
+  %D%/packages/tree-sitter.scm			\
   %D%/packages/tv.scm				\
   %D%/packages/uglifyjs.scm			\
   %D%/packages/uml.scm				\
diff --git a/gnu/packages/tree-sitter.scm b/gnu/packages/tree-sitter.scm
new file mode 100644
index 0000000000..2c749dc0a8
--- /dev/null
+++ b/gnu/packages/tree-sitter.scm
@@ -0,0 +1,98 @@ 
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2021 Pierre Langlois <pierre.langlois@gmx.com>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu packages tree-sitter)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix build-system cargo)
+  #:use-module (guix git-download)
+  #:use-module (guix packages)
+  #:use-module (gnu packages crates-io)
+  #:use-module (gnu packages crates-graphics))
+
+(define-public tree-sitter
+  (package
+    (name "tree-sitter")
+    (version "0.19.5")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+              (url "https://github.com/tree-sitter/tree-sitter")
+              (commit (string-append "v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32
+          "1qmb0sva28zv6r3c3j7xs9pc8bpwwhkb9vxxndw2zbdn9wkvmbmn"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(;; Running test requires downloading fixtures, see the
+       ;; script/fetch-fixtures script.
+       #:tests? #f
+       ;; FIXME: Installing the sources for the tree-sitter Rust bindings
+       ;; doesn't work out of the box due to tree-sitter having multiple
+       ;; Rust packages in the same repository (bindings and CLI).
+       #:install-source? #f
+       #:cargo-inputs
+       (("rust-ansi-term" ,rust-ansi-term-0.12)
+        ("rust-atty" ,rust-atty-0.2)
+        ("rust-clap" ,rust-clap-2)
+        ("rust-difference" ,rust-difference-2)
+        ("rust-dirs" ,rust-dirs-3)
+        ("rust-html-escape" ,rust-html-escape-0.2)
+        ("rust-libloading" ,rust-libloading-0.7)
+        ("rust-smallbitvec" ,rust-smallbitvec-2)
+        ("rust-spin" ,rust-spin-0.7)
+        ("rust-tiny-http" ,rust-tiny-http-0.8)
+        ("rust-walkdir" ,rust-walkdir-2)
+        ("rust-webbrowser" ,rust-webbrowser-0.5)
+        ("rust-which" ,rust-which-4))
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'delete-cargo.lock
+           (lambda _ (delete-file "Cargo.lock")))
+         (add-after 'build 'build-lib
+           (lambda _ (invoke "make")))
+         (replace 'install
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (bin (string-append out "/bin"))
+                    (lib (string-append out "/lib")))
+               (mkdir-p bin)
+               (install-file "target/release/tree-sitter" bin)
+               (setenv "PREFIX" out)
+               (invoke "make" "install")))))))
+    (home-page "https://tree-sitter.github.io/tree-sitter/")
+    (synopsis "Incremental parsing system for programming tools")
+    (description "Tree-sitter is a parser generator tool and an incremental
+parsing library.  It can build a concrete syntax tree for a source file and
+efficiently update the syntax tree as the source file is edited.
+
+Tree-sitter aims to be:
+
+@enumerate
+@item General enough to parse any programming language.
+@item Fast enough to parse on every keystroke in a text editor.
+@item Robust enough to provide useful results even in the presence of syntax
+errors.
+@item Dependency-free so that the runtime library (which is written in pure C)
+can be embedded in any application.
+@end enumerate
+
+This package includes the @command{tree-sitter} tool as well as the runtime
+library.")
+    (license license:expat)))