Skip to content

Commit b5ebb1e

Browse files
committed
Implement distribution of dynamic builds
1 parent 3f12824 commit b5ebb1e

File tree

5 files changed

+140
-0
lines changed

5 files changed

+140
-0
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,6 @@ test/testdata/**/hie.yaml
4545
# nix
4646
result
4747
result-doc
48+
49+
out/
50+
store/

Makefile

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
ROOT_DIR:=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
2+
3+
GHC_VERSION ?=
4+
HLS_VERSION ?=
5+
6+
ifndef HLS_VERSION
7+
$(error HLS_VERSION is not set)
8+
endif
9+
10+
CHMOD := chmod
11+
INSTALL := install
12+
PATCHELF := patchelf
13+
FIND := find
14+
SED := sed
15+
MKDIR := mkdir
16+
TAR := tar
17+
CABAL := cabal
18+
19+
STORE_DIR := store
20+
BINDIST_BASE_DIR := out/bindist
21+
BINDIST_OUT_DIR := $(BINDIST_BASE_DIR)/haskell-language-server-$(HLS_VERSION)
22+
23+
CABAL_ARGS ?= --store-dir=$(ROOT_DIR)/$(STORE_DIR)
24+
CABAL_INSTALL_ARGS ?= --overwrite-policy=always --install-method=copy --installdir=$(ROOT_DIR)/out
25+
26+
hls: bindist/ghcs
27+
for ghc in $(shell cat bindist/ghcs) ; do \
28+
$(MAKE) GHC_VERSION=$$ghc hls-ghc ; \
29+
done
30+
31+
hls-ghc:
32+
if test -z "$(GHC_VERSION)" ; then echo >&2 "GHC_VERSION is not set" ; false ; fi
33+
$(CABAL) $(CABAL_ARGS) v2-install -w ghc-$(GHC_VERSION) $(CABAL_INSTALL_ARGS)
34+
35+
bindist:
36+
for ghc in $(shell cat bindist/ghcs) ; do \
37+
$(MAKE) GHC_VERSION=$$ghc bindist-ghc ; \
38+
done
39+
$(SED) -e "s/@@HLS_VERSION@@/$(HLS_VERSION)/" \
40+
bindist/Makefile.in > $(BINDIST_OUT_DIR)/Makefile
41+
cd $(BINDIST_BASE_DIR) ; $(TAR) caf $(ROOT_DIR)/out/haskell-language-server-$(HLS_VERSION).tar.xz haskell-language-server-$(HLS_VERSION)
42+
43+
bindist-ghc:
44+
if test -z "$(GHC_VERSION)" ; then echo >&2 "GHC_VERSION is not set" ; false ; fi
45+
$(MKDIR) -p $(BINDIST_OUT_DIR)/bin
46+
$(MKDIR) -p $(BINDIST_OUT_DIR)/lib/$(GHC_VERSION)
47+
$(SED) -e "s/@@EXE_NAME@@/haskell-language-server-$(GHC_VERSION)/" -e "s/@@GHC_VERSION@@/$(GHC_VERSION)/" \
48+
bindist/wrapper.in > $(BINDIST_OUT_DIR)/haskell-language-server-$(GHC_VERSION)
49+
$(SED) -e 's/@@EXE_NAME@@/haskell-language-server-wrapper/' -e "s/@@GHC_VERSION@@/$(GHC_VERSION)/" \
50+
bindist/wrapper.in > $(BINDIST_OUT_DIR)/haskell-language-server-wrapper
51+
$(CHMOD) 755 $(BINDIST_OUT_DIR)/haskell-language-server-$(GHC_VERSION)
52+
$(CHMOD) 755 $(BINDIST_OUT_DIR)/haskell-language-server-wrapper
53+
$(INSTALL) -vDm 755 out/haskell-language-server $(BINDIST_OUT_DIR)/bin/haskell-language-server-$(GHC_VERSION)
54+
$(PATCHELF) --set-rpath \$$ORIGIN/../lib/$(GHC_VERSION) $(BINDIST_OUT_DIR)/bin/haskell-language-server-$(GHC_VERSION)
55+
$(INSTALL) -vDm 755 out/haskell-language-server-wrapper $(BINDIST_OUT_DIR)/bin/haskell-language-server-wrapper
56+
$(PATCHELF) --set-rpath \$$ORIGIN/../lib/$(GHC_VERSION) $(BINDIST_OUT_DIR)/bin/haskell-language-server-wrapper
57+
$(FIND) $(STORE_DIR) -type f -name '*.so' -execdir install -vDm 755 {} $(ROOT_DIR)/$(BINDIST_OUT_DIR)/lib/$(GHC_VERSION)/{} \;
58+
$(FIND) $(ROOT_DIR)/$(BINDIST_OUT_DIR)/lib/$(GHC_VERSION) -type f -name '*.so' -execdir $(PATCHELF) --set-rpath \$$ORIGIN {} \;
59+
60+
61+
clean:
62+
rm -rf $(BINDIST_BASE_DIR)
63+
64+
clean-all:
65+
rm -rf $(BINDIST_BASE_DIR) $(STORE_DIR)
66+
67+
.PHONY: hls hls-ghc bindist bindist-ghc clean clean-all

