Subject: [bug#60286] [PATCHES] Add guile's implementation for scheme-lsp-server

From: Andrew Tropin <[email-masked]>
Date: Mon, 07 Aug 2023 13:44:15 +0400

On 2023-06-21 19:27, Ricardo G. Herdt wrote:

Hi Ricardo, thank you very much for the patches and working on
guile-lsp-server.

> * gnu/packages/guile-xyz.scm: add guile-lsp-server;
>    (guile-scheme-json-rpc): update to 0.4.0, change dependencies
>
> Original package author Giacomo Leidi. Adapted to use 
> guile-scheme-json-rpc.
> ---
>   gnu/packages/guile-xyz.scm | 97 +++++++++++++++++++++++++++++++++++---
>   1 file changed, 91 insertions(+), 6 deletions(-)
>
> diff --git a/gnu/packages/guile-xyz.scm b/gnu/packages/guile-xyz.scm
> index db7be432cc..1195e0e328 100644
> --- a/gnu/packages/guile-xyz.scm
> +++ b/gnu/packages/guile-xyz.scm
> @@ -1054,9 +1054,9 @@ (define-public guile2.2-sjson
>       (inputs (list guile-2.2))))
>
>   (define-public guile-scheme-json-rpc
> -  (let ((commit "45ae6890f6619286f5679f88c094c88127b54c4a")
> +  (let ((commit "50acef7b824e2d23140e48242020f5fdc85cc67d")

For tagged release there is no need for commit and revision, I'll remove
them and apply the part of the patch related to guile-scheme-json-rpc
version update as separate commit.

>           (revision "0")
> -        (version "0.2.11"))
> +        (version "0.4.0"))
>       (package
>         (name "guile-scheme-json-rpc")
>         (version (git-version version revision commit))
> @@ -1068,16 +1068,20 @@ (define-public guile-scheme-json-rpc
>                   (file-name (git-file-name name version))
>                   (sha256
>                    (base32
> -                  
> "0w4m8xx8yyj0rv0q57mjr8ja87l7yikscj33i3ck26wg7230ppa5"))))
> +                  
> "0jsampz2ahs18z6yh9b5l3lkj8ycnavs0vg9sjngdj3w3zvrdcvm"))))
>         (build-system gnu-build-system)
>         (arguments
>          `(#:phases (modify-phases %standard-phases
>                       (add-after 'unpack 'change-to-guile-dir
>                         (lambda _
>                           (chdir "guile"))))))
> -      (inputs (list guile-3.0 guile-json-3))
> -      (native-inputs (list pkg-config))
> -      (synopsis "Library providing JSON-RPC capability in Scheme")
> +      (inputs (list guile-3.0 guile-srfi-145 guile-srfi-180))
> +      (native-inputs (list autoconf
> +                           automake
> +                           pkg-config
> +                           texinfo
> +                           guile-3.0))

auto tools is already provided by gnu-build-system, no need to provide
them one more time.  I don't see any texi docs, so probably texinfo is
not needed.  Also guile-3.0 in native (build host side) inputs also not
needed.  Removed.

> +      (synopsis "Library providing JSON-RPC capability for Guile 
> Scheme")
>         (description
>          "This library implements parts of the
>   @uref{https://www.jsonrpc.org/specification,JSON-RPC specification}, 
> allowing
> @@ -1085,6 +1089,87 @@ (define-public guile-scheme-json-rpc
>         (home-page "https://codeberg.org/rgherdt/scheme-json-rpc/")
>         (license license:expat))))
>
> +(define-public guile-lsp-server
> +  (package
> +    (name "guile-lsp-server")
> +    (version "0.4.0")
> +    (source
> +     (origin
> +      (method git-fetch)
> +      (uri (git-reference
> +            (url "https://codeberg.org/rgherdt/scheme-lsp-server.git")
> +            (commit version)))
> +      (file-name (git-file-name name version))
> +      (sha256
> +       (base32
> +        "04fc76pnl8mrwrjw49xhzs4r0dx2vh4gy2y151p33hahylf5z1xs"))))
> +    (build-system gnu-build-system)
> +    (arguments
> +     (list #:modules `((ice-9 match)
> +                       (ice-9 ftw)
> +                       ,@%gnu-build-system-modules)
> +           #:phases
> +           #~(modify-phases %standard-phases
> +               (add-after 'unpack 'move-to-guile-directory
> +                 (lambda _
> +                   (chdir "./guile")))
> +               (add-after 'install 'wrap-entrypoint
> +                 (lambda _
> +                   (let* ((bin (string-append #$output "/bin"))
> +                          (site (string-append #$output
> +                                               "/share/guile/site"))
> +                          (deps (list #$guile-scheme-json-rpc)))

It's better to use (assoc-ref inputs ...) here, because
#$guile-scheme-json-rpc will hardcode the exact package and if someone
will try to inherit from guile-lsp-server and override
guile-scheme-json-rpc input, it won't make a desired effect and
hardcoded version of guile-scheme-json-rpc will be used.

Also, guile-lsp-server executable doesn't run, it's very likely that
other required dependencies are missing here in the deps variable.

> +                     (match (scandir site)
> +                       (("." ".." version)
> +                        (let ((modules (string-append site "/"
> +                                                      version))
> +                              (compiled-modules (string-append #$output
> +                                                 "/lib/guile/"
> +                                                 version
> +                                                 "/site-ccache")))
> +                          (wrap-program (string-append bin
> +                                         "/guile-lsp-server")
> +                                        `("GUILE_LOAD_PATH" ":"
> +                                          prefix
> +                                          (,modules
> +                                           ,@(map (lambda (dep)
> +                                                    (string-append
> +                                                     dep
> +                                                     
> "/share/guile/site/"
> +                                                     version))
> +                                                  deps)))
> +                                        `("GUILE_LOAD_COMPILED_PATH"
> +                                          ":" prefix
> +                                          (,compiled-modules
> +                                           ,@(map (lambda (dep)
> +                                                    (string-append
> +                                                     dep
> +                                                     "/lib/guile/"
> +                                                     version
> +                                                     "/site-ccache"))
> +                                              deps))))
> +                          #t)))))))))
> +    (native-inputs (list pkg-config))
> +    (inputs
> +     ;; Depend on the latest Guile to avoid bytecode compatibility 
> issues when
> +     ;; using modules built against the latest version.
> +     (list bash-minimal
> +           guile-3.0-latest))
> +    (propagated-inputs (list guile-irregex
> +                             guile-scheme-json-rpc
> +                             guile-srfi-145
> +                             guile-srfi-180))

For standalone programs like guile-lsp-server, where we manually
construct GUILE_LOAD_PATH it's not needed to propagate dependencies in
the profile, where package is installed.  It should be just inputs.

> +    (synopsis "LSP (Language Server Protocol) server for Scheme")
> +    (description
> +     "@code{guile-lsp-server} is an implementation for Guile of the LSP
> +specification.  This software aims to support several Scheme 
> implementations.
> +To achieve this, the code is designed to contain as much logic as 
> possible in
> +R7RS Scheme, separating implementation-specific code in different 
> modules.
> +
> +This package delivers Guile's implementation for 
> @code{scheme-lsp-server}.")
> +    (home-page "https://codeberg.org/rgherdt/scheme-lsp-server")
> +    (license license:expat)))
> +
>   (define-public guile-squee
>     (let ((commit "fab9d9590792f3ededd4abd8cfa6be5e56659678")
>           (revision "4"))
>
> base-commit: 392f9db97687bfb6195e65a28e1710f22b6cb972

Applied first part of the patch, pushed as
https://git.savannah.gnu.org/cgit/guix.git/commit/?id=56667ee55c

Please update the guile-lsp-server package definition to make it work
(right now package builds, but executable fails to run).

P.S. Thanks to Giacomo for spinning up this thread!

-- 
Best regards,
Andrew Tropin