Skip to content

Commit 504494c

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

File tree

5 files changed

+141
-0
lines changed

5 files changed

+141
-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: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
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+
AWK := awk
19+
20+
STORE_DIR := store
21+
BINDIST_BASE_DIR := out/bindist
22+
BINDIST_OUT_DIR := $(BINDIST_BASE_DIR)/haskell-language-server-$(HLS_VERSION)
23+
24+
CABAL_ARGS ?= --store-dir=$(ROOT_DIR)/$(STORE_DIR)
25+
CABAL_INSTALL_ARGS ?= --overwrite-policy=always --install-method=copy --installdir=$(ROOT_DIR)/out
26+
27+
hls: bindist/ghcs
28+
for ghc in $(shell cat bindist/ghcs) ; do \
29+
$(MAKE) GHC_VERSION=`echo $$ghc | $(AWK) -F ',' '{ print $$1 }'` PROJECT_FILE=`echo $$ghc | $(AWK) -F ',' '{ print $$2 }'` hls-ghc ; \
30+
done
31+
32+
hls-ghc:
33+
@if test -z "$(GHC_VERSION)" ; then echo >&2 "GHC_VERSION is not set" ; false ; fi
34+
@if test -z "$(PROJECT_FILE)" ; then echo >&2 "PROJECT_FILE is not set" ; false ; fi
35+
$(CABAL) $(CABAL_ARGS) v2-install --project-file=$(PROJECT_FILE) -w ghc-$(GHC_VERSION) $(CABAL_INSTALL_ARGS)
36+
37+
bindist:
38+
for ghc in $(shell cat bindist/ghcs) ; do \
39+
$(MAKE) GHC_VERSION=$$ghc bindist-ghc ; \
40+
done
41+
$(SED) -e "s/@@HLS_VERSION@@/$(HLS_VERSION)/" \
42+
bindist/Makefile.in > $(BINDIST_OUT_DIR)/Makefile
43+
cd $(BINDIST_BASE_DIR) ; $(TAR) caf $(ROOT_DIR)/out/haskell-language-server-$(HLS_VERSION).tar.xz haskell-language-server-$(HLS_VERSION)
44+
45+
bindist-ghc:
46+
if test -z "$(GHC_VERSION)" ; then echo >&2 "GHC_VERSION is not set" ; false ; fi
47+
$(MKDIR) -p $(BINDIST_OUT_DIR)/bin
48+
$(MKDIR) -p $(BINDIST_OUT_DIR)/lib/$(GHC_VERSION)
49+
$(SED) -e "s/@@EXE_NAME@@/haskell-language-server-$(GHC_VERSION)/" -e "s/@@GHC_VERSION@@/$(GHC_VERSION)/" \
50+
bindist/wrapper.in > $(BINDIST_OUT_DIR)/haskell-language-server-$(GHC_VERSION)
51+
$(SED) -e 's/@@EXE_NAME@@/haskell-language-server-wrapper/' -e "s/@@GHC_VERSION@@/$(GHC_VERSION)/" \
52+
bindist/wrapper.in > $(BINDIST_OUT_DIR)/haskell-language-server-wrapper
53+
$(CHMOD) 755 $(BINDIST_OUT_DIR)/haskell-language-server-$(GHC_VERSION)
54+
$(CHMOD) 755 $(BINDIST_OUT_DIR)/haskell-language-server-wrapper
55+
$(INSTALL) -vDm 755 out/haskell-language-server $(BINDIST_OUT_DIR)/bin/haskell-language-server-$(GHC_VERSION)
56+
$(PATCHELF) --set-rpath \$$ORIGIN/../lib/$(GHC_VERSION) $(BINDIST_OUT_DIR)/bin/haskell-language-server-$(GHC_VERSION)
57+
$(INSTALL) -vDm 755 out/haskell-language-server-wrapper $(BINDIST_OUT_DIR)/bin/haskell-language-server-wrapper
58+
$(PATCHELF) --set-rpath \$$ORIGIN/../lib/$(GHC_VERSION) $(BINDIST_OUT_DIR)/bin/haskell-language-server-wrapper
59+
$(FIND) $(STORE_DIR) -type f -name '*.so' -execdir install -vDm 755 {} $(ROOT_DIR)/$(BINDIST_OUT_DIR)/lib/$(GHC_VERSION)/{} \;
60+
$(FIND) $(ROOT_DIR)/$(BINDIST_OUT_DIR)/lib/$(GHC_VERSION) -type f -name '*.so' -execdir $(PATCHELF) --set-rpath \$$ORIGIN {} \;
61+
62+
63+
clean:
64+
rm -rf $(BINDIST_BASE_DIR)
65+
66+
clean-all:
67+
rm -rf $(BINDIST_BASE_DIR) $(STORE_DIR)
68+
69+
.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: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
8.10.7,cabal.project
2+
9.0.2,cabal-ghc90.project
3+
9.2.1,cabal-ghc921.project

bindist/wrapper.in

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
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+
else
10+
if [ -n "${GHC_BIN}" ] && command -v "${GHC_BIN}" >/dev/null ; then
11+
ghc_bin=${GHC_BIN}
12+
elif command -v ghc-${GHC_VERSION} >/dev/null ; then
13+
ghc_bin=ghc-${GHC_VERSION}
14+
elif command -v ghc >/dev/null ; then
15+
ghc_bin=ghc
16+
else
17+
echo >&2 "Could not find a GHC installation!"
18+
echo >&2 "Consider setting GHC_LIBDIR to the top-level directory of GHC shipped libraries (version ${GHC_VERSION})"
19+
exit 42
20+
fi
21+
22+
GHC_LIBDIR=$(${ghc_bin} --print-libdir)
23+
ghc_ver="$(${ghc_bin} --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+
unset ghc_ver ghc_bin
28+
fi
29+
30+
if [ -n "$LD_LIBRARY_PATH" ] ; then
31+
LD_LIBRARY_PATH="$(for i in "${GHC_LIBDIR}"/* ; do [ -d "$i" ] && printf "%s" "$i:" ; done)$LD_LIBRARY_PATH"
32+
export LD_LIBRARY_PATH
33+
else
34+
LD_LIBRARY_PATH="$(for i in "${GHC_LIBDIR}"/* ; do [ -d "$i" ] && printf "%s" "$i:" ; done | sed 's/:$//')"
35+
export LD_LIBRARY_PATH
36+
fi
37+
38+
exec "${exedir}/${executablename}" ${1+"$@"}

0 commit comments

Comments
 (0)