@@ -9,48 +9,37 @@ 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+BLACKLIST_REGEX="^(PATH|GIT_DIR|CPATH|CPPATH|LD_PRELOAD|LIBRARY_PATH)$"
17+if [ -d "$ENV_DIR" ]; then
18+ speak "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
2825
2926WORK_DIR=/app
30−PROFILE_PATH="$BUILD_DIR/.profile.d/haskell.sh"
27+mkdir -p "$WORK_DIR/vendor"
28+mkdir -p "$WORK_DIR/vendor/bin"
29+mkdir -p "$WORK_DIR/vendor/ghc-libs"
3130
32−mkdir -p $WORK_DIR/vendor
33−mkdir -p $(dirname $PROFILE_PATH)
34−
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/ \;
31+PROFILE_DIR="$BUILD_DIR/.profile.d"
32+PROFILE_PATH="$PROFILE_DIR/stack.sh"
33+mkdir -p "$PROFILE_DIR"
4534
4635# Usage: $ set-env key value
4736function set-env (){
48− echo "export $1=$2" >> $PROFILE_PATH
37+ echo "export $1=$2" >> "$PROFILE_PATH"
4938}
5039
5140# Usage: $ set-default-env key value
5241function set-default-env (){
53− echo "export $1=\${$1:-$2}" >> $PROFILE_PATH
42+ echo "export $1=\${$1:-$2}" >> "$PROFILE_PATH"
5443}
5544
5645export LANG=en_US.UTF-8
@@ -58,45 +47,53 @@ export LIBRARY_PATH=$WORK_DIR/vendor/ghc-libs:/usr/lib:$LIBRARY_PATH
5847export LD_LIBRARY_PATH=$LIBRARY_PATH
5948export PATH=$WORK_DIR/.local/bin:$WORK_DIR/vendor/bin:$PATH
6049
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
50+########## gmp #####################################################
51+LIBGMP_VER=${LIBGMP_VER:-6.0.0a}
52+LIBGMP_URL=${LIBGMP_URL:-https://s3.amazonaws.com/heroku-ghc/heroku-libgmp-"$LIBGMP_VER".tar.gz}
53+LIBGMP_DIR="$CACHE_DIR/libgmp-$LIBGMP_VER"
54+if [ ! -e "$LIBGMP_DIR" ]; then
55+ speak "Installing libgmp-$LIBGMP_VER into cache"
56+ mkdir -p "$LIBGMP_DIR"
57+ curl -# -L "$LIBGMP_URL" | tar xz -C "$LIBGMP_DIR"
7358fi
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
59+speak "Restoring $LIBGMP_VER files from cache"
60+cp -ur "$LIBGMP_DIR/ghc-libs/" "$WORK_DIR/vendor/ghc-libs/"
61+
62+########## 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+if [ ! -e "$STACK_EXE" ]; then
67+ speak "Downloading stack-$STACK_VER"
68+ curl -# -L "STACK_URL" | gunzip > "STACK_EXE"
69+fi
70+speak "Restoring stack-$STACK_VER"
71+cp -u "$STACK_EXE" "$WORK_DIR/vendor/bin/stack"
72+chmod a+x "$WORK_DIR/vendor/bin/stack"
73+
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"
7979fi
8080
8181########## project build ###########################################
82−
83−echo "-----> Stack"
84−cd $BUILD_DIR
82+speak "Running stack"
83+cd "$BUILD_DIR"
8584stack setup
8685stack build --copy-bins
8786
88−echo "-----> Caching .stack"
89−rm -fr $CACHE_DIR/.stack
90−cp -R $WORK_DIR/.stack $CACHE_DIR
87+speak "Caching .stack"
88+cp -ur "$WORK_DIR/.stack" "$CACHE_DIR"
9189
9290# Set context environment variables.
9391set-env PATH "/app/.local/bin:$PATH"
94−
9592set-default-env LIBRARY_PATH /app/vendor/ghc-libs:/usr/lib
9693set-default-env LD_LIBRARY_PATH /app/vendor/ghc-libs:/usr/lib
9794
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
95+speak "Making stack binaries available"
96+mkdir -p "$BUILD_DIR/vendor"
97+mkdir -p "$BUILD_DIR/.local"
98+mv "$WORK_DIR/vendor/ghc-libs" "$BUILD_DIR/vendor"
99+mv "$WORK_DIR/.local/bin" "$BUILD_DIR/.local"