nixOS + Haskell + стек + OpenGL + freeglut - PullRequest
       22

nixOS + Haskell + стек + OpenGL + freeglut

0 голосов
/ 27 сентября 2018

Я прочитал NixOS, Haskell, opengl: проблемы со сборкой и запуском программ openGL и все другие соответствующие проблемы, но я не могу получить простой глянцевый проект на Haskell (который раньше работал несколькомесяцев назад) на работу.

Использование проекта github

Попробуйте следующее:

$ git clone https://www.github.com/turion/rhine
$ cd rhine/
$ cd rhine-gloss/
$ stack build
$ stack exec rhine-gloss-gears 
freeglut (rhine-gloss-gears):  ERROR:  Internal error <FBConfig with necessary capabilities not found> in function fgOpenWindow

В этом проекте используется интеграция стека nix, как описано в этого ответа, но с тех пор как mesa был недавно переименован, соответствующая часть в stack.yaml теперь имеет вид:

nix:
  enable: true
  packages: [libGL libGLU freeglut]

С нуля

Убедитесь, что у вас есть cabal, stack и nixустановлены.Затем выполните следующие команды:

$ mkdir tempgloss
$ cd tempgloss

Создайте два файла со следующим содержимым:

$ cat Main.hs 
import Graphics.Gloss
main = display (InWindow "Nice Window" (200, 200) (10, 10)) white (Circle 80)

$ cat stack.yaml 
resolver: lts-12.10
nix:
  enable: true
  packages: [libGL libGLU freeglut]

Теперь выполните:

$ cabal init --is-executable -n --main-is=Main.hs -d gloss -d base -l MIT
[...]
$ stack build
[...]
$ stack exec tempgloss 

Что здесь не так?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Я только что выдвинул новую версию nixGL: http://github.com/guibou/nixgl`, которая позволяет запускать вашу программу как:

stack exec --no-nix-pure nixGLIntel rhine-gloss-gears

(заменить nixGLIntel на nixGLNvidia или nixGLNvidiaBumblebee, если необходимо).

0 голосов
/ 27 сентября 2018

(Это решение устарело в пользу другого моего решения, которое использует nixGL)

Проблема в том, что stack переопределяет LD_LIBRARY_PATH вашей установки nixos.по умолчанию он содержит что-то вроде /run/opengl-driver/lib:/run/opengl-driver-32/lib и переопределяется стеком путем к пути к библиотеке, предоставленной стеком, для меня он содержит: /nix/store/v1d3fmjjqzd1wh84w8dmy4i3hxzgaybf-libGL-1.0.0/lib:/nix/store/y9s4bbn6j54flhpggccrmjd7cv3nkw60-glu-9.0.0/lib:/nix/store/jx7018a4yvd0x79qwp8ad15h5isy1ny3-freeglut-3.0.0/lib:/nix/store/5z8gx1bjw5s0q96n191k0a8caqr4r580-ghc-8.4.3/lib:/nix/store/yypprmw8hrmvwyhhz23w8z25yjvdhnxb-git-2.18.0/lib:/nix/store/iw94llkj05wgaz268mlzvgx8jkbi1ss0-gcc-wrapper-7.3.0/lib:/nix/store/rxaclc3vhxbzgfllv7601i85z854h48a-gmp-6.1.2/lib

У меня нет простого решения, этона самом деле больно, что стек не меняет rpath вашего двоичного файла и вместо этого переопределяет LD_LIBRARY_PATH.

Мое быстрое и грязное решение:

  • a) Получите LD_LIBRARY_PATH извнутри стека:

stack exec -- env | grep LD_LIBRARY_PATH LD_LIBRARY_PATH=/nix/store/v1d3fmjjqzd1wh84w8dmy4i3hxzgaybf-libGL-1.0.0/lib:/nix/store/y9s4bbn6j54flhpggccrmjd7cv3nkw60-glu-9.0.0/lib:/nix/store/jx7018a4yvd0x79qwp8ad15h5isy1ny3-freeglut-3.0.0/lib:/nix/store/5z8gx1bjw5s0q96n191k0a8caqr4r580-ghc-8.4.3/lib:/nix/store/yypprmw8hrmvwyhhz23w8z25yjvdhnxb-git-2.18.0/lib:/nix/store/iw94llkj05wgaz268mlzvgx8jkbi1ss0-gcc-wrapper-7.3.0/lib:/nix/store/rxaclc3vhxbzgfllv7601i85z854h48a-gmp-6.1.2/lib

  • б) получить ваш текущий LD_LIBRARY_PATH:

$ echo $LD_LIBRARY_PATH /run/opengl-driver/lib:/run/opengl-driver-32/lib

  • c) получить реальный путь к вашему исполняемому файлу

$ stack exec --no-nix-pure which rhine-gloss-gears /tmp/rhine/rhine-gloss/.stack-work/install/x86_64-linux-nix/nightly-2018-09-26/8.4.3/bin/rhine-gloss-gears

здесь, --no-nix-pure позволяет stack видеть which, который должен быть доступен вваше текущее окружение.

d) объединить все это, используя:

LD_LIBRARY_PATH=yourLD_LIBRARY_PATH:theOneFromStack the_executable_path

Например:

LD_LIBRARY_PATH=/run/opengl-driver/lib:/run/opengl-driver-32/lib:/nix/store/v1d3fmjjqzd1wh84w8dmy4i3hxzgaybf-libGL-1.0.0/lib:/nix/store/y9s4bbn6j54flhpggccrmjd7cv3nkw60-glu-9.0.0/lib:/nix/store/jx7018a4yvd0x79qwp8ad15h5isy1ny3-freeglut-3.0.0/lib:/nix/store/5z8gx1bjw5s0q96n191k0a8caqr4r580-ghc-8.4.3/lib:/nix/store/yypprmw8hrmvwyhhz23w8z25yjvdhnxb-git-2.18.0/lib:/nix/store/iw94llkj05wgaz268mlzvgx8jkbi1ss0-gcc-wrapper-7.3.0/lib:/nix/store/rxaclc3vhxbzgfllv7601i85z854h48a-gmp-6.1.2/lib /tmp/rhine/rhine-gloss/.stack-work/install/x86_64-linux-nix/nightly-2018-09-26/8.4.3/bin/rhine-gloss-gears

...