From c49871d17de103cfac0b144a137b69a341f09960 Mon Sep 17 00:00:00 2001 From: 0chroma <21014+0chroma@users.noreply.github.com> Date: Mon, 1 Jun 2026 17:05:28 -0700 Subject: [PATCH] feat: add haskell-language-server 2.14.0.0 Add package for the Haskell Language Server (HLS), the official LSP implementation for Haskell. Builds from source using GHC + Cabal with dynamic linking, copying the binary and all required shared libraries via ldd dependency resolution. - Source: GitHub tag 2.14.0.0 with automatic extraction - Build deps: base, cabal, ghc - Runtime deps: glibc - Network access enabled for cabal dependency index updates - Includes standalone version check test --- packages/haskell-language-server/build.ncl | 64 ++++++++++++++++++++++ packages/haskell-language-server/build.sh | 31 +++++++++++ 2 files changed, 95 insertions(+) create mode 100644 packages/haskell-language-server/build.ncl create mode 100755 packages/haskell-language-server/build.sh diff --git a/packages/haskell-language-server/build.ncl b/packages/haskell-language-server/build.ncl new file mode 100644 index 00000000..c9344c7f --- /dev/null +++ b/packages/haskell-language-server/build.ncl @@ -0,0 +1,64 @@ +let { Attrs, BuildSpec, Local, Needs, OutputBin, OutputLib, Source, Test, .. } = import "minimal.ncl" in + +let base = import "../base/build.ncl" in +let cabal = import "../cabal/build.ncl" in +let ghc = import "../ghc/build.ncl" in +let glibc = import "../glibc/build.ncl" in + +let version = "2.14.0.0" in + +{ + name = "haskell-language-server", + + build_deps = [ + { file = "build.sh" } | Local, + { + url = "https://github.com/haskell/haskell-language-server/archive/refs/tags/%{version}.tar.gz", + sha256 = "02fdd2ea8048cddce0872f78fcc4ba15558f751333c97d24b9abadac8ee27dcb", + extract = true, + strip_prefix = "haskell-language-server-%{version}", + } | Source, + base, + ghc, + cabal, + ], + + runtime_deps = [glibc], + + needs = + { + dns = {}, + internet = {}, + } | Needs, + + cmd = "./build.sh", + + build_args = { + include version, + }, + + outputs = { + hls = { glob = "usr/bin/haskell-language-server" } | OutputBin, + libs = { glob = "usr/lib/*.so*" } | OutputLib, + }, + + attrs = + { + upstream_version = version, + source_provenance = { + category = 'GithubRepo, + owner = "haskell", + repo = "haskell-language-server", + }, + build_cost_multiple = 4, + } | Attrs, + + tests = { + version_check = + { + class = 'Standalone, + test_deps = [], + cmds = [["haskell-language-server", "--version"]], + } | Test, + }, +} | BuildSpec diff --git a/packages/haskell-language-server/build.sh b/packages/haskell-language-server/build.sh new file mode 100755 index 00000000..83643db9 --- /dev/null +++ b/packages/haskell-language-server/build.sh @@ -0,0 +1,31 @@ +#!/bin/bash +set -euo pipefail + +# The source tarball is already extracted with strip_prefix, so we're in the source root + +# Build HLS for the GHC version available in the sandbox +export GHC="$(command -v ghc)" +export CABAL="$(command -v cabal)" + +# Update cabal package index +cabal update + +# Build HLS with the available GHC version +cabal build \ + --ghc-options="-j$(nproc)" \ + exe:haskell-language-server + +# Install to OUTPUT_DIR +mkdir -p "$OUTPUT_DIR"/usr/bin +mkdir -p "$OUTPUT_DIR"/usr/lib + +# Find and copy the built binary from cabal's build directory +HLS_BIN=$(cabal list-bin exe:haskell-language-server) +cp "$HLS_BIN" "$OUTPUT_DIR"/usr/bin/ + +# Copy all shared Haskell libraries the binary depends on +for lib in $(ldd "$HLS_BIN" | grep '\.so' | awk '{print $3}'); do + if [ -n "$lib" ] && [ -f "$lib" ]; then + cp "$lib" "$OUTPUT_DIR"/usr/lib/ + fi +done