Ticket #256 (closed defect: fixed)
Error when Template Haskell is used and GHC is dynamic
|Reported by:||refold||Owned by:||Fūzetsu|
This was initially reported as a Cabal bug, but I'm now convinced that it's better to solve this issue on the Haddock side.
When trying to build documentation for a library that uses Template Haskell (for example, traverse-with-class) with GHC HEAD, I get the following error:
$ cabal configure -w ~/bin/ghc-head/bin/ghc Resolving dependencies... Configuring traverse-with-class-0.1... $ cabal haddock --with-haddock ~/bin/ghc-head/bin/haddock Running Haddock for traverse-with-class-0.1... Preprocessing library traverse-with-class-0.1... Haddock coverage: 0% ( 0 / 2) in 'Data.Generics.Traversable.Core' 100% ( 3 / 3) in 'Data.Generics.Traversable.TH' dist/build/tmp-5360/Data/Generics/Traversable/Instances.hs:1:1: cannot find normal object file ‛/tmp/.haddock-5369/Data/Generics/Traversable/Core.dyn_o’ while linking an interpreted expression
However, everything works fine with GHC 7.6.
The error is due to the fact that GHCi in GHC HEAD uses the system linker and so it requires the TH modules to be .dyn_o instead of .o (otherwise they can't be loaded because of the ABI mismatch). So the issue can be worked around by passing --optghc=-dynamic-too to cabal haddock:
$ cabal haddock --with-haddock ~/bin/ghc-head/bin/haddock --haddock-options="--optghc=-dynamic-too" Running Haddock for traverse-with-class-0.1... Preprocessing library traverse-with-class-0.1... Haddock coverage: 0% ( 0 / 2) in 'Data.Generics.Traversable.Core' 100% ( 3 / 3) in 'Data.Generics.Traversable.TH' 100% ( 1 / 1) in 'Data.Generics.Traversable.Instances' 93% ( 13 / 14) in 'Data.Generics.Traversable' Documentation created: dist/doc/html/traverse-with-class/index.html
We can work around this in Cabal, but I think that the right place to fix this issue is Haddock itself (since it also happens when Haddock is run in standalone mode - i.e. not being driven by cabal haddock).
To do this, you should do the equivalent of parsing the output of ghc --info and invoking GHC with the -dynamic option (or -dynamic-too if it's supported) when the output contains a ("GHC Dynamic","YES") tuple. I'm not quite sure how to implement this using GHC API, but it should be possible.