`doctest` in multi-GHC setting
In a multi-GHC setting, we have e.g. ghc-9.4.4 and ghc-9.2.5 installed. These "know" of their companion programs like ghc-pkg. E.g. I can do
cabal repl -w ghc-9.2.5
even if my current ghc is ghc-9.4.4.
doctest however gets confused in such settings.
E.g. I installed doctest for 9.2.5:
$ cabal install -w ghc-9.2.5 doctest --program-suffix=-9.2.5
...
$ doctest-9.2.5 --version
doctest version 0.20.1
using version 9.2.5 of the GHC API
using /usr/local/bin/ghc-9.2.5
$ doctest-9.2.5 --numeric-version
9.2.5
As one can see, doctest is well aware of the GHC version it is build for.
However:
$ cabal repl -w doctest-9.2.5
Error: cabal: Version mismatch between ghc and ghc-pkg:
doctest-9.2.5 is version 9.2.5
/usr/local/bin/ghc-pkg is version 9.4.4
So this fails.
I can't shake the feeling that this cabal repl -w doctest is just a hack that in some benign cases works but in general fails.
The reason might be that cabal isn't really prepared to work with anything else but ghc. Frankly, I don't know how cabal determines ghc-pkg-x.y.z from ghc-x.y.z, but this might also just be implemented naively by some string manipulation (rather than involving ghc --numeric-version).
doctesthowever gets confused in such settings. E.g. I installeddoctestfor 9.2.5:$ cabal install -w ghc-9.2.5 doctest --program-suffix=-9.2.5 ... $ doctest-9.2.5 --version doctest version 0.20.1 using version 9.2.5 of the GHC API using /usr/local/bin/ghc-9.2.5 $ doctest-9.2.5 --numeric-version 9.2.5As one can see,
doctestis well aware of the GHC version it is build for. However:$ cabal repl -w doctest-9.2.5 Error: cabal: Version mismatch between ghc and ghc-pkg: doctest-9.2.5 is version 9.2.5 /usr/local/bin/ghc-pkg is version 9.4.4
From what I understand, cabal gets confused here, not doctest.
I can't shake the feeling that this
cabal repl -w doctestis just a hack that in some benign cases works but in general fails.
I'm not aware of any better (or even remotely robust) way to get the correct flags for a Cabal project.
AFAIK, e.g. hie-bios / hls use the same approach to get the correct flags for a source file + other tools could benefit from it too. If there are limitations with cabal then I think addressing these limitations in cabal is the way forward.
Frankly, I don't know how
cabaldeterminesghc-pkg-x.y.zfromghc-x.y.z
That's the relevant question.
Educated guess:
caballooks at the canonical path ofghc(all symlinks resolved) and then uses anyghc-pkgnext to that.- If there is no such
ghc-pkg(as would be the case withdoctest) thencabalfalls back to whateverghc-pkgis on thePATH.
(just an educated guess, somebody would need to confirm this by looking at the code)
A more robust way for cabal to find ghc-pkg would be to look at the output of ghc --info. ghc --info does not contain the path to ghc-pkg. However, it contain the path to unlit and ghc-pkg is in that same directory.
@andreasabel please try if --with-hc-pkg=ghc-pkg-9.2.5 can be used as a workaround.
@andreasabel https://github.com/haskell/cabal/pull/8718 addresses this in Cabal; no changes to doctest required.
I revived @sol's PR at haskell/cabal#10057.
@sol does hie-bios/hls uses the same ghc key in their augmented ghc --info? Because I wonder if an alternative ghc:path or path:ghc would allow more flexibility if adapted to other tools/values.
I revived @sol's PR at haskell/cabal#10057.
Great 👍
@sol does
hie-bios/hlsuses the sameghckey in their augmentedghc --info?
I'm not aware that they would do anything in that regard right now.
This is addressed by https://github.com/sol/doctest/pull/439.
With cabal-install version 3.12 or later try:
$ cabal install --ignore-project doctest --flag cabal-doctest
$ cabal doctest -w ghc-8.6.5
Examples: 2 Tried: 2 Errors: 0 Failures: 0