Компиляция Haskell в JavaScript с использованием GHCJS и Haskell Stack

Как можно скомпилировать Haskell в Javascript с помощью GHCJS и Haskell Stack?

У меня есть текущая версия Haksell Stack 1.5.1.

Я могу инициализировать проект GHCJS с помощью этой команды: stack new ghcjsSetup ghcjs

Оказавшись в каталоге проекта, я пытаюсь следовать документации стека для GHCJS.

Я создаю файл stack.yaml и редактирую его, чтобы он соответствовал примеру из документации, чтобы он выглядел так.

resolver: lts-7.19
compiler: ghcjs-0.2.1.9007019_ghc-8.0.1
compiler-check: match-exact

setup-info:
  ghcjs:
    source:
      ghcjs-0.2.1.9007019_ghc-8.0.1:
        url: http://ghcjs.tolysz.org/ghc-8.0-2017-02-05-lts-7.19-9007019.tar.gz
        sha1: d2cfc25f9cda32a25a87d9af68891b2186ee52f9

Следуя дальше документации, я пытаюсь установить и загрузить GHCJS с помощью этой команды:

stack setup

Эта команда производит вывод, который заканчивается ошибкой.

Preparing to install GHCJS to an isolated location.
This will not interfere with any system-level installation.
Preparing to download ghcjs-0.2.1.9007019_ghc-8.0.1 ...
Already downloaded.
Unpacking GHCJS into /home/u/.stack/programs/x86_64-linux/ghcjs-0.2.1.9007019_ghc-8.0.1/src/ ...
Setting up GHCJS build environment
Installing GHCJS (this will take a long time) ...
ghcjs-0.2.1.9007019: configure (lib + exe)
Package ghcjs uses a custom Cabal build, but does not use a custom-setup stanza
Using the explicit setup deps approach based on configuration
Strongly recommend fixing the package's cabal file
[1 of 2] Compiling Main             ( /home/u/.stack/programs/x86_64-linux/ghcjs-0.2.1.9007019_ghc-8.0.1/src/Setup.hs, /home/u/.stack/programs/x86_64-linux/ghcjs-0.2.1.9007019_ghc-8.0.1/src/.stack-work/dist/x86_64-linux/Cabal-1.24.0.0/setup/Main.o )
[2 of 2] Compiling StackSetupShim   ( /home/u/.stack/setup-exe-src/setup-shim-mPHDZzAJ.hs, /home/u/.stack/programs/x86_64-linux/ghcjs-0.2.1.9007019_ghc-8.0.1/src/.stack-work/dist/x86_64-linux/Cabal-1.24.0.0/setup/StackSetupShim.o )
Linking /home/u/.stack/programs/x86_64-linux/ghcjs-0.2.1.9007019_ghc-8.0.1/src/.stack-work/dist/x86_64-linux/Cabal-1.24.0.0/setup/setup ...
Configuring ghcjs-0.2.1.9007019...
ghcjs-0.2.1.9007019: build (lib + exe)
Preprocessing library ghcjs-0.2.1.9007019...

/home/u/.stack/programs/x86_64-linux/ghcjs-0.2.1.9007019_ghc-8.0.1/src/src/Compiler/JMacro/Base.hs:1:55: warning:
    -XOverlappingInstances is deprecated: instead use per-instance pragmas OVERLAPPING/OVERLAPPABLE/OVERLAPS

/home/u/.stack/programs/x86_64-linux/ghcjs-0.2.1.9007019_ghc-8.0.1/src/src/Compiler/JMacro/QQ.hs:1:55: warning:
    -XOverlappingInstances is deprecated: instead use per-instance pragmas OVERLAPPING/OVERLAPPABLE/OVERLAPS
[ 1 of 50] Compiling GHCJS.Prim.TH.Serialized ( lib/ghcjs-prim/GHCJS/Prim/TH/Serialized.hs, .stack-work/dist/x86_64-linux/Cabal-1.24.0.0/build/GHCJS/Prim/TH/Serialized.o )

Поскольку это слишком длинно для размещения здесь, я исключил середину вывода. Что включает в себя множество предупреждающих сообщений.

