@@ -9,114 +9,94 @@ BUILD_DIR="$1"
99CACHE_DIR="$2"
1010ENV_DIR="$3"
1111
12−function speak (){
13− echo "-----> $(date -u '+%Y-%m-%d_%H:%M:%S') $1"
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
1425}
1526
16−speak "Starting..."
17−
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
27+export_env_dir
2728
2829WORK_DIR=/app
29−cp -Rp "$BUILD_DIR/." "$WORK_DIR"
30−mkdir -p "$WORK_DIR/vendor/bin"
31−mkdir -p "$WORK_DIR/vendor/ghc-libs"
30+PROFILE_PATH="$BUILD_DIR/.profile.d/haskell.sh"
3231
33−PROFILE_DIR="$BUILD_DIR/.profile.d"
34−PROFILE_PATH="$PROFILE_DIR/stack.sh"
35−mkdir -p "$PROFILE_DIR"
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/ \;
3645
3746# Usage: $ set-env key value
3847function set-env (){
39− echo "export $1=$2" >> "$PROFILE_PATH"
48+ echo "export $1=$2" >> $PROFILE_PATH
4049}
4150
4251# Usage: $ set-default-env key value
4352function set-default-env (){
44− echo "export $1=\${$1:-$2}" >> "$PROFILE_PATH"
53+ echo "export $1=\${$1:-$2}" >> $PROFILE_PATH
4554}
4655
4756export LANG=en_US.UTF-8
48−export LIBRARY_PATH=$WORK_DIR/vendor/ghc-libs:$WORK_DIR/vendor/lib:/usr/lib:$LIBRARY_PATH
57+export LIBRARY_PATH=$WORK_DIR/vendor/ghc-libs:/usr/lib:$LIBRARY_PATH
4958export LD_LIBRARY_PATH=$LIBRARY_PATH
5059export PATH=$WORK_DIR/.local/bin:$WORK_DIR/vendor/bin:$PATH
51−export STACK_ROOT=$CACHE_DIR/.stack
5260
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"
61−fi
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
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
7473fi
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"
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
8379fi
8480
8581########## 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
9382
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
83+echo "-----> Stack"
84+cd $BUILD_DIR
85+stack setup
86+stack build --copy-bins
10687
107−# Set context environment variables.
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"
88+echo "-----> Caching .stack"
89+rm -fr $CACHE_DIR/.stack
90+cp -R $WORK_DIR/.stack $CACHE_DIR
11191
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"
92+# Set context environment variables.
93+set-env PATH "/app/.local/bin:$PATH"
11794
118−speak "Caching .stack-work"
119−rsync -avq "$WORK_DIR/.stack-work/" "$SANDBOX_DIR"
120−cp -Rp "$WORK_DIR/.stack-work" "$BUILD_DIR"
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
12197
122−speak "Finished!"
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