I'm experiencing a problem with GL on NixOS: the problem seems to be old, but there is still no straightforward solution yet in 2017!
I'm trying to build a Haskell program using the Gloss
library. I have installed gloss
and everything it needs using the nix-shell -p mesa
and it seems to be properly build and istalled (using cabal install
). However if I build the program in the same nix-shell
it doesn't work:
$ nix-shell -p mesa_glu
[nix-shell:]$ ghc --make -O2 SnakePar.hs
Linking SnakePar ...
[nix-shell:]$ ./SnakePar
SnakePar: user error (unknown GLUT entry glutInit)
While working outside of a nix-shell
the linking stage failes:
$ ghc --make -O2 SnakePar.hs
[1 of 1] Compiling Main ( SnakePar.hs, SnakePar.o )
Linking SnakePar ...
/nix/store/<hash>-binutils-2.27/bin/ld: cannot find -lGLU
/nix/store/<hash>-binutils-2.27/bin/ld: cannot find -lGL
collect2: error: ld returned 1 exit status
`cc' failed in phase `Linker'. (Exit code: 1)
This happens even though I have manually installed the glu
library via nix-env -iA
.
$ nix-env -q
cabal-install-1.24.0.0
ghc-8.0.1
glu-9.0.0
I have tried using freeglut
or mesa
in the same manner, but none of these (or even all together) didn't work.
What am I missing?
This question is relevant but it doesn't help: nixos + haskell + opengl (prerequisites)
Solution: After switching to stack everything works.
I just fixed this, after three days of, well, being another not-happy Arch-user-until-last-week: try adding
freeglut
to thenix-shell
environment, i.e. usenix-shell -p mesa freeglut
.For
stack
users stumbling upon this answer, add this to~/.stack/stack.yaml
:The
nix-shell
solution doesn't work in this case -- the problem, as I'm guessing, is that Stack always works inside a pure environment even if run from inside anix-shell
. I did trypure: false
in thenix
section ofstack.yaml
, but that didn't work. This does, for now.mesa
is required to provide the C headers forOpenGLRaw
and other libraries (and this is why linking fails in your case, I believe).freeglut
provides the GLUT bindings (you'll get the "unknown GLUT entry" error otherwise) required at runtime.You may need to change the
mesa
there to something else, likemesa_glu
.