Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

doctest in multi-GHC setting #396

Open
andreasabel opened this issue Jan 26, 2023 · 5 comments · May be fixed by #424 or haskell/cabal#10057
Open

doctest in multi-GHC setting #396

andreasabel opened this issue Jan 26, 2023 · 5 comments · May be fixed by #424 or haskell/cabal#10057
Labels
cabal repl Calling doctest via `cabal repl`

Comments

@andreasabel
Copy link
Collaborator

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

@sol
Copy link
Owner

sol commented Jan 31, 2023

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
Copy link
Owner

sol commented Jan 31, 2023

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

sol added a commit to sol/cabal that referenced this issue Feb 1, 2023
(when invoked via `cabal repl --with-ghc=doctest`)

This addresses sol/doctest#396.
@sol
Copy link
Owner

sol commented Feb 1, 2023

@andreasabel haskell/cabal#8718 addresses this in Cabal; no changes to doctest required.

sol added a commit to sol/cabal that referenced this issue Feb 1, 2023
wismill pushed a commit to wismill/cabal that referenced this issue May 27, 2024
wismill pushed a commit to wismill/cabal that referenced this issue May 27, 2024
@wismill wismill linked a pull request May 27, 2024 that will close this issue
5 tasks
@wismill
Copy link

wismill commented May 27, 2024

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.

@sol
Copy link
Owner

sol commented May 27, 2024

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.

@wismill wismill linked a pull request May 31, 2024 that will close this issue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
cabal repl Calling doctest via `cabal repl`
Projects
None yet
3 participants