diff --git a/README.md b/README.md index 9184154..e54d2d0 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,34 @@ -# Heroku buildpack: Haskell +# Heroku Buildpack: Haskell This is a [Heroku buildpack](http://devcenter.heroku.com/articles/buildpacks) -for Haskell apps. It uses cabal-1.14.0. +for Haskell apps. It uses GHC 7.4.1 and cabal-1.16.0.1. + +## Demo + +A demo is online here: + +http://haskell-buildpack-demo.herokuapp.com/ + +The demo repo is here: + +https://github.com/pufuwozu/haskell-buildpack-demo ## Usage $ ls Procfile app.cabal src - $ heroku create --stack=cedar --buildpack https://github.com/luciferous/heroku-buildpack-haskell.git + $ heroku create --stack=cedar --buildpack https://github.com/pufuwozu/heroku-buildpack-haskell.git $ git push heroku master ... + -----> Heroku receiving push + -----> Fetching custom git buildpack... done -----> Haskell app detected - -----> Building app with cabal - -----> Running: cabal install - + -----> Downloading GHC + ######################################################################## 100.0% + -----> Downloading Cabal + ######################################################################## 100.0% + -----> Setting up ghc-pkg + ... diff --git a/bin/compile b/bin/compile index 60b549a..730c67a 100755 --- a/bin/compile +++ b/bin/compile @@ -7,42 +7,59 @@ set -eo pipefail BUILD_DIR=$1 CACHE_DIR=$2 -cd $BUILD_DIR +FIXED_HOME=/app mkdir -p $CACHE_DIR -cp -R $CACHE_DIR/ghc ghc &> /dev/null || true -cp -R $CACHE_DIR/cabal .cabal &> /dev/null || true - -if [ ! -e ghc ]; then - GHC_URL="http://s3.amazonaws.com/heroku-buildpack-haskell/ghc.tar.gz" +if [ ! -e $CACHE_DIR/ghc ]; then + GHC_URL="http://informatik.uni-kiel.de/~sad/ghc.tar.gz" echo "-----> Downloading GHC" - curl -# --max-time 120 -L "$GHC_URL" | tar xz + curl -# --max-time 120 -L "$GHC_URL" | tar xz -C $CACHE_DIR +fi + +# Restore GHC registry if available +if [ -e $CACHE_DIR/dotghc ]; then + rm -rf $FIXED_HOME/app/.ghc + mv $CACHE_DIR/dotghc $FIXED_HOME/.ghc fi -if [ ! -e .cabal ]; then - CABAL_URL="http://s3.amazonaws.com/heroku-buildpack-haskell/cabal.tar.gz" - echo "-----> Bundling Cabal" - curl -# --max-time 120 -L "$CABAL_URL" | tar xz +# Fix directory +mv $CACHE_DIR/ghc $FIXED_HOME + +# Restore Cabal cache or download an empty environemt +if [ -e $CACHE_DIR/cabal ]; then + rm -rf $FIXED_HOME/.cabal + mv $CACHE_DIR/cabal $FIXED_HOME/.cabal +elif [ ! -e $FIXED_HOME/.cabal ]; then + CABAL_URL="http://informatik.uni-kiel.de/~sad/cabal.tar.gz" + echo "-----> Downloading Cabal" + curl -# --max-time 120 -L "$CABAL_URL" | tar xz -C $FIXED_HOME fi -mkdir -p bin -ln -s ghc/bin/ghc bin/ghc -ln -s .cabal/bin/cabal bin/cabal +# Set LD_LIBRARAY_PATH and link essential libraries +mkdir -p $FIXED_HOME/usr/lib +ln -s /usr/lib/libgmp.so.3.5.2 $FIXED_HOME/usr/lib/libgmp.so +export LD_LIBRARY_PATH=$FIXED_HOME/usr/lib -mkdir -p lib -ln -s /usr/lib/libgmp.so.3 lib/libgmp.so +# Set PATH +export PATH=$FIXED_HOME/ghc/bin:$FIXED_HOME/.cabal/bin$PATH -ghc/bin/ghc-pkg describe base > base.conf -sed -i "s#ld-options:#ld-options: -L`pwd`/lib#" -ghc/bin/ghc-pkg update base.conf -rm base.conf +echo "-----> Updating Cabal" +cabal update -.cabal/bin/cabal update -.cabal/bin/cabal install +echo "-----> Release the hounds! Installing application" +cd $BUILD_DIR +cabal install -j5 --disable-library-profiling --disable-executable-profiling --disable-shared -rm -rf $CACHE_DIR/ghc -cp -R ghc $CACHE_DIR/ghc +echo "-----> Caching Cabal packages" +echo $FIXED_HOME/.ghc +shopt -s extglob +rm $FIXED_HOME/.cabal/bin/!(cabal|happy) +mv $FIXED_HOME/.cabal $CACHE_DIR/cabal +mv $FIXED_HOME/ghc $CACHE_DIR/ghc +mv $FIXED_HOME/.ghc $CACHE_DIR/dotghc -rm -rf $CACHE_DIR/cabal -cp -R .cabal $CACHE_DIR/cabal +echo "Cache dir size:" +du -ms $CACHE_DIR +echo "Build dir size:" +du -ms $BUILD_DIR diff --git a/bin/detect b/bin/detect index 014359c..71bf985 100755 --- a/bin/detect +++ b/bin/detect @@ -1,6 +1,6 @@ -#!/usr/bin/env bash +#!/bin/bash if test -n "$(find "$1" -maxdepth 1 -name '*.cabal' -print -quit)" -then echo Haskell -else echo no; exit 1 +then echo Haskell; exit 0 +else exit 1 fi diff --git a/bin/release b/bin/release index 7c14edd..0d130af 100755 --- a/bin/release +++ b/bin/release @@ -1,9 +1,3 @@ #!/bin/sh -$BUILD_DIR=$1 - -cat < $HOME/ghc/lib/ghc-7.4.1/ghc-usage.txt +echo "" > $HOME/ghc/lib/ghc-7.4.1/ghci-usage.txt + +# Remove duplicate libs +find $HOME/ghc/lib -name "*_p.a" -delete +find $HOME/ghc/lib -name "*.p_hi" -delete +find $HOME/ghc/lib -name "*.dyn_hi" -delete +find $HOME/ghc/lib -name "*HS*.so" -delete +find $HOME/ghc/lib -name "*HS*.o" -delete +find $HOME/ghc/lib -name "*_debug.a" -delete + +# Don't need man or doc +rm -rf $HOME/ghc/share + +# Strip binaries +strip --strip-unneeded $HOME/ghc/lib/ghc-7.4.1/{run,}ghc + +export PATH=$PATH:$HOME/ghc/bin + # ldconfig for linker hack -$HOME/ghc/bin/ghc-pkg describe base > base.package.conf +ghc-pkg describe base > base.package.conf sed -i "s/ld-options:/ld-options:\ -L\/app\/usr\/lib/" base.package.conf -$HOME/ghc/bin/ghc-pkg update base.package.conf - -# haskell-platform (disabled because it requires opengl) -#curl --silent http://lambda.haskell.org/platform/download/2011.4.0.0/haskell-platform-2011.4.0.0.tar.gz|tar xz -#cd haskell-platform-2011.4.0.0/ - -# cabal -curl --silent http://www.haskell.org/cabal/release/cabal-1.14.0/Cabal-1.14.0.tar.gz|tar xz -cd Cabal-1.14.0/ -$HOME/ghc/bin/ghc --make Setup -./Setup configure --user --with-ghc=$HOME/ghc/bin/ghc -./Setup build -./Setup install -cd .. +ghc-pkg update base.package.conf # cabal-install -curl --silent http://www.haskell.org/cabal/release/cabal-install-0.14.0/cabal-install-0.14.0.tar.gz|tar xz -cd cabal-install-0.14.0/ -PATH=$PATH:$HOME/ghc/bin sh bootstrap.sh +curl --silent http://hackage.haskell.org/packages/archive/cabal-install/1.16.0.1/cabal-install-1.16.0.1.tar.gz|tar xz +cd cabal-install-1.16.0.1/ +sh bootstrap.sh cd .. +export PATH=$PATH:$HOME/.cabal + +# Install a binary that Yesod needs separately +cabal update +cabal install happy +find $HOME/.cabal -name "*HS*.o" -delete +rm -rf $HOME/.cabal/{config,share,packages,logs} + tar cvzf ghc.tar.gz ghc tar cvzf cabal.tar.gz .cabal diff --git a/tmp/README.md b/tmp/README.md deleted file mode 100644 index e69de29..0000000 diff --git a/tmp/index.php b/tmp/index.php deleted file mode 100755 index e69de29..0000000