I packaged scheme-lsp-server for guile

There’s rgherdt/scheme-lsp-server: An LSP server for Scheme. - Codeberg.org which is

An LSP (Language Server Protocol) server for Scheme.

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 directories.

I’d like to create a PR. Are there naming conventions for Guile libs? I’d create guile-srfi, guile-scheme-json-rpc, guile-irregex dependency packages.

Full source below

{
  lib,
  guile,
  stdenv,
  fetchFromGitea,
  pkg-config,
  callPackage,
  bash,
  makeWrapper,
}:
let
  srfi =
    {
      lib,
      stdenv,
      fetchFromGitea,
      mitscheme,
    }:

    stdenv.mkDerivation {
      pname = "srfi";
      version = "unstable-2023-06-04";

      src = fetchFromGitea {
        domain = "codeberg.org";
        owner = "rgherdt";
        repo = "srfi";
        rev = "e598c28eb78e9c3e44f5c3c3d997ef28abb6f32e";
        hash = "sha256-kvM2v/nDou0zee4+qcO5yN2vXt2y3RUnmKA5S9iKFE0=";
      };

      nativeBuildInputs = [
        guile
      ];

      buildInputs = [
        guile
      ];

      propagatedBuildInputs = [
        (callPackage irregex { })
      ];

      preConfigure = ''
        export GUILE_AUTO_COMPILE=0
      '';

      buildPhase = ''
        runHook preBuild

        site_dir="$out/share/guile/site/3.0"
        lib_dir="$out/lib/guile/3.0/site-ccache"

        export GUILE_LOAD_PATH=.:$site_dir:...:$GUILE_LOAD_PATH
        export GUILE_LOAD_COMPILED_PATH=.:$lib_dir:...:$GUILE_LOAD_COMPILED_PATH

        mkdir -p $site_dir/srfi
        cp $src/srfi/srfi-145.scm $site_dir/srfi
        cp $src/srfi/srfi-180.scm $site_dir/srfi
        cp -R $src/srfi/srfi-180/ $site_dir/srfi
        cp -R $src/srfi/180/ $site_dir/srfi
        guild compile -x "sld" --r7rs $site_dir/srfi/srfi-180/helpers.sld -o $lib_dir/srfi/srfi-180/helpers.go
        guild compile --r7rs $site_dir/srfi/srfi-180.scm -o $lib_dir/srfi/srfi-180.go

        runHook postBuild
      '';

      strictDeps = true;

      meta = {
        description = "Scheme SRFI implementations in portable R7RS scheme";
        homepage = "https://codeberg.org/rgherdt/srfi";
        license = lib.licenses.mit;
        maintainers = with lib.maintainers; [ knightpp ];
        platforms = lib.platforms.all;
      };
    };

  scheme-json-rpc =
    {
      lib,
      stdenv,
      fetchFromGitea,
    }:
    stdenv.mkDerivation (finalAttrs: {
      pname = "scheme-json-rpc";
      version = "0.4.5a";

      src = fetchFromGitea {
        domain = "codeberg.org";
        owner = "rgherdt";
        repo = "scheme-json-rpc";
        rev = finalAttrs.version;
        hash = "sha256-sTJxPxHKovMOxfu5jM/6EpB9RFpG+9E3388xeE2Fpgw=";
      };

      strictDeps = true;

      propagatedBuildInputs = [
        (callPackage srfi { })
      ];

      nativeBuildInputs = [
        pkg-config
        guile
      ];

      buildInputs = [
        guile
      ];

      env.GUILE_AUTO_COMPILE = "0";

      preConfigure = ''
        cd guile
      '';

      meta = {
        description = "A JSON-RPC implementation for Scheme";
        homepage = "https://codeberg.org/rgherdt/scheme-json-rpc";
        license = lib.licenses.mit;
        maintainers = with lib.maintainers; [ knightpp ];
        platforms = lib.platforms.all;
      };
    });

  irregex =
    {
      lib,
      stdenv,
      fetchzip,
      mitscheme,
    }:
    stdenv.mkDerivation (finalAttrs: {
      pname = "irregex";
      version = "0.9.11";

      src = fetchzip {
        url = "http://synthcode.com/scheme/irregex/irregex-${finalAttrs.version}.tar.gz";
        hash = "sha256-abBCMNsr6GTBOm+eQWuOX8JYx/qMA/V6TwGdYRjznWU=";
      };

      strictDeps = true;

      nativeBuildInputs = [
        guile
        mitscheme
      ];

      buildInputs = [
        guile
      ];

      env.GUILE_AUTO_COMPILE = "0";

      buildPhase = ''
        runHook preBuild

        site_dir="$out/share/guile/site/3.0"
        lib_dir="$out/lib/guile/3.0/site-ccache"

        mkdir -p $site_dir/rx/source
        mkdir -p $lib_dir/rx/source

        cp $src/irregex-guile.scm $site_dir/rx/irregex.scm
        cp $src/irregex.scm $site_dir/rx/source/irregex.scm
        cp $src/irregex-utils.scm $site_dir/rx/source/irregex-utils.scm
        guild compile --r7rs $site_dir/rx/irregex.scm -o $lib_dir/rx/irregex.go
        guild compile --r7rs $site_dir/rx/source/irregex.scm -o $lib_dir/rx/source/irregex.go

        runHook postBuild
      '';

      dontInstall = true;
    });
in
stdenv.mkDerivation (finalAttrs: {
  pname = "guile-lsp-server";
  version = "0.4.7";

  src = fetchFromGitea {
    domain = "codeberg.org";
    owner = "rgherdt";
    repo = "scheme-lsp-server";
    tag = "${finalAttrs.version}";
    hash = "sha256-XNzon1l6CnCd4RasNrHHxWEBNhyaHXgdNLsvjvRLbfk=";
  };

  strictDeps = true;

  nativeBuildInputs = [
    pkg-config
    makeWrapper
    guile
  ];

  buildInputs = [
    guile
  ];

  propagatedBuildInputs = [
    (callPackage scheme-json-rpc { })
  ];

  makeFlags = [ "GUILE_AUTO_COMPILE=0" ];

  preConfigure = ''
    cd guile
  '';

  postInstall = ''
    wrapProgram $out/bin/guile-lsp-server \
      --prefix PATH : ${
        lib.makeBinPath [
          guile
          bash
        ]
      } \
      --set GUILE_AUTO_COMPILE 0 \
      --prefix GUILE_LOAD_PATH : "$out/${guile.siteDir}:$GUILE_LOAD_PATH" \
      --prefix GUILE_LOAD_COMPILED_PATH : "$out/${guile.siteCcacheDir}:$GUILE_LOAD_COMPILED_PATH" \
      --argv0 $out/bin/guile-lsp-server
  '';

  meta = {
    homepage = "https://codeberg.org/rgherdt/scheme-lsp-server";
    description = "An LSP server for Guile";
    license = lib.licenses.mit;
    maintainers = with lib.maintainers; [ knightpp ];
    mainProgram = "guile-lsp-server";
    platforms = guile.meta.platforms;
  };
})