[49 of 50] Compiling Compiler.Program ( src/Compiler/Program.hs, .stack-work/dist/x86_64-linux/Cabal-1.24.0.0/build/Compiler/Program.o )
[50 of 50] Compiling GHCJS            ( src/GHCJS.hs, .stack-work/dist/x86_64-linux/Cabal-1.24.0.0/build/GHCJS.o )
Preprocessing executable 'ghcjs' for ghcjs-0.2.1.9007019...
[1 of 1] Compiling Main             ( src-bin/Main.hs, .stack-work/dist/x86_64-linux/Cabal-1.24.0.0/build/ghcjs/ghcjs-tmp/Main.o )
Linking .stack-work/dist/x86_64-linux/Cabal-1.24.0.0/build/ghcjs/ghcjs ...
Preprocessing executable 'ghcjs-boot' for ghcjs-0.2.1.9007019...
[1 of 1] Compiling Main             ( src-bin/Boot.hs, .stack-work/dist/x86_64-linux/Cabal-1.24.0.0/build/ghcjs-boot/ghcjs-boot-tmp/Main.o )

/home/u/.stack/programs/x86_64-linux/ghcjs-0.2.1.9007019_ghc-8.0.1/src/src-bin/Boot.hs:690:1: warning: [-Wtabs]
    Tab character found here, and in three further locations.
    Please use spaces instead.
Linking .stack-work/dist/x86_64-linux/Cabal-1.24.0.0/build/ghcjs-boot/ghcjs-boot ...
Preprocessing executable 'ghcjs-pkg' for ghcjs-0.2.1.9007019...
[1 of 1] Compiling Main             ( src-bin/Pkg.hs, .stack-work/dist/x86_64-linux/Cabal-1.24.0.0/build/ghcjs-pkg/ghcjs-pkg-tmp/Main.o )
Linking .stack-work/dist/x86_64-linux/Cabal-1.24.0.0/build/ghcjs-pkg/ghcjs-pkg ...
/usr/bin/ld: cannot find -ltinfo
collect2: error: ld returned 1 exit status
`gcc' failed in phase `Linker'. (Exit code: 1)

--  While building package ghcjs-0.2.1.9007019 using:
      /home/u/.stack/programs/x86_64-linux/ghcjs-0.2.1.9007019_ghc-8.0.1/src/.stack-work/dist/x86_64-linux/Cabal-1.24.0.0/setup/setup --builddir=.stack-work/dist/x86_64-linux/Cabal-1.24.0.0 build lib:ghcjs exe:ghcjs exe:ghcjs-boot exe:ghcjs-pkg exe:ghcjs-run exe:haddock-ghcjs exe:hsc2hs-ghcjs --ghc-options " -ddump-hi -ddump-to-file"
    Process exited with code: ExitFailure 1

person user8876236    schedule 02.11.2017    source источник
comment
Пакет, который компоновщик не может найти, называется вот этот. Он у вас установлен?   -  person user2407038    schedule 03.11.2017
comment
@user2407038 user2407038 Спасибо, что указали на пакет Debian libtinfo-dev. Когда я делаю stack setup после установки этого пакета, он получает эту ошибку. Теперь я получаю фатальное: требуется программный узел, но его не удалось найти на узле. Я установлю узел и попробую еще раз.   -  person user8876236    schedule 03.11.2017
comment
Я установил nodejs с помощью диспетчера пакетов Debian, но когда я пытаюсь stack setup, я все еще получаю то же сообщение об ошибке. Поэтому я не уверен, что он имеет в виду, когда говорит node.   -  person user8876236    schedule 03.11.2017
comment
Различные дистрибутивы вызывают исполняемый файл либо node, либо nodejs, IIRC. Возможно, вам потребуется создать символическую ссылку для другого имени.   -  person Michael Snoyman    schedule 03.11.2017
comment
@MichaelSnoyman да, ты прав. В Debian есть еще один пакет, который символически связывает nodejs с узлом под названием nodejs-legacy. После установки я могу закончить stack setup, а также stack build. И предупреждение, передающее привет от GHCJS! появляется, когда я открываю index.html в каталоге исполняемых файлов. Так что это работает сейчас.   -  person user8876236    schedule 03.11.2017


Ответы (1)


"Linking .stack-work/dist/x86_64-linux/Cabal-1.24.0.0/build/ghcjs-pkg/ghcjs-pkg ... /usr/bin/ld: cannot find -ltinfo"

Вам не хватает библиотеки libtinfo, которая является частью ncurses. В зависимости от вашей среды попробуйте что-то вроде:

sudo apt-get install libtinfo-dev


Кроме того, получить все части, необходимые ghcjs для успешной сборки, сложно и недостаточно документировано по состоянию на сентябрь 2018 года. Можно надеяться, что по мере развития проекта его станет легче устанавливать и что будет создан двоичный пакет. Знайте, что вы не единственный человек, у которого есть эти проблемы. Требуется некоторое терпение и метод проб и ошибок, чтобы заставить ghcjs работать прямо сейчас.

Другие успешно использовали nix, нет.

person John F. Miller    schedule 14.09.2018