summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--eclass/haskell-cabal.eclass78
1 files changed, 55 insertions, 23 deletions
diff --git a/eclass/haskell-cabal.eclass b/eclass/haskell-cabal.eclass
index 369deeb0c454..a6776dff01b8 100644
--- a/eclass/haskell-cabal.eclass
+++ b/eclass/haskell-cabal.eclass
@@ -1,6 +1,6 @@
# Copyright 1999-2011 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
-# $Header: /var/cvsroot/gentoo-x86/eclass/haskell-cabal.eclass,v 1.23 2011/03/13 20:15:14 slyfox Exp $
+# $Header: /var/cvsroot/gentoo-x86/eclass/haskell-cabal.eclass,v 1.24 2011/05/08 15:13:10 slyfox Exp $
#
# Original authors: Andres Loeh <kosmikus@gentoo.org>
# Duncan Coutts <dcoutts@gentoo.org>
@@ -46,6 +46,20 @@
inherit ghc-package multilib
+# @ECLASS-VARIABLE: CABAL_EXTRA_CONFIGURE_FLAGS
+# @DESCRIPTION:
+# User-specified additional parameters passed to 'setup configure'.
+# example: /etc/make.conf: CABAL_EXTRA_CONFIGURE_FLAGS=--enable-shared
+: ${CABAL_EXTRA_CONFIGURE_FLAGS:=}
+
+# @ECLASS-VARIABLE: GHC_BOOTSTRAP_FLAGS
+# @DESCRIPTION:
+# User-specified additional parameters for ghc when building
+# _only_ 'setup' binary bootstrap.
+# example: /etc/make.conf: GHC_BOOTSTRAP_FLAGS=-dynamic to make
+# linking 'setup' faster.
+: ${GHC_BOOTSTRAP_FLAGS:=}
+
HASKELL_CABAL_EXPF="pkg_setup src_compile src_test src_install"
case "${EAPI:-0}" in
@@ -125,21 +139,9 @@ cabal-version() {
# of this package itself.
_CABAL_VERSION_CACHE="${PV}"
elif [[ "${CABAL_FROM_GHC}" ]]; then
- # We can't assume there's a version of Cabal installed by ebuild as
- # this might be a first time install of GHC (for packages that
- # use the shipped Cabal like haskell-updater).
-
- # The user is likely to only have one version of Cabal, provided
- # by GHC. Note that dev-haskell/cabal can be a dummy package, only
- # using the version provided by GHC. If the user has another version
- # of Cabal too (more recent than the one GHC provides through
- # dev-haskell/cabal, or possibly older if he used an old
- # Cabal package) the most recent is used (expected to be the last
- # one in the ghc-pkg output).
- _CABAL_VERSION_CACHE="$(ghc-pkg field Cabal version | tail -n 1)"
-
- # Strip out the "version: " prefix
- _CABAL_VERSION_CACHE="${_CABAL_VERSION_CACHE#"version: "}"
+ local cabal_package=$(echo "$(ghc-libdir)"/Cabal-*)
+ # /path/to/ghc/Cabal-${VER} -> ${VER}
+ _CABAL_VERSION_CACHE="${cabal_package/*Cabal-/}"
else
# We ask portage, not ghc, so that we only pick up
# portage-installed cabal versions.
@@ -171,8 +173,20 @@ cabal-bootstrap() {
cabalpackage=Cabal
fi
einfo "Using cabal-$(cabal-version)."
- $(ghc-getghc) -package "${cabalpackage}" --make "${setupmodule}" -o setup \
- || die "compiling ${setupmodule} failed"
+
+ make_setup() {
+ $(ghc-getghc) -package "${cabalpackage}" --make "${setupmodule}" \
+ ${GHC_BOOTSTRAP_FLAGS} \
+ "$@" \
+ -o setup
+ }
+ if $(ghc-supports-shared-libraries); then
+ # some custom build systems might use external libraries,
+ # for which we don't have shared libs, so keep static fallback
+ make_setup -dynamic "$@" || make_setup "$@" || die "compiling ${setupmodule} failed"
+ else
+ make_setup "$@" || die "compiling ${setupmodule} failed"
+ fi
}
cabal-mksetup() {
@@ -232,6 +246,11 @@ cabal-configure() {
cabalconf="${cabalconf} --disable-library-for-ghci"
fi
+ # currently cabal does not respect CFLAGS and LDFLAGS on it's own (bug #333217)
+ # so translate LDFLAGS to ghc parameters (without filtering)
+ local flag
+ for flag in $LDFLAGS; do cabalconf="${cabalconf} --ghc-option=-optl$flag"; done
+
if version_is_at_least "1.4" "$(cabal-version)"; then
# disable executable stripping for the executables, as portage will
# strip by itself, and pre-stripping gives a QA warning.
@@ -254,6 +273,12 @@ cabal-configure() {
# rather than /usr/share/doc/${PF}/
# Because we can only set the datadir, not the docdir.
+ # We build shared version of our Cabal where ghc ships it's shared
+ # version of it. We will link ./setup as dynamic binary againt Cabal later.
+ [[ ${CATEGORY}/${PN} == "dev-haskell/cabal" ]] && \
+ $(ghc-supports-shared-libraries) && \
+ cabalconf="${cabalconf} --enable-shared"
+
./setup configure \
--ghc --prefix="${EPREFIX}"/usr \
--with-compiler="$(ghc-getghc)" \
@@ -265,6 +290,7 @@ cabal-configure() {
--datasubdir=${P}/ghc-$(ghc-version) \
${cabalconf} \
${CABAL_CONFIGURE_FLAGS} \
+ ${CABAL_EXTRA_CONFIGURE_FLAGS} \
"$@" || die "setup configure failed"
}
@@ -365,11 +391,6 @@ haskell-cabal_src_configure() {
cabal-bootstrap
- ghc_flags=""
- # currently cabal does not respect CFLAGS and LDFLAGS on it's own (bug #333217)
- # so translate LDFLAGS to ghc parameters (without filtering)
- for flag in $LDFLAGS; do ghc_flags="${ghc_flags} --ghc-option=-optl$flag"; done
-
cabal-configure $ghc_flags "$@"
popd > /dev/null
@@ -383,6 +404,17 @@ cabal_src_configure() {
# exported function: cabal-style bootstrap configure and compile
cabal_src_compile() {
+ # it's a common mistake when one bumps ebuild to EAPI="2" (and upper)
+ # and forgets to separate src_compile() to src_configure()/src_compile().
+ # Such error leads to default src_configure and we lose all passed flags.
+ if ! has "${EAPI:-0}" 0 1; then
+ local passed_flag
+ for passed_flag in "$@"; do
+ [[ ${passed_flag} == --flags=* ]] && \
+ eqawarn "Cabal option '${passed_flag}' has effect only in src_configure()"
+ done
+ fi
+
if ! cabal-is-dummy-lib; then
has src_configure ${HASKELL_CABAL_EXPF} || haskell-cabal_src_configure "$@"
cabal-build