{ stdenv, lib, guile_3_0, guile-config, fetchFromGitLab, autoreconfHook
, pkg-config, texinfo, makeWrapper }:

let modules = [ guile-config ];
in stdenv.mkDerivation rec {
  pname = "guile-hall";
  version = "0.4.1";

  src = fetchFromGitLab {
    owner = "a-sassmannshausen";
    repo = pname;
    rev = version;
    sha256 = "sha256-TUCN8kW44X6iGbSJURurcz/Tc2eCH1xgmXH1sMOMOXs=";
  };

  nativeBuildInputs = [ pkg-config autoreconfHook texinfo makeWrapper ];
  propagatedBuildInputs = [ guile_3_0 ];
  buildInputs = modules;

  postConfigure = ''
    sed -i '/moddir\s*=/s%=.*%=''${out}/share/guile/site%' Makefile
    sed -i '/godir\s*=/s%=.*%=''${out}/share/guile/site%' Makefile
    sed -i '/ccachedir\s*=/s%=.*%=''${out}/share/guile/site%' Makefile
  '';

  GUILE_LOAD_PATH = let
    guilePath = [ "\${out}/share/guile/site" ] ++ (lib.concatMap (module: [
      "${module}/share/guile/site"
      "${module}/share/guile"
      "${module}/share"
    ]) modules);
  in lib.concatStringsSep ":" guilePath;

  GUILE_LOAD_COMPILED_PATH = let
    guilePath = [ "\${out}/share/guile/ccache" "\${out}/share/guile/site" ]
      ++ (lib.concatMap (module: [
        "${module}/share/guile/ccache"
        "${module}/share/guile/site"
        "${module}/share/guile"
        "${module}/share"
      ]) modules);
  in lib.concatStringsSep ":" guilePath;

  postInstall = ''
    wrapProgram $out/bin/hall \
      --prefix GUILE_LOAD_PATH : "${GUILE_LOAD_PATH}" \
      --prefix GUILE_LOAD_COMPILED_PATH : "${GUILE_LOAD_COMPILED_PATH}"
  '';

  meta = with lib; {
    description = "Command-line application for managing Guile projects";
    homepage = "https://gitlab.com/a-sassmannshausen/guile-hall";
    license = licenses.gpl3Only;
    mainProgram = "hall";
  };
}