aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/language/haskell.rb
diff options
context:
space:
mode:
authorGaëtan Lehmann2014-03-28 01:59:50 +0100
committerMike McQuaid2014-05-07 08:06:14 +0100
commit8539ec407f1f66922853298d1c48092f42f869f0 (patch)
treead7d07f0e151f29537fe1c006b08c60515e6fca0 /Library/Homebrew/language/haskell.rb
parent9414af689010548a8fff8d068eeea4707f2ce229 (diff)
downloadhomebrew-8539ec407f1f66922853298d1c48092f42f869f0.tar.bz2
git-annex: 5.20140421
installing git-annex with cabal-install is quite long and requires to install some heavy packages. It also has several external lib dependencies and needs a few configuration flags to build so it is quite difficult to install too. This formula should make it easy and quick to install with a bottle. The huge number of haskell dependencies is built within the formula and statically linked to git-annex. The haskell libraries built are discarded - cabal-install should be used instead of this package in order to keep them.
Diffstat (limited to 'Library/Homebrew/language/haskell.rb')
-rw-r--r--Library/Homebrew/language/haskell.rb68
1 files changed, 68 insertions, 0 deletions
diff --git a/Library/Homebrew/language/haskell.rb b/Library/Homebrew/language/haskell.rb
new file mode 100644
index 000000000..c4d964682
--- /dev/null
+++ b/Library/Homebrew/language/haskell.rb
@@ -0,0 +1,68 @@
+module Language
+ module Haskell
+ # module for formulas using cabal-install as build tool
+ module Cabal
+ def cabal_sandbox
+ pwd = Pathname.pwd
+ # force cabal to put its stuff here instead of the home directory by
+ # pretending the home is here. This also avoid to deal with many options
+ # to configure cabal. Note this is also useful with cabal sandbox to
+ # avoid touching ~/.cabal
+ home = ENV["HOME"]
+ ENV["HOME"] = pwd
+ # use cabal's sandbox feature if available
+ cabal_version = `cabal --version`[/[0-9.]+/].split('.').collect(&:to_i)
+ if (cabal_version <=> [1, 20]) > -1
+ system "cabal", "sandbox", "init"
+ cabal_sandbox_bin = pwd/".cabal-sandbox/bin"
+ else
+ # no or broken sandbox feature - just use the HOME trick
+ cabal_sandbox_bin = pwd/".cabal/bin"
+ end
+ # cabal may build useful tools that should be found in the PATH
+ mkdir_p cabal_sandbox_bin
+ path = ENV["PATH"]
+ ENV.prepend_path 'PATH', cabal_sandbox_bin
+ # update cabal package database
+ system "cabal", "update"
+ yield
+ # restore the environment
+ if (cabal_version <=> [1, 20]) > -1
+ system "cabal", "sandbox", "delete"
+ end
+ ENV["HOME"] = home
+ ENV["PATH"] = path
+ end
+
+ def cabal_install(*opts)
+ system "cabal", "install", "--jobs=#{ENV.make_jobs}", *opts
+ end
+
+ # install the tools passed in parameter and remove the packages that where
+ # used so they won't be in the way of the dependency solver for the main
+ # package. The tools are installed sequentially in order to make possible
+ # to install several tools that depends on each other
+ def cabal_install_tools(*opts)
+ opts.each {|t| cabal_install t}
+ rm_rf Dir[".cabal*/*packages.conf.d/"]
+ end
+
+ # remove the development files from the lib directory. cabal-install should
+ # be used instead to install haskell packages
+ def cabal_clean_lib
+ # a better approach may be needed here
+ rm_rf lib
+ end
+
+ def install_cabal_package
+ cabal_sandbox do
+ # the dependencies are built first and installed locally, and only the
+ # current package is actually installed in the destination dir
+ cabal_install "--only-dependencies"
+ cabal_install "--prefix=#{prefix}"
+ end
+ cabal_clean_lib
+ end
+ end
+ end
+end