haskell / cabal

Official upstream development repository for Cabal and cabal-install
https://haskell.org/cabal
Other
1.62k stars 691 forks source link

pkg-config linker flags are not passed to ghc --make, leading to loading errors in TH #7082

Open nh2 opened 4 years ago

nh2 commented 4 years ago

When you use pkgconfig-depends, Cabal determines -I, -L and -l flags.

Of those, only the includDirs are passed to ghc --make here (and related code below it):

https://github.com/haskell/cabal/blob/09db4dc416c2ed5dd3e6fd4d38afa1db928f0a85/Cabal/src/Distribution/Simple/GHC/Internal.hs#L283

I believe that is insufficient, and the -L and -l flags need to be passed.

The reason:

Because -l/-L are not passed to ghc --make, you'll get an error like this:

[238 of 255] Compiling MyModule ( MyModule.hs, dist/build/MyModule.o )

<no location info>: error:
    ghc: panic! (the 'impossible' happened)
  (GHC version 8.6.5 for x86_64-unknown-linux):
    Loading temp shared object failed: /run/user/1000/ghc20683_0/libghc_47.so: undefined symbol: genPNG

Tragically, you get this error even if you don't make any use of that foreign code at compile time (e.g. you never need generatePNG at compile time, but only at run time), simply because GHC will try to satisfy all symbols when loading M, and then fail.

Current workaround

Set ghc-options: -L/path/to/mylib -lmylib in your cabal file, in addition to pkgconfig-depends: mylib.

This is bad, because you need to hardcode -L/path/to/mylib, and it varies across Linux distributions

Proposed solution

Pass the pkg-config-determined -L and -l flags to GHC, in the same way as we do it with -I flags.

bqv commented 3 years ago

+1, I seem to be seeing this too, and the workaround does fix it.

Edit: For those interating on nixos or using a nix shell, since those paths are not even remotely constant, you might do as I did and define the CABAL_CONFIG env var in your shell derivation to be:

pkgs.writeText "config" ''
  program-default-options
    ghc-options: -L${lib.getLib <yourlibrary>} -l<yourlib>
'';
dminuoso commented 3 years ago

Related: https://gitlab.haskell.org/ghc/ghc/-/issues/18822