@@ -9,94 +9,114 @@ BUILD_DIR="$1"
9CACHE_DIR="$2"
9CACHE_DIR="$2"
10ENV_DIR="$3"
10ENV_DIR="$3"
12−# Default configuration which you can change by setting environment variables
13−PREBUILT=${PREBUILT:-https://s3.amazonaws.com/heroku-ghc}
15−function export_env_dir() {
12+function speak (){
16− blacklist_regex="^(PATH|GIT_DIR|CPATH|CPPATH|LD_PRELOAD|LIBRARY_PATH)$"
13+ echo "-----> $(date -u '+%Y-%m-%d_%H:%M:%S') $1"
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)"
27−export_env_dir
16+speak "Starting..."
29−WORK_DIR=/app
18+BLACKLIST_REGEX="^(PATH|GIT_DIR|CPATH|CPPATH|LD_PRELOAD|LIBRARY_PATH)$"
30−PROFILE_PATH="$BUILD_DIR/.profile.d/haskell.sh"
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)"
29+cp -Rp "$BUILD_DIR/." "$WORK_DIR"
32−mkdir -p $WORK_DIR/vendor
30+mkdir -p "$WORK_DIR/vendor/bin"
33−mkdir -p $(dirname $PROFILE_PATH)
31+mkdir -p "$WORK_DIR/vendor/ghc-libs"
35−########## gmp #####################################################
33+PROFILE_DIR="$BUILD_DIR/.profile.d"
36−mkdir -p $WORK_DIR/vendor/ghc-libs
34+PROFILE_PATH="$PROFILE_DIR/stack.sh"
37−if [ ! -e $CACHE_DIR/libgmp-6.0.0a ]; then
35+mkdir -p "$PROFILE_DIR"
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
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/ \;
46# Usage: $ set-env key value
37# Usage: $ set-env key value
47function set-env (){
38function set-env (){
48− echo "export $1=$2" >> $PROFILE_PATH
39+ echo "export $1=$2" >> "$PROFILE_PATH"
51# Usage: $ set-default-env key value
42# Usage: $ set-default-env key value
52function set-default-env (){
43function set-default-env (){
53− echo "export $1=\${$1:-$2}" >> $PROFILE_PATH
44+ echo "export $1=\${$1:-$2}" >> "$PROFILE_PATH"
56export LANG=en_US.UTF-8
47export 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
58export LD_LIBRARY_PATH=$LIBRARY_PATH
49export LD_LIBRARY_PATH=$LIBRARY_PATH
59export PATH=$WORK_DIR/.local/bin:$WORK_DIR/vendor/bin:$PATH
50export PATH=$WORK_DIR/.local/bin:$WORK_DIR/vendor/bin:$PATH
51+export STACK_ROOT=$CACHE_DIR/.stack
61−########## stack ###################################################
53+########## gmp #####################################################
62−mkdir -p $WORK_DIR/vendor/bin
54+LIBGMP_VER=${LIBGMP_VER:-6.0.0a}
63−if [ ! -e $CACHE_DIR/stack ]; then
55+LIBGMP_URL=${LIBGMP_URL:-https://s3.amazonaws.com/heroku-ghc/heroku-libgmp-"$LIBGMP_VER".tar.gz}
64− echo "-----> Downloading Stack"
56+LIBGMP_DIR="$CACHE_DIR/libgmp-$LIBGMP_VER"
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
57+if [ ! -e "$LIBGMP_DIR" ]; then
66− cp $CACHE_DIR/stack $WORK_DIR/vendor/bin/stack
58+ speak "Installing libgmp-$LIBGMP_VER into cache"
67− chmod a+x $WORK_DIR/vendor/bin/stack
59+ mkdir -p "$LIBGMP_DIR"
68−else
60+ curl -# -L "$LIBGMP_URL" | tar xz -C "$LIBGMP_DIR"
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
74−
62+speak "Restoring $LIBGMP_VER files from cache"
75−if [ -e $CACHE_DIR/.stack ]; then
63+cp -Rp "$LIBGMP_DIR/ghc-libs/." "$WORK_DIR/vendor/ghc-libs"
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
76− echo "-----> Restoring .stack"
75+speak "Restoring stack-$STACK_VER"
77− rm -fr $WORK_DIR/.stack
76+cp "$STACK_EXE" "$WORK_DIR/vendor/bin/stack"
78− cp -R $CACHE_DIR/.stack $WORK_DIR
77+chmod a+x "$WORK_DIR/vendor/bin/stack"
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"
81########## project build ###########################################
85########## 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"
91+ mkdir -p "$SANDBOX_DIR"
83−echo "-----> Stack"
94+speak "Running stack"
96+# Makefile support (if you need other build tools than Stack that you need to use in conjunction)
84−cd $BUILD_DIR
97+if [ -f "$BUILD_DIR/Makefile" ]; then
98+ speak "Makefile detected"
85−stack setup
102+ stack setup
86−stack build --copy-bins
104+ stack build --ghc-options='-O2' --copy-bins
88−echo "-----> Caching .stack"
89−rm -fr $CACHE_DIR/.stack
90−cp -R $WORK_DIR/.stack $CACHE_DIR
92# Set context environment variables.
107# 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"
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"
95−set-default-env LIBRARY_PATH /app/vendor/ghc-libs:/usr/lib
118+speak "Caching .stack-work"
96−set-default-env LD_LIBRARY_PATH /app/vendor/ghc-libs:/usr/lib
119+rsync -avq "$WORK_DIR/.stack-work/" "$SANDBOX_DIR"
120+cp -Rp "$WORK_DIR/.stack-work" "$BUILD_DIR"
98−echo "-----> Making GHC binaries available to Heroku command line"
122+speak "Finished!"
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