haskell / haskell-language-server

Official haskell ide support via language server (LSP). Successor of ghcide & haskell-ide-engine.
Apache License 2.0
2.65k stars 354 forks source link

Detect GHC version mismatches #1008

Closed simonmichael closed 3 years ago

simonmichael commented 4 years ago

I built ghcide 0.5.0.0 with GHC 8.6. When I run it so, it fails thus:

~/src/hledger$ ghcide hledger-lib
ghcide version: 0.0.5 (GHC: 8.6.5)
Ghcide setup tester in /Users/simon/src/PLAINTEXTACCOUNTING/hledger.
Report bugs at https://github.com/digital-asset/ghcide/issues

Step 1/6: Finding files to test in /Users/simon/src/PLAINTEXTACCOUNTING/hledger
Found 57 files

Step 2/6: Looking for hie.yaml files that control setup
Found 1 cradle

Step 3/6, Cradle 1/1: Implicit cradle for /Users/simon/src/PLAINTEXTACCOUNTING/hledger
Cradle {cradleRootDir = "/Users/simon/src/PLAINTEXTACCOUNTING/hledger", cradleOptsProg = CradleAction: stack}

Step 4/6, Cradle 1/1: Loading GHC Session
ghcide:
lookupSymbol failed in relocateSection (relocate external)
/Users/simon/.stack/programs/x86_64-osx/ghc-8.8.1/lib/ghc-8.8.1/ghc-prim-0.5.3/HSghc-prim-0.5.3.o: unknown symbol `_stg_atomicModifyMutVar2zh'
ghcide: ghcide: unable to load package `ghc-prim-0.5.3'

I forget and I'm not finding it in the readme just now - is ghcide supposed to work across GHC versions ? Or do you have to use a ghcide compiled with the same GHC as your project ?

https://github.com/digital-asset/ghcide/issues/53 looks similar but the fix there doesn't seem to apply here.

simonmichael commented 4 years ago

Now I see it: "It's important that ghcide is compiled with the same compiler you use to build your projects." Alas!

simonmichael commented 4 years ago

In this project there's another stack yaml file for GHC 8.6. I hoped this would make ghcide happy, but it didn't:

stack --stack-yaml stack-ghc8.6.yaml exec -- ghcide hledger-lib

I installed another ghcide binary, this time building with GHC 8.8. This solved the problem.

It would be great if the tool could detect and warn about this common mistake.

aherrmann-da commented 4 years ago

In this project there's another stack yaml file for GHC 8.6. I hoped this would make ghcide happy, but it didn't [...]

AFAIK the stack cradle in hie-bios currently only looks at stack.yaml and cannot be configured to use another stack configuration, see https://github.com/mpickering/hie-bios/issues/44#issuecomment-532143616.

pepeiborra commented 4 years ago

It would be great if ghc-ide could detect a ghc version mismatch (compile-time vs run-time) and fail early.

How to implement this?

If it turns out that the ghc package is not always available in the runtime package database, an alternative approach could be to use the version of the base package. To record it at compile-time, one could invoke the ghc api via TH.

pepeiborra commented 4 years ago

This is probably generally useful so perhaps worth packaging it on its own if it doesn't already exist.

ndmitchell commented 4 years ago

__GLASGOW_HASKELL__ doesn't include the minor version, unfortunately. Loading any .hi file will trigger the bug though, so perhaps the best check is to early on load an hi file deliberately and see what happens, knowing that its failure is a dodgy runtime vs compiletime.

pepeiborra commented 4 years ago

There is also __GLASGOW_HASKELL_PATCHLEVEL1__

pepeiborra commented 4 years ago

I have uploaded ghc-check to Hackage. Changes to ghcide in https://github.com/pepeiborra/ghcide/tree/detect-ghc-mismatch, will send PR once haskell/ghcide#460 is merged.

iboy commented 4 years ago

Hi, is there a simple set of instructions to fix this? Sorry for the basic question but I've tried several things (on macOS Catalina) including using ghcup to switch versions of ghc (instructions here https://gitlab.haskell.org/haskell/ghcup-hs#manual-install) and re-compiling ghcide. Thanks in advance...

pepeiborra commented 4 years ago

Can you describe the problem @iboy ?

iboy commented 4 years ago

Hi,

macOS 10.15.4
VS code: Version: 1.45.1
ghc: 8.8.3 and 8.6.5

Thanks for your reply. Sorry for the length of this but I include the error messages... and I tried a couple of things to get this to build. I'm sure I'm making a simple mistake somewhere!

I'm following the steps in the ghcide README.md

ghc --version

reports 8.8.3

git clone https://github.com/digital-asset/ghcide.git
cd ghcide

I've tried both cabal and stack:

stack install

Finishes cleanly but - displays this indicating (I think) that ghc 8.6.5 has been used rather than the ghc I set (I tried switching ghc to 8.6.5 seeing if that would work):

Copying from /Users/granian/Develop/Haskell/Editor Support/ghcide/.stack-work/install/x86_64-osx/850bc63fdc2f4b6fa009859c8d6522cb6142cfaffad794062e584882dca14d46/8.6.5/bin/ghcide to /Users/granian/.local/bin/ghcide

