| 1 | # Copyright 1999-2012 Gentoo Foundation |
1 | # Copyright 1999-2012 Gentoo Foundation |
| 2 | # Distributed under the terms of the GNU General Public License v2 |
2 | # Distributed under the terms of the GNU General Public License v2 |
| 3 | # $Header: /var/cvsroot/gentoo-x86/eclass/haskell-cabal.eclass,v 1.28 2012/03/09 22:01:11 slyfox Exp $ |
3 | # $Header: /var/cvsroot/gentoo-x86/eclass/haskell-cabal.eclass,v 1.29 2012/04/09 18:08:45 slyfox Exp $ |
| 4 | |
4 | |
| 5 | # @ECLASS: haskell-cabal.eclass |
5 | # @ECLASS: haskell-cabal.eclass |
| 6 | # @MAINTAINER: |
6 | # @MAINTAINER: |
| 7 | # Haskell herd <haskell@gentoo.org> |
7 | # Haskell herd <haskell@gentoo.org> |
| 8 | # @AUTHOR: |
8 | # @AUTHOR: |
| … | |
… | |
| 28 | # bin -- the package installs binaries |
28 | # bin -- the package installs binaries |
| 29 | # lib -- the package installs libraries |
29 | # lib -- the package installs libraries |
| 30 | # nocabaldep -- don't add dependency on cabal. |
30 | # nocabaldep -- don't add dependency on cabal. |
| 31 | # only used for packages that _must_ not pull the dependency |
31 | # only used for packages that _must_ not pull the dependency |
| 32 | # on cabal, but still use this eclass (e.g. haskell-updater). |
32 | # on cabal, but still use this eclass (e.g. haskell-updater). |
| 33 | # |
|
|
| 34 | # Dependencies on other cabal packages have to be specified |
|
|
| 35 | # correctly. |
|
|
| 36 | # |
|
|
| 37 | # Cabal libraries should usually be SLOTted with "${PV}". |
|
|
| 38 | # |
|
|
| 39 | # Many Cabal packages require S to be manually set. |
|
|
| 40 | # |
|
|
| 41 | # Conforming Cabal packages don't require any function definitions |
|
|
| 42 | # in the ebuild. |
|
|
| 43 | # |
|
|
| 44 | # Special flags to Cabal Configure can now be set by using |
|
|
| 45 | # CABAL_CONFIGURE_FLAGS |
|
|
| 46 | |
33 | |
| 47 | inherit ghc-package multilib |
34 | inherit ghc-package multilib |
| 48 | |
35 | |
| 49 | # @ECLASS-VARIABLE: CABAL_EXTRA_CONFIGURE_FLAGS |
36 | # @ECLASS-VARIABLE: CABAL_EXTRA_CONFIGURE_FLAGS |
| 50 | # @DESCRIPTION: |
37 | # @DESCRIPTION: |
| … | |
… | |
| 163 | cabal-bootstrap() { |
150 | cabal-bootstrap() { |
| 164 | local setupmodule |
151 | local setupmodule |
| 165 | local cabalpackage |
152 | local cabalpackage |
| 166 | if [[ -f "${S}/Setup.lhs" ]]; then |
153 | if [[ -f "${S}/Setup.lhs" ]]; then |
| 167 | setupmodule="${S}/Setup.lhs" |
154 | setupmodule="${S}/Setup.lhs" |
| 168 | else |
|
|
| 169 | if [[ -f "${S}/Setup.hs" ]]; then |
155 | elif [[ -f "${S}/Setup.hs" ]]; then |
| 170 | setupmodule="${S}/Setup.hs" |
156 | setupmodule="${S}/Setup.hs" |
| 171 | else |
157 | else |
| 172 | die "No Setup.lhs or Setup.hs found" |
158 | die "No Setup.lhs or Setup.hs found" |
| 173 | fi |
|
|
| 174 | fi |
159 | fi |
| 175 | |
160 | |
| 176 | # We build the setup program using the latest version of |
161 | # We build the setup program using the latest version of |
| 177 | # cabal that we have installed |
162 | # cabal that we have installed |
| 178 | if version_is_at_least "6.4" "$(ghc-version)"; then |
|
|
| 179 | cabalpackage=Cabal-$(cabal-version) |
163 | cabalpackage=Cabal-$(cabal-version) |
| 180 | else |
|
|
| 181 | # older ghc's don't support package versioning |
|
|
| 182 | cabalpackage=Cabal |
|
|
| 183 | fi |
|
|
| 184 | einfo "Using cabal-$(cabal-version)." |
164 | einfo "Using cabal-$(cabal-version)." |
| 185 | |
165 | |
| 186 | make_setup() { |
166 | make_setup() { |
| 187 | set -- -package "${cabalpackage}" --make "${setupmodule}" \ |
167 | set -- -package "${cabalpackage}" --make "${setupmodule}" \ |
| 188 | ${GHC_BOOTSTRAP_FLAGS} \ |
168 | ${GHC_BOOTSTRAP_FLAGS} \ |
| … | |
… | |
| 210 | fi |
190 | fi |
| 211 | |
191 | |
| 212 | rm -f "${setupdir}"/Setup.{lhs,hs} |
192 | rm -f "${setupdir}"/Setup.{lhs,hs} |
| 213 | |
193 | |
| 214 | echo 'import Distribution.Simple; main = defaultMainWithHooks defaultUserHooks' \ |
194 | echo 'import Distribution.Simple; main = defaultMainWithHooks defaultUserHooks' \ |
| 215 | > $setupdir/Setup.hs |
195 | > $setupdir/Setup.hs || die "failed to create default Setup.hs" |
| 216 | } |
196 | } |
| 217 | |
197 | |
| 218 | cabal-hscolour() { |
198 | cabal-hscolour() { |
| 219 | set -- hscolour "$@" |
199 | set -- hscolour "$@" |
| 220 | echo ./setup "$@" |
200 | echo ./setup "$@" |
| … | |
… | |
| 272 | # currently cabal does not respect CFLAGS and LDFLAGS on it's own (bug #333217) |
252 | # currently cabal does not respect CFLAGS and LDFLAGS on it's own (bug #333217) |
| 273 | # so translate LDFLAGS to ghc parameters (without filtering) |
253 | # so translate LDFLAGS to ghc parameters (without filtering) |
| 274 | local flag |
254 | local flag |
| 275 | for flag in $LDFLAGS; do cabalconf="${cabalconf} --ghc-option=-optl$flag"; done |
255 | for flag in $LDFLAGS; do cabalconf="${cabalconf} --ghc-option=-optl$flag"; done |
| 276 | |
256 | |
| 277 | if version_is_at_least "1.4" "$(cabal-version)"; then |
|
|
| 278 | # disable executable stripping for the executables, as portage will |
257 | # disable executable stripping for the executables, as portage will |
| 279 | # strip by itself, and pre-stripping gives a QA warning. |
258 | # strip by itself, and pre-stripping gives a QA warning. |
| 280 | # cabal versions previous to 1.4 does not strip executables, and does |
259 | # cabal versions previous to 1.4 does not strip executables, and does |
| 281 | # not accept the flag. |
260 | # not accept the flag. |
| 282 | # this fixes numerous bugs, amongst them; |
261 | # this fixes numerous bugs, amongst them; |
| 283 | # bug #251881, bug #251882, bug #251884, bug #251886, bug #299494 |
262 | # bug #251881, bug #251882, bug #251884, bug #251886, bug #299494 |
| 284 | cabalconf="${cabalconf} --disable-executable-stripping" |
263 | cabalconf="${cabalconf} --disable-executable-stripping" |
| 285 | fi |
|
|
| 286 | |
264 | |
| 287 | if version_is_at_least "1.2.0" "$(cabal-version)"; then |
|
|
| 288 | cabalconf="${cabalconf} --docdir=${EPREFIX}/usr/share/doc/${PF}" |
265 | cabalconf="${cabalconf} --docdir=${EPREFIX}/usr/share/doc/${PF}" |
| 289 | # As of Cabal 1.2, configure is quite quiet. For diagnostic purposes |
266 | # As of Cabal 1.2, configure is quite quiet. For diagnostic purposes |
| 290 | # it's better if the configure chatter is in the build logs: |
267 | # it's better if the configure chatter is in the build logs: |
| 291 | cabalconf="${cabalconf} --verbose" |
268 | cabalconf="${cabalconf} --verbose" |
| 292 | fi |
|
|
| 293 | # Note: with Cabal-1.1.6.x we do not have enough control |
|
|
| 294 | # to put the docs into the right place. They're currently going |
|
|
| 295 | # into /usr/share/${P}/ghc-x.y/doc/ |
|
|
| 296 | # rather than /usr/share/doc/${PF}/ |
|
|
| 297 | # Because we can only set the datadir, not the docdir. |
|
|
| 298 | |
269 | |
| 299 | # We build shared version of our Cabal where ghc ships it's shared |
270 | # We build shared version of our Cabal where ghc ships it's shared |
| 300 | # version of it. We will link ./setup as dynamic binary againt Cabal later. |
271 | # version of it. We will link ./setup as dynamic binary againt Cabal later. |
| 301 | [[ ${CATEGORY}/${PN} == "dev-haskell/cabal" ]] && \ |
272 | [[ ${CATEGORY}/${PN} == "dev-haskell/cabal" ]] && \ |
| 302 | $(ghc-supports-shared-libraries) && \ |
273 | $(ghc-supports-shared-libraries) && \ |
| … | |
… | |
| 335 | ./setup "$@" || die "setup copy failed" |
306 | ./setup "$@" || die "setup copy failed" |
| 336 | |
307 | |
| 337 | # cabal is a bit eager about creating dirs, |
308 | # cabal is a bit eager about creating dirs, |
| 338 | # so remove them if they are empty |
309 | # so remove them if they are empty |
| 339 | rmdir "${ED}/usr/bin" 2> /dev/null |
310 | rmdir "${ED}/usr/bin" 2> /dev/null |
| 340 | |
|
|
| 341 | # GHC 6.4 has a bug in get/setPermission and Cabal 1.1.1 has |
|
|
| 342 | # no workaround. |
|
|
| 343 | # set the +x permission on executables |
|
|
| 344 | if [[ -d "${ED}/usr/bin" ]] ; then |
|
|
| 345 | chmod +x "${ED}/usr/bin/"* |
|
|
| 346 | fi |
|
|
| 347 | # TODO: do we still need this? |
|
|
| 348 | } |
311 | } |
| 349 | |
312 | |
| 350 | cabal-pkg() { |
313 | cabal-pkg() { |
| 351 | # This does not actually register since we're using true instead |
314 | # This does not actually register since we're using true instead |
| 352 | # of ghc-pkg. So it just leaves the .installed-pkg-config and we can |
315 | # of ghc-pkg. So it just leaves the .conf file and we can |
| 353 | # register that ourselves (if it exists). |
316 | # register that ourselves (if it exists). |
| 354 | local result |
|
|
| 355 | local err |
|
|
| 356 | |
317 | |
| 357 | if [[ -n ${CABAL_HAS_LIBRARIES} ]]; then |
318 | if [[ -n ${CABAL_HAS_LIBRARIES} ]]; then |
| 358 | if version_is_at_least "1.2.0" "$(cabal-version)"; then |
|
|
| 359 | # Newer cabal can generate a package conf for us: |
319 | # Newer cabal can generate a package conf for us: |
| 360 | ./setup register --gen-pkg-config="${T}/${P}.conf" |
320 | ./setup register --gen-pkg-config="${T}/${P}.conf" |
| 361 | ghc-setup-pkg "${T}/${P}.conf" |
321 | ghc-setup-pkg "${T}/${P}.conf" |
| 362 | ghc-install-pkg |
322 | ghc-install-pkg |
| 363 | else |
|
|
| 364 | # With older cabal we have to hack it by replacing its ghc-pkg |
|
|
| 365 | # with true and then just picking up the .installed-pkg-config |
|
|
| 366 | # file and registering that ourselves (if it exists). |
|
|
| 367 | sed -i "s|$(ghc-getghcpkg)|$(type -P true)|" .setup-config |
|
|
| 368 | ./setup register || die "setup register failed" |
|
|
| 369 | if [[ -f .installed-pkg-config ]]; then |
|
|
| 370 | ghc-setup-pkg .installed-pkg-config |
|
|
| 371 | ghc-install-pkg |
|
|
| 372 | else |
|
|
| 373 | die "setup register has not generated a package configuration file" |
|
|
| 374 | fi |
|
|
| 375 | fi |
|
|
| 376 | fi |
323 | fi |
| 377 | } |
324 | } |
| 378 | |
325 | |
| 379 | # Some cabal libs are bundled along with some versions of ghc |
326 | # Some cabal libs are bundled along with some versions of ghc |
| 380 | # eg filepath-1.0 comes with ghc-6.6.1 |
327 | # eg filepath-1.0 comes with ghc-6.6.1 |
| … | |
… | |
| 392 | } |
339 | } |
| 393 | |
340 | |
| 394 | # exported function: check if cabal is correctly installed for |
341 | # exported function: check if cabal is correctly installed for |
| 395 | # the currently active ghc (we cannot guarantee this with portage) |
342 | # the currently active ghc (we cannot guarantee this with portage) |
| 396 | haskell-cabal_pkg_setup() { |
343 | haskell-cabal_pkg_setup() { |
| 397 | ghc-package_pkg_setup |
|
|
| 398 | if [[ -z "${CABAL_BOOTSTRAP}" && -z "${CABAL_FROM_GHC}" ]] && ! ghc-sanecabal "${CABAL_MIN_VERSION}"; then |
344 | if [[ -z "${CABAL_BOOTSTRAP}" && -z "${CABAL_FROM_GHC}" ]] && ! ghc-sanecabal "${CABAL_MIN_VERSION}"; then |
| 399 | eerror "The package dev-haskell/cabal is not correctly installed for" |
345 | eerror "The package dev-haskell/cabal is not correctly installed for" |
| 400 | eerror "the currently active version of ghc ($(ghc-version)). Please" |
346 | eerror "the currently active version of ghc ($(ghc-version)). Please" |
| 401 | eerror "run ghc-updater or haskell-updater or re-build dev-haskell/cabal." |
347 | eerror "run haskell-updater or re-build dev-haskell/cabal." |
| 402 | die "cabal is not correctly installed" |
348 | die "cabal is not correctly installed" |
| 403 | fi |
349 | fi |
| 404 | if [[ -z "${CABAL_HAS_BINARIES}" ]] && [[ -z "${CABAL_HAS_LIBRARIES}" ]]; then |
350 | if [[ -z "${CABAL_HAS_BINARIES}" ]] && [[ -z "${CABAL_HAS_LIBRARIES}" ]]; then |
| 405 | eerror "QA: Neither bin nor lib are in CABAL_FEATURES." |
351 | eqawarn "QA Notice: Neither bin nor lib are in CABAL_FEATURES." |
| 406 | fi |
352 | fi |
| 407 | if [[ -n "${CABAL_UNKNOWN}" ]]; then |
353 | if [[ -n "${CABAL_UNKNOWN}" ]]; then |
| 408 | ewarn "Unknown entry in CABAL_FEATURES: ${CABAL_UNKNOWN}" |
354 | eqawarn "QA Notice: Unknown entry in CABAL_FEATURES: ${CABAL_UNKNOWN}" |
| 409 | fi |
355 | fi |
| 410 | if cabal-is-dummy-lib; then |
356 | if cabal-is-dummy-lib; then |
| 411 | einfo "${P} is included in ghc-${CABAL_CORE_LIB_GHC_PV}, nothing to install." |
357 | einfo "${P} is included in ghc-${CABAL_CORE_LIB_GHC_PV}, nothing to install." |
| 412 | fi |
358 | fi |
| 413 | } |
359 | } |
| 414 | |
360 | |
| 415 | haskell-cabal_src_configure() { |
361 | haskell-cabal_src_configure() { |
| 416 | if ! cabal-is-dummy-lib; then |
362 | cabal-is-dummy-lib && return |
|
|
363 | |
| 417 | pushd "${S}" > /dev/null |
364 | pushd "${S}" > /dev/null |
| 418 | |
365 | |
| 419 | cabal-bootstrap |
366 | cabal-bootstrap |
| 420 | |
367 | |
| 421 | cabal-configure "$@" |
368 | cabal-configure "$@" |
| 422 | |
369 | |
| 423 | popd > /dev/null |
370 | popd > /dev/null |
| 424 | fi |
|
|
| 425 | } |
371 | } |
| 426 | |
372 | |
| 427 | # exported function: nice alias |
373 | # exported function: nice alias |
| 428 | cabal_src_configure() { |
374 | cabal_src_configure() { |
| 429 | haskell-cabal_src_configure "$@" |
375 | haskell-cabal_src_configure "$@" |
| … | |
… | |
| 436 | # Such error leads to default src_configure and we lose all passed flags. |
382 | # Such error leads to default src_configure and we lose all passed flags. |
| 437 | if ! has "${EAPI:-0}" 0 1; then |
383 | if ! has "${EAPI:-0}" 0 1; then |
| 438 | local passed_flag |
384 | local passed_flag |
| 439 | for passed_flag in "$@"; do |
385 | for passed_flag in "$@"; do |
| 440 | [[ ${passed_flag} == --flags=* ]] && \ |
386 | [[ ${passed_flag} == --flags=* ]] && \ |
| 441 | eqawarn "Cabal option '${passed_flag}' has effect only in src_configure()" |
387 | eqawarn "QA Notice: Cabal option '${passed_flag}' has effect only in src_configure()" |
| 442 | done |
388 | done |
| 443 | fi |
389 | fi |
| 444 | |
390 | |
| 445 | if ! cabal-is-dummy-lib; then |
391 | cabal-is-dummy-lib && return |
|
|
392 | |
| 446 | has src_configure ${HASKELL_CABAL_EXPF} || haskell-cabal_src_configure "$@" |
393 | has src_configure ${HASKELL_CABAL_EXPF} || haskell-cabal_src_configure "$@" |
| 447 | cabal-build |
394 | cabal-build |
| 448 | |
395 | |
| 449 | if [[ -n "${CABAL_USE_HADDOCK}" ]] && use doc; then |
396 | if [[ -n "${CABAL_USE_HADDOCK}" ]] && use doc; then |
| 450 | if [[ -n "${CABAL_USE_HSCOLOUR}" ]] && use hscolour; then |
397 | if [[ -n "${CABAL_USE_HSCOLOUR}" ]] && use hscolour; then |
| 451 | # hscolour and haddock |
398 | # hscolour and haddock |
| 452 | cabal-hscolour-haddock |
399 | cabal-hscolour-haddock |
| 453 | else |
|
|
| 454 | # just haddock |
|
|
| 455 | cabal-haddock |
|
|
| 456 | fi |
|
|
| 457 | else |
400 | else |
|
|
401 | # just haddock |
|
|
402 | cabal-haddock |
|
|
403 | fi |
|
|
404 | else |
| 458 | if [[ -n "${CABAL_USE_HSCOLOUR}" ]] && use hscolour; then |
405 | if [[ -n "${CABAL_USE_HSCOLOUR}" ]] && use hscolour; then |
| 459 | # just hscolour |
406 | # just hscolour |
| 460 | cabal-hscolour |
407 | cabal-hscolour |
| 461 | fi |
|
|
| 462 | fi |
408 | fi |
| 463 | fi |
409 | fi |
| 464 | } |
410 | } |
| 465 | |
411 | |
| 466 | haskell-cabal_src_compile() { |
412 | haskell-cabal_src_compile() { |
| … | |
… | |
| 488 | |
434 | |
| 489 | # exported function: cabal-style copy and register |
435 | # exported function: cabal-style copy and register |
| 490 | cabal_src_install() { |
436 | cabal_src_install() { |
| 491 | has "${EAPI:-0}" 0 1 2 && ! use prefix && EPREFIX= |
437 | has "${EAPI:-0}" 0 1 2 && ! use prefix && EPREFIX= |
| 492 | |
438 | |
| 493 | if cabal-is-dummy-lib; then |
439 | if ! cabal-is-dummy-lib; then |
| 494 | # create a dummy local package conf file for the sake of ghc-updater |
|
|
| 495 | local ghc_confdir_with_prefix="$(ghc-confdir)" |
|
|
| 496 | # remove EPREFIX |
|
|
| 497 | dodir ${ghc_confdir_with_prefix#${EPREFIX}} |
|
|
| 498 | echo '[]' > "${D}/$(ghc-confdir)/$(ghc-localpkgconf)" |
|
|
| 499 | else |
|
|
| 500 | cabal-copy |
440 | cabal-copy |
| 501 | cabal-pkg |
441 | cabal-pkg |
| 502 | |
|
|
| 503 | if [[ -n "${CABAL_USE_HADDOCK}" ]] && use doc; then |
|
|
| 504 | if ! version_is_at_least "1.1.6" "$(cabal-version)"; then |
|
|
| 505 | dohtml -r dist/doc/html/* |
|
|
| 506 | fi |
|
|
| 507 | fi |
442 | fi |
| 508 | fi |
443 | |
|
|
444 | # create a dummy local package conf file for haskell-updater |
|
|
445 | # if it does not exist (dummy libraries and binaries w/o libraries) |
|
|
446 | local ghc_confdir_with_prefix="$(ghc-confdir)" |
|
|
447 | # remove EPREFIX |
|
|
448 | dodir ${ghc_confdir_with_prefix#${EPREFIX}} |
|
|
449 | local conf_file="${D}/$(ghc-confdir)/$(ghc-localpkgconf)" |
|
|
450 | [[ -e $conf_file ]] || echo '[]' > "$conf_file" || die |
| 509 | } |
451 | } |
| 510 | |
452 | |
| 511 | haskell-cabal_src_install() { |
453 | haskell-cabal_src_install() { |
| 512 | pushd "${S}" > /dev/null |
454 | pushd "${S}" > /dev/null |
| 513 | |
455 | |