@@ -13,6 +13,8 @@ function speak (){
1313 echo "-----> $(date -u '+%Y-%m-%d_%H:%M:%S') $1"
1414}
1515
16+speak "Starting..."
17+
1618BLACKLIST_REGEX="^(PATH|GIT_DIR|CPATH|CPPATH|LD_PRELOAD|LIBRARY_PATH)$"
1719if [ -d "$ENV_DIR" ]; then
1820 speak "Exporting config vars"
@@ -24,7 +26,7 @@ if [ -d "$ENV_DIR" ]; then
2426fi
2527
2628WORK_DIR=/app
27−mkdir -p "$WORK_DIR/vendor"
29+cp -Rp "$BUILD_DIR/." "$WORK_DIR"
2830mkdir -p "$WORK_DIR/vendor/bin"
2931mkdir -p "$WORK_DIR/vendor/ghc-libs"
3032
@@ -43,9 +45,10 @@ function set-default-env (){
4345}
4446
4547export LANG=en_US.UTF-8
46−export LIBRARY_PATH=$WORK_DIR/vendor/ghc-libs:/usr/lib:$LIBRARY_PATH
48+export LIBRARY_PATH=$WORK_DIR/vendor/ghc-libs:$WORK_DIR/vendor/lib:/usr/lib:$LIBRARY_PATH
4749export LD_LIBRARY_PATH=$LIBRARY_PATH
4850export PATH=$WORK_DIR/.local/bin:$WORK_DIR/vendor/bin:$PATH
51+export STACK_ROOT=$CACHE_DIR/.stack
4952
5053########## gmp #####################################################
5154LIBGMP_VER=${LIBGMP_VER:-6.0.0a}
@@ -57,43 +60,63 @@ if [ ! -e "$LIBGMP_DIR" ]; then
5760 curl -# -L "$LIBGMP_URL" | tar xz -C "$LIBGMP_DIR"
5861fi
5962speak "Restoring $LIBGMP_VER files from cache"
60−cp -ur "$LIBGMP_DIR/ghc-libs/" "$WORK_DIR/vendor/ghc-libs/"
63+cp -Rp "$LIBGMP_DIR/ghc-libs/." "$WORK_DIR/vendor/ghc-libs"
6164
6265########## stack exe ###############################################
63−STACK_VER=${STACK_VER:-0.1.3.1}
64−STACK_URL=${STACK_URL:-https://github.com/commercialhaskell/stack/releases/download/v"$STACK_VER"/stack-"$STACK_VER"-x86_64-linux.gz}
65−STACK_EXE="$CACHE_DIR/stack-$STACK_VER"
66+STACK_VER=${STACK_VER:-2.1.3}
67+STACK_URL=${STACK_URL:-https://github.com/commercialhaskell/stack/releases/download/v"$STACK_VER"/stack-"$STACK_VER"-linux-x86_64.tar.gz}
68+STACK_DIR="$CACHE_DIR/stack-$STACK_VER"
69+STACK_EXE="$STACK_DIR/stack"
6670if [ ! -e "$STACK_EXE" ]; then
6771 speak "Downloading stack-$STACK_VER"
68− curl -# -L "STACK_URL" | gunzip > "STACK_EXE"
72+ mkdir -p "$STACK_DIR"
73+ curl -# -L "$STACK_URL" | tar xz -C "$STACK_DIR" --strip-components=1
6974fi
7075speak "Restoring stack-$STACK_VER"
71−cp -u "$STACK_EXE" "$WORK_DIR/vendor/bin/stack"
76+cp "$STACK_EXE" "$WORK_DIR/vendor/bin/stack"
7277chmod a+x "$WORK_DIR/vendor/bin/stack"
7378
74−########## stack dir ###############################################
75−STACK_DIR="$CACHE_DIR/.stack"
76−if [ -e "$STACK_DIR" ]; then
77− speak "Restoring .stack"
78− cp -ur "$STACK_DIR" "$WORK_DIR"
79+########## stack vars ##############################################
80+if [ -d "$ENV_DIR" ]; then
81+ speak "Substituting stack vars"
82+ perl -p -i -e 's/\{\{([^}]+)\}\}/defined$ENV{$1}?$ENV{$1}:$&/eg' "$BUILD_DIR/stack.yaml"
7983fi
8084
8185########## project build ###########################################
82−speak "Running stack"
83−cd "$BUILD_DIR"
84−stack setup
85−stack build --copy-bins
86+SANDBOX_DIR="$CACHE_DIR/.stack-work"
87+if [ -e "$SANDBOX_DIR" ]; then
88+ speak "Restoring .stack-work"
89+ cp -Rp "$SANDBOX_DIR" "$WORK_DIR"
90+else
91+ mkdir -p "$SANDBOX_DIR"
92+fi
8693
87−speak "Caching .stack"
88−cp -ur "$WORK_DIR/.stack" "$CACHE_DIR"
94+speak "Running stack"
95+cd "$WORK_DIR"
96+# Makefile support (if you need other build tools than Stack that you need to use in conjunction)
97+if [ -f "$BUILD_DIR/Makefile" ]; then
98+ speak "Makefile detected"
99+ make
100+ make install
101+else
102+ stack setup
103+ stack clean
104+ stack build --ghc-options='-O2' --copy-bins
105+fi
89106
90107# Set context environment variables.
91−set-env PATH "/app/.local/bin:$PATH"
92−set-default-env LIBRARY_PATH /app/vendor/ghc-libs:/usr/lib
93−set-default-env LD_LIBRARY_PATH /app/vendor/ghc-libs:/usr/lib
108+set-env PATH "$WORK_DIR/.local/bin:$WORK_DIR/vendor/bin:\$PATH"
109+set-default-env LIBRARY_PATH "$WORK_DIR/vendor/ghc-libs:$WORK_DIR/vendor/lib:/usr/lib"
110+set-default-env LD_LIBRARY_PATH "$WORK_DIR/vendor/ghc-libs:$WORK_DIR/vendor/lib:/usr/lib"
94111
95112speak "Making stack binaries available"
96113mkdir -p "$BUILD_DIR/vendor"
97114mkdir -p "$BUILD_DIR/.local"
98115mv "$WORK_DIR/vendor/ghc-libs" "$BUILD_DIR/vendor"
99116mv "$WORK_DIR/.local/bin" "$BUILD_DIR/.local"
117+
118+speak "Caching .stack-work"
119+rsync -avq "$WORK_DIR/.stack-work/" "$SANDBOX_DIR"
120+cp -Rp "$WORK_DIR/.stack-work" "$BUILD_DIR"
121+
122+speak "Finished!"