Next step:

stack new TestProject simple
cd TestProject
ghcide

Okay. Different error this time: my error is:

Step 6/6: Type checking the files
File:     /Users/granian/Develop/Haskell/TestProject/Setup.hs
Hidden:   no
Range:    1:7-1:26
Source:   not found
Severity: DsError
Message: 
  Could not load module ‘Distribution.Simple’
  It is a member of the hidden package ‘Cabal-3.0.1.0’.
  You can run ‘:set -package Cabal’ to expose it.
  (Note: this unloads all the modules in the current scope.)
Files that failed:
 * /Users/granian/Develop/Haskell/TestProject/Setup.hs

Though I have had the same prim error as in this thread, below - now I'm going through it step by step - I can't replicate it!

ghcide: ghcide: unable to load package ghc-prim-0.5.3

Next: I removed ghcid to start again to try to replicate the error:

\~/.cabal/bin >>> rm ghcid
\~/.cabal/bin >>> rm ghcide
\~/.cabal/bin >>> rm ghcide-test-preprocessor 

This time, I ran:

ghcup set ghc 8.6.5

to see if that would match the ghc version indicated in the message above. Then I followed the previous steps and replicated the prim error.

Step 4/6, Cradle 1/1: Loading GHC Session
\> Using main module: 1. Package \`my-first-haskell-project' component my-first-haskell-project:exe:my-first-haskell-project with main-is file: /Users/granian/Develop/Haskell/my-first-haskell-project/src/Main.hs
\> Building all executables for \`my-first-haskell-project' once. After a successful build of all of them, only specified executables will be rebuilt.
\> my-first-haskell-project> configure (exe)
\> Configuring my-first-haskell-project-0.1.0.0...
\> my-first-haskell-project> initial-build-steps (exe)
\> Configuring GHCi with the following packages: my-first-haskell-project
\> /Users/granian/Develop/Haskell/my-first-haskell-project/.stack-work/install/x86_64-osx/92d0321f485b76a4aa342b0aec3819870d3b9a2cb846889dbce103c9d90a6263/8.8.3/pkgdb:/Users/granian/.stack/snapshots/x86_64-osx/92d0321f485b76a4aa342b0aec3819870d3b9a2cb846889dbce103c9d90a6263/8.8.3/pkgdb:/Users/granian/.ghcup/ghc/8.8.3/lib/ghc-8.8.3/package.conf.d
ghcide: 
lookupSymbol failed in relocateSection (relocate external)
/Users/granian/.ghcup/ghc/8.8.3/lib/ghc-8.8.3/ghc-prim-0.5.3/HSghc-prim-0.5.3.o: unknown symbol \`_stg_atomicModifyMutVar2zh'
ghcide: ghcide: unable to load package \`ghc-prim-0.5.3'

I've also tried initiating new Haskell projects

stack new my-project
cd my-project
stack setup

then running

ghcide

Same error:

ghcide: 
lookupSymbol failed in relocateSection (relocate external)
/Users/granian/.ghcup/ghc/8.8.3/lib/ghc-8.8.3/ghc-prim-0.5.3/HSghc-prim-0.5.3.o: unknown symbol `_stg_atomicModifyMutVar2zh'
ghcide: ghcide: unable to load package `ghc-prim-0.5.3'

This time, thought I switched my ghc version, the ghc lib used seems to be 8.8.3. Maybe I'm not quite getting the architecture of this - I'm exploring Haskell / IDE integration for the first time. Thanks for taking time to reply.

Kind regards, Ian

pepeiborra commented 4 years ago

Building ghcide

You are building ghcide with stack install which doesn't use the ghc installation in your system at all - stack is driven by the resolver specified in the stack.yaml descriptor and installs a private copy of ghc to build.

Building your project

You are using stack to build your project, so you need to tell ghcide to use stack to load it - this is done in the hie.yaml file. See the section "Test ghcide" in the README for more details on how this works. At the end of the day, you need to make sure that the resolver in your project stack.yaml file is the same or close to the resolver used to build ghcide, otherwise the ghc versions will not match

nrolland commented 4 years ago

@iboy did you solve that pb ?

On MacOS 10.13.6

But upon running ghcide or stack exec -- ghcide I get the same

Step 6/6: Type checking the files File: /Users/nrolland/Sync/clones/pickler-combinators/Setup.hs Hidden: no Range: 1:7-1:26 Source: not found Severity: DsError Message: Could not load module ‘Distribution.Simple’ It is a member of the hidden package ‘Cabal-3.0.1.0’. You can run ‘:set -package Cabal’ to expose it. (Note: this unloads all the modules in the current scope.)

pepeiborra commented 4 years ago

ghcide v0.2.0 now tries to detect ghc version mismatches via the ghc-check package, so this ticket can be closed

jneira commented 4 years ago

Afaik, it does not cover all cases, at least with a specific error message. Maybe the work in progress in hie-bios to detect the ghc used by the project at runtime could improve it?

pepeiborra commented 4 years ago

All the cases that I know of are covered (in HEAD). If you find a missing case, please open a new issue here or in the ghc-check issue tracker.