Summary: | app-text/pandoc ebuild (and other haskell ebuilds) doesn't respect CC and CXX | ||
---|---|---|---|
Product: | Gentoo Linux | Reporter: | . <dev.rindeal+gentoo> |
Component: | Current packages | Assignee: | Gentoo's Haskell Language team <haskell> |
Status: | CONFIRMED --- | ||
Severity: | normal | ||
Priority: | Normal | ||
Version: | unspecified | ||
Hardware: | AMD64 | ||
OS: | Linux | ||
Whiteboard: | |||
Package list: | Runtime testing required: | --- |
Description
.
2015-07-29 12:07:05 UTC
Yes, ghc currently uses gcc from 'ghc --info' (usually ${CTARGET}-gcc). It should be possible to set nonstandard gcc by --with-gcc= flag. I'll try to experiment with it in ::haskell overlay first. This looks like the right symptom, current "effect" is broken pandoc deps. I only had a few Haskell packages installed, "emerge pandoc" wants to install 100+ Haskell deps and upgrade everything. About halfway through it fails and I get the "please run haskell-updater" error. Running haskell-upater fails some time later with the same error message (ie, please run haskell-updater).
Right now it is stuck on dev-haskell/network in the above error loop; since it doesn't respect CC/CFLAGS on the cli, I had to modify some environment stuff to get this far:
# cat /etc/portage/env/cabal-extra.conf
CABAL_EXTRA_CONFIGURE_FLAGS="--with-cc=x86_64-pc-linux-gnu-gcc"
but it just fails later running haskell-updater:
...
* ghc-pkg check: 'checking for other broken packages:'
* Detected outdated packages: dev-haskell/convertible:0 dev-haskell/hdbc:2
* ERROR: dev-haskell/network-2.6.2.1::gentoo failed (configure phase):
* //==-- Please, run 'haskell-updater' to fix outdated packages --==//
and fails the same way on convertible and hdbc:
# haskell-updater -u --no-deep
Running haskell-updater-1.2.9 using GHC 7.10.2
* Executable: /usr/bin/ghc
* Library directory: /usr/lib64/ghc-7.10.2
* Package manager (PM): portage
Searching for packages installed with a different version of GHC.
Found the following old packages:
* dev-haskell/convertible:0
* dev-haskell/hdbc:2
emerge --oneshot --keep-going --complete-graph --quiet dev-haskell/convertible:0 dev-haskell/hdbc:2
* IMPORTANT: 2 news items need reading for repository 'gentoo'.
* Use eselect news read to view new items.
>>> Verifying ebuild manifests
>>> Emerging (1 of 2) dev-haskell/convertible-1.1.0.0-r1::gentoo
>>> Failed to emerge dev-haskell/convertible-1.1.0.0-r1, Log file:
>>> '/var/log/portage/dev-haskell:convertible-1.1.0.0-r1:20151008-212835.log'
*** Resuming merge...
* emerge --keep-going: dev-haskell/hdbc-2.4.0.1 dropped because it requires
* >=dev-haskell/convertible-1.1.0.0:=, >=dev-haskell/convertible-1.1.0.0:=
* Error messages for package dev-haskell/convertible-1.1.0.0-r1:
What's the workaround for this? Do I need a live chicken?
Answer: 1) remove old stuff manually, haskell-network fails 2) configure this: in /etc/portage/package.env/x86_64-pc-linux-gnu: dev-lang/ghc cabal-extra.conf plain-flags.conf dev-haskell/network plain-flags.conf and in /etc/portage/env/{cabal-extra.conf,plain-flags.conf} cabal-extra.conf: CABAL_EXTRA_CONFIGURE_FLAGS="--with-compiler=/usr/bin/x86_64-pc-linux-gnu-gcc" plain-flags.conf: CC="x86_64-pc-linux-gnu-gcc" CXX="x86_64-pc-linux-gnu-g++" LD="x86_64-pc-linux-gnu-ld" CFLAGS="-march=athlon64 -mtune=amdfam10 -O2 -pipe" CXXFLAGS="${CFLAGS}" LDFLAGS="-Wl,-O1 -Wl,--as-needed" 3) rebuild ghc, then restart emerge pandoc and haskell-network builds (and it even keeps going...) I agree haskell stuff does not respect CC/CXX but it should not make packages fail.
Do you have build.log with a package failure at hand?
> CABAL_EXTRA_CONFIGURE_FLAGS="--with-compiler=/usr/bin/x86_64-pc-linux-gnu-gcc"
--with-compiler requires haskell compiler, you likley need a --with-gcc=.
It makes packages fail when gcc doesn't support the CFLAGS a user provides. Finally tried to reproduce it today. The first prerequisite for build failure is presence of .c or .c++ files in haskell package. One of them is dev-haskell/re2 (overlay only), but there should be C-based packages as well, like network. My reproducer is: $ CC=clang CFLAGS=-fheinous-gnu-extensions HCFLAGS="-O0" emerge -1 dev-haskell/re2 Dependency vector -any: using vector-0.11.0.0 x86_64-pc-linux-gnu-gcc: error: unrecognized command line option ‘-fheinous-gnu-extensions’ That sounds about right. There is at least 2 places where compilers can be tweaked: - Cabal's --with-gcc= option (cabal's side .hsc -> .hs preprocessor) - GHC's owh overrides -pgmc/l/a Using comething like that in make.conf should workaround it: HCFLAGS="-pgmc${CC} -pgma${CC} -pgml${CC}" I'll try to plumb the same via haskell-cabal.eclass. > Using comething like that in make.conf should workaround it:
>
> HCFLAGS="-pgmc${CC} -pgma${CC} -pgml${CC}"
>
> I'll try to plumb the same via haskell-cabal.eclass.
This change tried to apply it but GHC is not designed to use these options
that way. It breaks all the default compiler flags recorded at ghc build
time.
diff --git a/eclass/ghc-package.eclass b/eclass/ghc-package.eclass
index 5466c0b..9824d13 100644
--- a/eclass/ghc-package.eclass
+++ b/eclass/ghc-package.eclass
@@ -14 +14 @@
-inherit versionator
+inherit toolchain-funcs versionator
@@ -29,0 +30,14 @@ ghc-getghcpkg() {
+# @FUNCTION: ghc-tcflags
+# @DESCRIPTION:
+# Function returns tool-chain-specific flags.
+# Currently only C compiler override for ghc.
+ghc-tcflags() {
+ local cc=$(tc-getCC)
+ local tcflags=(
+ -pgmc"${cc}" # C compiler
+ -pgma"${cc}" # assembler (via compiler)
+ -pgml"${cc}" # linker (via compiler)
+ )
+ echo "${tcflags[@]}"
+}
+
diff --git a/eclass/haskell-cabal.eclass b/eclass/haskell-cabal.eclass
index 4d338d1..392623d 100644
--- a/eclass/haskell-cabal.eclass
+++ b/eclass/haskell-cabal.eclass
@@ -221 +221 @@ cabal-bootstrap() {
- ${HCFLAGS} \
+ $(ghc-tcflags) ${HCFLAGS} \
@@ -374 +374 @@ cabal-configure() {
- for option in ${HCFLAGS}
+ for option in $(ghc-tcflags) ${HCFLAGS}
The changes in re2 before- and after- build.log:
-x86_64-pc-linux-gnu-gcc -fno-stack-protector -DTABLES_NEXT_TO_CODE -Idist/build/autogen -Idist/build -Ithird-party/re2-20140304/ -fPIC -U__PIC__ -D__PIC__ -xassembler -c /tmp/portage/dev-haskell/re2-0.1/temp/ghc22376_0/ghc_1.s -o dist/build/cbits/haskell-re2.o
+x86_64-pc-linux-gnu-gcc -Idist/build/autogen -Idist/build -Ithird-party/re2-20140304/ -fPIC -U__PIC__ -D__PIC__ -x assembler -c /tmp/portage/dev-haskell/re2-0.1/temp/ghc1760_0/ghc_1.s -o dist/build/cbits/haskell-re2.o
here we've lost 2 default flags:
-fno-stack-protector -DTABLES_NEXT_TO_CODE
|