@@ -9,114 +9,94 @@ 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}
12−function speak (){
15+function export_env_dir() {
13− echo "-----> $(date -u '+%Y-%m-%d_%H:%M:%S') $1"
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)"
16−speak "Starting..."
27+export_env_dir
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)"
28WORK_DIR=/app
29WORK_DIR=/app
29−cp -Rp "$BUILD_DIR/." "$WORK_DIR"
30+PROFILE_PATH="$BUILD_DIR/.profile.d/haskell.sh"
30−mkdir -p "$WORK_DIR/vendor/bin"
31−mkdir -p "$WORK_DIR/vendor/ghc-libs"
33−PROFILE_DIR="$BUILD_DIR/.profile.d"
32+mkdir -p $WORK_DIR/vendor
34−PROFILE_PATH="$PROFILE_DIR/stack.sh"
33+mkdir -p $(dirname $PROFILE_PATH)
35−mkdir -p "$PROFILE_DIR"
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
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/ \;
37# Usage: $ set-env key value
46# Usage: $ set-env key value
38function set-env (){
47function set-env (){
39− echo "export $1=$2" >> "$PROFILE_PATH"
48+ echo "export $1=$2" >> $PROFILE_PATH
42# Usage: $ set-default-env key value
51# Usage: $ set-default-env key value
43function set-default-env (){
52function set-default-env (){
44− echo "export $1=\${$1:-$2}" >> "$PROFILE_PATH"
53+ echo "export $1=\${$1:-$2}" >> $PROFILE_PATH
47export LANG=en_US.UTF-8
56export 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
49export LD_LIBRARY_PATH=$LIBRARY_PATH
58export LD_LIBRARY_PATH=$LIBRARY_PATH
50export PATH=$WORK_DIR/.local/bin:$WORK_DIR/vendor/bin:$PATH
59export PATH=$WORK_DIR/.local/bin:$WORK_DIR/vendor/bin:$PATH
51−export STACK_ROOT=$CACHE_DIR/.stack
53−########## gmp #####################################################
61+########## stack ###################################################
54−LIBGMP_VER=${LIBGMP_VER:-6.0.0a}
62+mkdir -p $WORK_DIR/vendor/bin
55−LIBGMP_URL=${LIBGMP_URL:-https://s3.amazonaws.com/heroku-ghc/heroku-libgmp-"$LIBGMP_VER".tar.gz}
63+if [ ! -e $CACHE_DIR/stack ]; then
56−LIBGMP_DIR="$CACHE_DIR/libgmp-$LIBGMP_VER"
64+ echo "-----> Downloading Stack"
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"
62−speak "Restoring $LIBGMP_VER files from cache"
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}
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
68−STACK_DIR="$CACHE_DIR/stack-$STACK_VER"
66+ cp $CACHE_DIR/stack $WORK_DIR/vendor/bin/stack
69−STACK_EXE="$STACK_DIR/stack"
67+ chmod a+x $WORK_DIR/vendor/bin/stack
70−if [ ! -e "$STACK_EXE" ]; then
68+else
71− speak "Downloading stack-$STACK_VER"
69+ echo "-----> Restoring Stack"
72− mkdir -p "$STACK_DIR"
70+ rm -f $WORK_DIR/vendor/bin/stack
73− curl -# -L "$STACK_URL" | tar xz -C "$STACK_DIR" --strip-components=1
71+ cp $CACHE_DIR/stack $WORK_DIR/vendor/bin/stack
72+ chmod a+x $WORK_DIR/vendor/bin/stack
75−speak "Restoring stack-$STACK_VER"
74+
76−cp "$STACK_EXE" "$WORK_DIR/vendor/bin/stack"
75+if [ -e $CACHE_DIR/.stack ]; then
77−chmod a+x "$WORK_DIR/vendor/bin/stack"
76+ echo "-----> Restoring .stack"
78−
77+ rm -fr $WORK_DIR/.stack
79−########## stack vars ##############################################
78+ cp -R $CACHE_DIR/.stack $WORK_DIR
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"
85########## project build ###########################################
81########## 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"
94−speak "Running stack"
83+echo "-----> Stack"
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
84+cd $BUILD_DIR
98− speak "Makefile detected"
102− stack setup
85+stack setup
104− stack build --ghc-options='-O2' --copy-bins
86+stack build --copy-bins
107−# Set context environment variables.
88+echo "-----> Caching .stack"
108−set-env PATH "$WORK_DIR/.local/bin:$WORK_DIR/vendor/bin:\$PATH"
89+rm -fr $CACHE_DIR/.stack
109−set-default-env LIBRARY_PATH "$WORK_DIR/vendor/ghc-libs:$WORK_DIR/vendor/lib:/usr/lib"
90+cp -R $WORK_DIR/.stack $CACHE_DIR
110−set-default-env LD_LIBRARY_PATH "$WORK_DIR/vendor/ghc-libs:$WORK_DIR/vendor/lib:/usr/lib"
112−speak "Making stack binaries available"
92+# Set context environment variables.
113−mkdir -p "$BUILD_DIR/vendor"
93+set-env PATH "/app/.local/bin:$PATH"
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"
118−speak "Caching .stack-work"
95+set-default-env LIBRARY_PATH /app/vendor/ghc-libs:/usr/lib
119−rsync -avq "$WORK_DIR/.stack-work/" "$SANDBOX_DIR"
96+set-default-env LD_LIBRARY_PATH /app/vendor/ghc-libs:/usr/lib
120−cp -Rp "$WORK_DIR/.stack-work" "$BUILD_DIR"
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