summaryrefslogtreecommitdiff
path: root/eclass
diff options
context:
space:
mode:
authorSergei Trofimovich <slyfox@gentoo.org>2016-09-02 10:26:43 +0100
committerSergei Trofimovich <slyfox@gentoo.org>2016-09-02 10:29:51 +0100
commitb3b64a95b9653963a2868278fd0130858a9eb9f0 (patch)
tree7228fae8f1f598deff28975b5f5a041ef879bc13 /eclass
parentmedia-video/vlc: add patches to build with ffmpeg3, bug #574788 (diff)
downloadgentoo-b3b64a95b9653963a2868278fd0130858a9eb9f0.tar.gz
gentoo-b3b64a95b9653963a2868278fd0130858a9eb9f0.tar.bz2
gentoo-b3b64a95b9653963a2868278fd0130858a9eb9f0.zip
haskell-cabal.eclass: unleash full parallelism of parallel ghc
I've explored scalability of 'ghc --make -j' a bit in https://ghc.haskell.org/trac/ghc/ticket/9221 Some takeaways: - never specify -j<N> with N > CPU. garbage collector threads waste kernel time running sched_yield() - GHC allocates A Lot: large nursery decreases GC interruptions. We fix it with '-A256M' - for large nursery enabling work-stealing makes GC finish faster on each collection cycle. We fix it with -qb0 While at it move HCFLAGS setup after parallel defaults. That allows user to override defaults with own HCFLAGS. Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
Diffstat (limited to 'eclass')
-rw-r--r--eclass/haskell-cabal.eclass20
1 files changed, 8 insertions, 12 deletions
diff --git a/eclass/haskell-cabal.eclass b/eclass/haskell-cabal.eclass
index c1a13300abb0..94ef7f35ad75 100644
--- a/eclass/haskell-cabal.eclass
+++ b/eclass/haskell-cabal.eclass
@@ -372,24 +372,20 @@ cabal-configure() {
cabalconf+=($(cabal-constraint "ghc"))
fi
+ # parallel on all available cores
+ if ghc-supports-parallel-make; then
+ # It should have been just -j$(makeopts_jobs)
+ # but GHC does not yet have nice defaults:
+ # https://ghc.haskell.org/trac/ghc/ticket/9221#comment:57
+ cabalconf+=(--ghc-options="-j$(makeopts_jobs) +RTS -A256M -qb0 -RTS")
+ fi
+
local option
for option in ${HCFLAGS}
do
cabalconf+=(--ghc-option="$option")
done
- # parallel on all available cores
- if ghc-supports-parallel-make; then
- local max_jobs=$(makeopts_jobs)
-
- # limit to very small value, as parallelism
- # helps slightly, but makes things severely worse
- # when amount of threads is Very Large.
- [[ ${max_jobs} -gt 4 ]] && max_jobs=4
-
- cabalconf+=(--ghc-option=-j"$max_jobs")
- fi
-
# Building GHCi libs on ppc64 causes "TOC overflow".
if use ppc64; then
cabalconf+=(--disable-library-for-ghci)