@@ -9,94 +9,114 @@ BUILD_DIR="$1"
99CACHE_DIR="$2"
1010ENV_DIR="$3"
1111
12−# Default configuration which you can change by setting environment variables
13−PREBUILT=${PREBUILT:-https://s3.amazonaws.com/heroku-ghc}
14−
15−function export_env_dir() {
16− blacklist_regex="^(PATH|GIT_DIR|CPATH|CPPATH|LD_PRELOAD|LIBRARY_PATH)$"
17− if [ -d "$ENV_DIR" ]; then
18− echo "-----> Exporting config vars"
19− for e in $(ls "$ENV_DIR"); do
20− echo "$e" | grep -qvE "$blacklist_regex" &&
21− export "$e=$(cat $ENV_DIR/$e)"
22− :
23− done
24− fi
12+function speak (){
13+ echo "-----> $(date -u '+%Y-%m-%d_%H:%M:%S') $1"
2514}
2615
27−export_env_dir
16+speak "Starting..."
2817
29−WORK_DIR=/app
30−PROFILE_PATH="$BUILD_DIR/.profile.d/haskell.sh"
18+BLACKLIST_REGEX="^(PATH|GIT_DIR|CPATH|CPPATH|LD_PRELOAD|LIBRARY_PATH)$"
19+if [ -d "$ENV_DIR" ]; then
20+ speak "Exporting config vars"
21+ for e in $(ls "$ENV_DIR"); do
22+ echo "$e" | grep -qvE "$BLACKLIST_REGEX" &&
23+ export "$e=$(cat $ENV_DIR/$e)"
24+ :
25+ done
26+fi
3127
32−mkdir -p $WORK_DIR/vendor
33−mkdir -p $(dirname $PROFILE_PATH)
28+WORK_DIR=/app
29+cp -Rp "$BUILD_DIR/." "$WORK_DIR"
30+mkdir -p "$WORK_DIR/vendor/bin"
31+mkdir -p "$WORK_DIR/vendor/ghc-libs"
3432
35−########## gmp #####################################################
36−mkdir -p $WORK_DIR/vendor/ghc-libs
37−if [ ! -e $CACHE_DIR/libgmp-6.0.0a ]; then
38− PREBUILT_LIB_URL=$PREBUILT/heroku-libgmp-6.0.0a.tar.gz # contains ghc-libs directories
39− echo "-----> Installing prebuilt libgmp-6.0.0a into cache"
40− mkdir -p $CACHE_DIR/libgmp-6.0.0a
41− curl -# -L "$PREBUILT_LIB_URL" | tar xz -C $CACHE_DIR/libgmp-6.0.0a
42−fi
43−echo "-----> Restoring libgmp-6.0.0a files from cache"
44−find $CACHE_DIR/libgmp-6.0.0a/ghc-libs/ -exec cp -rP '{}' $WORK_DIR/vendor/ghc-libs/ \;
33+PROFILE_DIR="$BUILD_DIR/.profile.d"
34+PROFILE_PATH="$PROFILE_DIR/stack.sh"
35+mkdir -p "$PROFILE_DIR"
4536
4637# Usage: $ set-env key value
4738function set-env (){
48− echo "export $1=$2" >> $PROFILE_PATH
39+ echo "export $1=$2" >> "$PROFILE_PATH"
4940}
5041
5142# Usage: $ set-default-env key value
5243function set-default-env (){
53− echo "export $1=\${$1:-$2}" >> $PROFILE_PATH
44+ echo "export $1=\${$1:-$2}" >> "$PROFILE_PATH"
5445}
5546
5647export LANG=en_US.UTF-8
57−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
5849export LD_LIBRARY_PATH=$LIBRARY_PATH
5950export PATH=$WORK_DIR/.local/bin:$WORK_DIR/vendor/bin:$PATH
51+export STACK_ROOT=$CACHE_DIR/.stack
6052
61−########## stack ###################################################
62−mkdir -p $WORK_DIR/vendor/bin
63−if [ ! -e $CACHE_DIR/stack ]; then
64− echo "-----> Downloading Stack"
65− curl -# -L https://github.com/commercialhaskell/stack/releases/download/v0.1.3.1/stack-0.1.3.1-x86_64-linux.gz | gunzip > $CACHE_DIR/stack
66− cp $CACHE_DIR/stack $WORK_DIR/vendor/bin/stack
67− chmod a+x $WORK_DIR/vendor/bin/stack
68−else
69− echo "-----> Restoring Stack"
70− rm -f $WORK_DIR/vendor/bin/stack
71− cp $CACHE_DIR/stack $WORK_DIR/vendor/bin/stack
72− chmod a+x $WORK_DIR/vendor/bin/stack
53+########## gmp #####################################################
54+LIBGMP_VER=${LIBGMP_VER:-6.0.0a}
55+LIBGMP_URL=${LIBGMP_URL:-https://s3.amazonaws.com/heroku-ghc/heroku-libgmp-"$LIBGMP_VER".tar.gz}
56+LIBGMP_DIR="$CACHE_DIR/libgmp-$LIBGMP_VER"
57+if [ ! -e "$LIBGMP_DIR" ]; then
58+ speak "Installing libgmp-$LIBGMP_VER into cache"
59+ mkdir -p "$LIBGMP_DIR"
60+ curl -# -L "$LIBGMP_URL" | tar xz -C "$LIBGMP_DIR"
7361fi
74−
75−if [ -e $CACHE_DIR/.stack ]; then
76− echo "-----> Restoring .stack"
77− rm -fr $WORK_DIR/.stack
78− cp -R $CACHE_DIR/.stack $WORK_DIR
62+speak "Restoring $LIBGMP_VER files from cache"
63+cp -Rp "$LIBGMP_DIR/ghc-libs/." "$WORK_DIR/vendor/ghc-libs"
64+
65+########## stack exe ###############################################
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"
70+if [ ! -e "$STACK_EXE" ]; then
71+ speak "Downloading stack-$STACK_VER"
72+ mkdir -p "$STACK_DIR"
73+ curl -# -L "$STACK_URL" | tar xz -C "$STACK_DIR" --strip-components=1
74+fi
75+speak "Restoring stack-$STACK_VER"
76+cp "$STACK_EXE" "$WORK_DIR/vendor/bin/stack"
77+chmod a+x "$WORK_DIR/vendor/bin/stack"
78+
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 ###########################################
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
8293
83−echo "-----> Stack"
84−cd $BUILD_DIR
85−stack setup
86−stack build --copy-bins
87−
88−echo "-----> Caching .stack"
89−rm -fr $CACHE_DIR/.stack
90−cp -R $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
91106
92107# Set context environment variables.
93−set-env PATH "/app/.local/bin:$PATH"
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"
111+
112+speak "Making stack binaries available"
113+mkdir -p "$BUILD_DIR/vendor"
114+mkdir -p "$BUILD_DIR/.local"
115+mv "$WORK_DIR/vendor/ghc-libs" "$BUILD_DIR/vendor"
116+mv "$WORK_DIR/.local/bin" "$BUILD_DIR/.local"
94117
95−set-default-env LIBRARY_PATH /app/vendor/ghc-libs:/usr/lib
96−set-default-env LD_LIBRARY_PATH /app/vendor/ghc-libs:/usr/lib
118+speak "Caching .stack-work"
119+rsync -avq "$WORK_DIR/.stack-work/" "$SANDBOX_DIR"
120+cp -Rp "$WORK_DIR/.stack-work" "$BUILD_DIR"
97121
98−echo "-----> Making GHC binaries available to Heroku command line"
99−mkdir -p $BUILD_DIR/vendor
100−mkdir -p $BUILD_DIR/.local
101−mv $WORK_DIR/vendor/ghc-libs $BUILD_DIR/vendor
102−mv $WORK_DIR/.local/bin $BUILD_DIR/.local
122+speak "Finished!"