Open accursoft opened 10 years ago
I use -dynamic
in ghc-options
as a workaround (with a similar configuration). But yes it need to be fixed.
This workaround is problematic if you build static libraries in a sandbox (for example profiling libraries) , the ghc-options are propagated and can't be cleared.
Perhaps there should be an extra option like ghc-options
just for building Setup
executables. Note that this is related to cross-compilation as well: once it's possible to specify a host compiler (cf. #1493) it seems natural to have a way of specifying additional flags for it as well.
There is another facet of this issue: If ghc is built without static (aka vanilla) libraries, then even the default Setup
executables for the Simple
build type fail to build.
FWIW this does affect Arch Linux now, because the default packages don't come with static libs anymore.
JFYI alex
is one of the widely known packages with custom-setup
and without too many deps. It fails during configure step:
[foo@arch alex-test]$ cabal install alex
Resolving dependencies...
Notice: installing into a sandbox located at
/home/foo/dev/alex-test/.cabal-sandbox
Configuring alex-3.2.3...
Failed to install alex-3.2.3
Build log ( /home/foo/dev/alex-test/.cabal-sandbox/logs/alex-3.2.3.log ):
cabal: Entering directory '/tmp/cabal-tmp-21549/alex-3.2.3'
cabal: Leaving directory '/tmp/cabal-tmp-21549/alex-3.2.3'
cabal: Error: some packages failed to install:
alex-3.2.3 failed during the configure step. The exception was:
user error ('/usr/bin/ghc' exited with an error:
/usr/bin/ld: cannot find -lHSCabal-1.24.2.0
/usr/bin/ld: cannot find -lHSprocess-1.4.3.0
/usr/bin/ld: cannot find -lHSpretty-1.1.3.3
/usr/bin/ld: cannot find -lHSdirectory-1.3.0.0
/usr/bin/ld: cannot find -lHSunix-2.7.2.1
/usr/bin/ld: cannot find -lHStime-1.6.0.1
/usr/bin/ld: cannot find -lHSfilepath-1.4.1.1
/usr/bin/ld: cannot find -lHSbinary-0.8.3.0
/usr/bin/ld: cannot find -lHScontainers-0.5.7.1
/usr/bin/ld: cannot find -lHSbytestring-0.10.8.1
/usr/bin/ld: cannot find -lHSdeepseq-1.4.2.0
/usr/bin/ld: cannot find -lHSarray-0.5.1.1
/usr/bin/ld: cannot find -lHSbase-4.9.1.0
/usr/bin/ld: cannot find -lHSinteger-gmp-1.0.0.1
/usr/bin/ld: cannot find -lHSghc-prim-0.5.0.0
/usr/bin/ld: cannot find -lHSrts_thr
collect2: error: ld returned 1 exit status
`gcc' failed in phase `Linker'. (Exit code: 1)
)
A more self-contained example fails with a different error, and it should also fail with "normal" GHC if vanilla is disabled:
Setup.hs
import Distribution.Simple
import Acme.Missiles
main = defaultMain
foo.cabal:
name: foo
version: 0.1.0.0
synopsis: foo
description: bar
homepage: https://github.com/githubuser/foo#readme
license: BSD3
license-file: LICENSE
author: Author name here
maintainer: example@example.com
copyright: 2017 Author name here
category: Web
build-type: Custom
extra-source-files: README.md
cabal-version: >=1.24
custom-setup
setup-depends: base <5, Cabal <2, acme-missiles <1
executable foo-exe
hs-source-dirs: app
main-is: Main.hs
build-depends: base <5
default-language: Haskell2010
The error is:
$ cabal sandbox init
Writing a default package environment file to
/home/foo/dev/alex-test/foo/cabal.sandbox.config
Creating a new sandbox at /home/foo/dev/alex-test/foo/.cabal-sandbox
$ cabal install
Resolving dependencies...
Notice: installing into a sandbox located at
/home/foo/dev/alex-test/foo/.cabal-sandbox
Configuring acme-missiles-0.3...
Building acme-missiles-0.3...
Installed acme-missiles-0.3
Configuring foo-0.1.0.0...
Failed to install foo-0.1.0.0
Build log ( /home/foo/dev/alex-test/foo/.cabal-sandbox/logs/foo-0.1.0.0.log ):
cabal: Entering directory '.'
cabal: Leaving directory '.'
cabal: Error: some packages failed to install:
foo-0.1.0.0 failed during the configure step. The exception was:
user error ('/usr/bin/ghc' exited with an error:
dist/dist-sandbox-aeee24c4/setup/setup.hs:2:1: error:
Failed to load interface for ‘Acme.Missiles’
There are files missing in the ‘acme-missiles-0.3’ package,
try running 'ghc-pkg check'.
Use -v to see a list of the files searched for.
)
Just to expand on @Piezoid's comment, using cabal install --ghc-option=-dynamic foo
, or adding ghc-options: -dynamic
in my $HOME/.cabal/config
works for me as a workaround.
I have a Haskell installation with only shared libraries, and cabal's config contains:
This fails for packages with
build-type: Custom
, because cabal-install tries to linksetup
against non-existent static libraries.