bindist/Makefile.in

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
DESTDIR ?=
2+
PREFIX ?= /usr/local
3+
LIBDIR ?= $(PREFIX)/lib
4+
BINDIR ?= $(PREFIX)/bin
5+
6+
HLS_VERSION := @@HLS_VERSION@@
7+
8+
INSTALL := install
9+
SED := sed
10+
CHMOD := chmod
11+
12+
install:
13+
$(INSTALL) -d $(BINDIR)
14+
$(INSTALL) -d $(LIBDIR)/haskell-language-server-$(HLS_VERSION)/lib
15+
$(INSTALL) -d $(LIBDIR)/haskell-language-server-$(HLS_VERSION)/bin
16+
for f in $(wildcard lib/*/*) ; do \
17+
$(INSTALL) -vDm 755 $$f $(LIBDIR)/haskell-language-server-$(HLS_VERSION)/$$f ; \
18+
done
19+
for b in $(wildcard bin/*) ; do \
20+
$(INSTALL) -vDm 755 $$b $(LIBDIR)/haskell-language-server-$(HLS_VERSION)/$$b ; \
21+
done
22+
for h in $(wildcard haskell-language-server-*) ; do \
23+
$(SED) -e "s#@@EXE_DIR@@#$(LIBDIR)/haskell-language-server-$(HLS_VERSION)/bin/#" \
24+
$$h > $(BINDIR)/$$h ; \
25+
$(CHMOD) 755 $(BINDIR)/$$h ; \
26+
done
27+
28+
.PHONY: install

bindist/ghcs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
8.10.7

bindist/wrapper.in

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#!/bin/sh
2+
3+
exedir="@@EXE_DIR@@"
4+
executablename="@@EXE_NAME@@"
5+
GHC_VERSION="@@GHC_VERSION@@"
6+
7+
if [ -n "${GHC_LIBDIR}" ] ; then
8+
:
9+
elif [ -n "${GHC_BIN}" ] && command -v "${GHC_BIN}" >/dev/null ; then
10+
GHC_LIBDIR=$(${GHC_BIN} --print-libdir)
11+
ghc_ver="$(${GHC_BIN} --numeric-version)"
12+
if [ "${GHC_VERSION}" != "${ghc_ver}" ] ; then
13+
echo >&2 "Need GHC version ${GHC_VERSION}, got ${ghc_ver}... trying anyway"
14+
fi
15+
elif command -v ghc-${GHC_VERSION} >/dev/null ; then
16+
GHC_LIBDIR=$(ghc-${GHC_VERSION} --print-libdir)
17+
ghc_ver="$(ghc-${GHC_VERSION} --numeric-version)"
18+
if [ "${GHC_VERSION}" != "${ghc_ver}" ] ; then
19+
echo >&2 "Need GHC version ${GHC_VERSION}, got ${ghc_ver}... trying anyway"
20+
fi
21+
elif command -v ghc >/dev/null ; then
22+
GHC_LIBDIR=$(ghc --print-libdir)
23+
ghc_ver="$(ghc --numeric-version)"
24+
if [ "${GHC_VERSION}" != "${ghc_ver}" ] ; then
25+
echo >&2 "Need GHC version ${GHC_VERSION}, got ${ghc_ver}... trying anyway"
26+
fi
27+
else
28+
echo >&2 "Could not find a GHC installation!"
29+
echo >&2 "Consider setting GHC_LIBDIR to the top-level directory of GHC shipped libraries (version ${GHC_VERSION})"
30+
exit 42
31+
fi
32+
33+
if [ -n "$LD_LIBRARY_PATH" ] ; then
34+
LD_LIBRARY_PATH="$(for i in "${GHC_LIBDIR}"/* ; do [ -d "$i" ] && printf "%s" "$i:" ; done)$LD_LIBRARY_PATH"
35+
export LD_LIBRARY_PATH
36+
else
37+
LD_LIBRARY_PATH="$(for i in "${GHC_LIBDIR}"/* ; do [ -d "$i" ] && printf "%s" "$i:" ; done | sed 's/:$//')"
38+
export LD_LIBRARY_PATH
39+
fi
40+
41+
exec "${exedir}/${executablename}" ${1+"$@"}

0 commit comments

Comments
 (0)