Module: Language::Haskell::Cabal

Defined in:
Library/Homebrew/language/haskell.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



4
5
6
7
# File 'Library/Homebrew/language/haskell.rb', line 4

def self.included(base)
  # use llvm-gcc on Lion or below, as when building GHC)
  base.fails_with(:clang) if MacOS.version <= :lion
end

Instance Method Details

#cabal_configure(flags) ⇒ Object



61
62
63
# File 'Library/Homebrew/language/haskell.rb', line 61

def cabal_configure(flags)
  system "cabal", "configure", flags
end

#cabal_install(*args) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'Library/Homebrew/language/haskell.rb', line 47

def cabal_install(*args)
  # cabal hardcodes 64 as the maximum number of parallel jobs
  # https://github.com/Homebrew/legacy-homebrew/issues/49509
  make_jobs = (ENV.make_jobs > 64) ? 64 : ENV.make_jobs

  # cabal-install's dependency-resolution backtracking strategy can easily
  # need more than the default 2,000 maximum number of "backjumps," since
  # Hackage is a fast-moving, rolling-release target. The highest known
  # needed value by a formula at this time (February 2016) was 43,478 for
  # git-annex, so 100,000 should be enough to avoid most gratuitous
  # backjumps build failures.
  system "cabal", "install", "--jobs=#{make_jobs}", "--max-backjumps=100000", *args
end

#cabal_install_tools(*tools) ⇒ Object



65
66
67
68
69
70
71
72
# File 'Library/Homebrew/language/haskell.rb', line 65

def cabal_install_tools(*tools)
  # install tools sequentially, as some tools can depend on other tools
  tools.each { |tool| cabal_install tool }

  # unregister packages installed as dependencies for the tools, so
  # that they can't cause dependency conflicts for the main package
  rm_rf Dir[".cabal-sandbox/*packages.conf.d/"]
end

#cabal_sandbox(options = {}) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'Library/Homebrew/language/haskell.rb', line 9

def cabal_sandbox(options = {})
  pwd = Pathname.pwd
  home = options[:home] || pwd

  # pretend HOME is elsewhere, so that ~/.cabal is kept as untouched
  # as possible (except for ~/.cabal/setup-exe-cache)
  # https://github.com/haskell/cabal/issues/1234
  saved_home = ENV["HOME"]
  ENV["HOME"] = home

  system "cabal", "sandbox", "init"
  cabal_sandbox_bin = pwd/".cabal-sandbox/bin"
  mkdir_p cabal_sandbox_bin

  # make available any tools that will be installed in the sandbox
  saved_path = ENV["PATH"]
  ENV.prepend_path "PATH", cabal_sandbox_bin

  # avoid updating the cabal package database more than once
  system "cabal", "update" unless (home/".cabal/packages").exist?

  yield

  # remove the sandbox and all build products
  rm_rf [".cabal-sandbox", "cabal.sandbox.config", "dist"]

  # avoid installing any Haskell libraries, as a matter of policy
  rm_rf lib unless options[:keep_lib]

  # restore the environment
  ENV["HOME"] = saved_home
  ENV["PATH"] = saved_path
end

#cabal_sandbox_add_source(*args) ⇒ Object



43
44
45
# File 'Library/Homebrew/language/haskell.rb', line 43

def cabal_sandbox_add_source(*args)
  system "cabal", "sandbox", "add-source", *args
end

#install_cabal_package(*args) ⇒ Object



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'Library/Homebrew/language/haskell.rb', line 74

def install_cabal_package(*args)
  options = args[-1].is_a?(Hash) ? args.pop : {}

  cabal_sandbox do
    cabal_install_tools(*options[:using]) if options[:using]

    # if we have build flags, we have to pass them to cabal install to resolve the necessary
    # dependencies, and call cabal configure afterwards to set the flags again for compile
    flags = "--flags=#{options[:flags].join(" ")}" if options[:flags]

    args_and_flags = args
    args_and_flags << flags unless flags.nil?

    # install dependencies in the sandbox
    cabal_install "--only-dependencies", *args_and_flags

    # call configure if build flags are set
    cabal_configure flags unless flags.nil?

    # install the main package in the destination dir
    cabal_install "--prefix=#{prefix}", *args

    yield if block_given?
  end
end