doctest icon indicating copy to clipboard operation
doctest copied to clipboard

`doctest` in multi-GHC setting

Open andreasabel opened this issue 2 years ago • 3 comments

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).

andreasabel avatar Jan 26 '23 22:01 andreasabel

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

From what I understand, cabal gets confused here, not doctest.

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.

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 cabal determines ghc-pkg-x.y.z from ghc-x.y.z

That's the relevant question.

Educated guess:

  1. cabal looks at the canonical path of ghc (all symlinks resolved) and then uses any ghc-pkg next to that.
  2. If there is no such ghc-pkg (as would be the case with doctest) then cabal falls back to whatever ghc-pkg is on the PATH.

(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.

sol avatar Jan 31 '23 15:01 sol

@andreasabel please try if --with-hc-pkg=ghc-pkg-9.2.5 can be used as a workaround.

sol avatar Jan 31 '23 20:01 sol

@andreasabel https://github.com/haskell/cabal/pull/8718 addresses this in Cabal; no changes to doctest required.

sol avatar Feb 01 '23 04:02 sol

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.

wismill avatar May 27 '24 09:05 wismill

I revived @sol's PR at haskell/cabal#10057.

Great 👍

@sol does hie-bios/hls uses the same ghc key in their augmented ghc --info?

I'm not aware that they would do anything in that regard right now.

sol avatar May 27 '24 10:05 sol

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

sol avatar Jul 18 '24 01:07 sol