Как настроить Haskell + ghc-mod на OS/X?

Я сначала настроил Haskell из https://www.haskell.org/platform/, но у ghc-mod были проблемы с песочницами, и для его обновления мне нужна была новая кабала, которая нужен новый ghc. Или что-то типа того. (qaru.site/info/332869/...??)

Итак, я удалил все и установил из http://ghcformacosx.github.io/. Затем некоторые странные неудачи, создающие новую песочницу, были связаны с тем, что что-то не соответствовало действительности для счастливых людей. (https://github.com/haskell-suite/haskell-src-exts/issues/14)

Ok. Установлен счастливым. Теперь попробуйте (снова) установить ghc-mod, и я получаю гигантский беспорядок (ниже).

Должен ли я использовать http://www.stackage.org/?
Я видел, как некоторые люди упоминают ghc-pkg recache или cabal install cabal-install... Это те вещи, которые мне нужно делать?

Mess:

Resolving dependencies... Configuring ghc-mod-5.2.1.2... Building ghc-mod-5.2.1.2... Failed to install ghc-mod-5.2.1.2 Build log ( /Users/mark/.cabal/logs/ghc-mod-5.2.1.2.log ): Configuring ghc-mod-5.2.1.2... Building ghc-mod-5.2.1.2... Preprocessing library ghc-mod-5.2.1.2...

Language/Haskell/GhcMod/Convert.hs:1:51: Warning:
    -XOverlappingInstances is deprecated: instead use per-instance pragmas OVERLAPPING/OVERLAPPABLE/OVERLAPS [ 1 of 38] Compiling Language.Haskell.GhcMod.Read ( Language/Haskell/GhcMod/Read.hs, dist/build/Language/Haskell/GhcMod/Read.o ) [ 2 of 38] Compiling Language.Haskell.GhcMod.Cabal21 ( Language/Haskell/GhcMod/Cabal21.hs, dist/build/Language/Haskell/GhcMod/Cabal21.o ) [ 3 of 38] Compiling Language.Haskell.GhcMod.Cabal18 ( Language/Haskell/GhcMod/Cabal18.hs, dist/build/Language/Haskell/GhcMod/Cabal18.o ) [ 4 of 38] Compiling Language.Haskell.GhcMod.Cabal16 ( Language/Haskell/GhcMod/Cabal16.hs, dist/build/Language/Haskell/GhcMod/Cabal16.o ) [ 5 of 38] Compiling Language.Haskell.GhcMod.GHCChoice ( Language/Haskell/GhcMod/GHCChoice.hs, dist/build/Language/Haskell/GhcMod/GHCChoice.o ) [ 6 of 38] Compiling Language.Haskell.GhcMod.Error ( Language/Haskell/GhcMod/Error.hs, dist/build/Language/Haskell/GhcMod/Error.o )

Language/Haskell/GhcMod/Error.hs:12:1: Warning:
    Module ‘Control.Monad.Error’ is deprecated:
      Use Control.Monad.Except instead

Language/Haskell/GhcMod/Error.hs:40:10: Warning:
    In the use of type constructor or class ‘Error’
    (imported from Control.Monad.Error, but defined in Control.Monad.Trans.Error):
    Deprecated: "Use Control.Monad.Trans.Except instead"

Language/Haskell/GhcMod/Error.hs:40:10: Warning:
    In the use of type constructor or class ‘Error’
    (imported from Control.Monad.Error, but defined in Control.Monad.Trans.Error):
    Deprecated: "Use Control.Monad.Trans.Except instead" [ 7 of 38] Compiling Language.Haskell.GhcMod.Utils ( Language/Haskell/GhcMod/Utils.hs, dist/build/Language/Haskell/GhcMod/Utils.o )

Language/Haskell/GhcMod/Utils.hs:15:1: Warning:
    The import of ‘Control.Applicative’ is redundant
      except perhaps to import instances from ‘Control.Applicative’
    To import instances alone, use: import Control.Applicative()

Language/Haskell/GhcMod/Utils.hs:45:51: Warning:
    In the use of ‘strMsg’
    (imported from Language.Haskell.GhcMod.Error, but defined in Control.Monad.Trans.Error):
    Deprecated: "Use Control.Monad.Trans.Except instead" [ 8 of 38] Compiling Language.Haskell.GhcMod.Types ( Language/Haskell/GhcMod/Types.hs, dist/build/Language/Haskell/GhcMod/Types.o ) [ 9 of 38] Compiling Language.Haskell.GhcMod.Gap ( Language/Haskell/GhcMod/Gap.hs, dist/build/Language/Haskell/GhcMod/Gap.o )

Language/Haskell/GhcMod/Gap.hs:256:18:
    Not in scope: data constructor ‘ExposePackageId’
    Perhaps you meant ‘ExposePackage’ (imported from DynFlags) cabal: Error: some packages failed to install: ghc-mod-5.2.1.2 failed during the building phase. The exception was: ExitFailure 1

После применения принятого ответа (который, казалось, установил ghc-mod), запуск gch-mod дает следующее:

> ghc-mod check x.hs
cabal-helper-wrapper: Installing a private copy of Cabal, this might take a
while but will only happen once per Cabal version.

If anything goes horribly wrong just delete this directory and try again:
    /Users/mark/.ghc-mod/cabal-helper

If you want to avoid this automatic installation altogether install version
1.22.0.0 of Cabal manually (into your user or global package-db):
    $ cabal install Cabal-1.22.0.0
...In order, the following would be installed:
filepath-1.3.0.1 (latest: 1.4.0.0) (new version)
directory-1.2.2.1 (new version)
process-1.2.3.0 (reinstall) changes: directory-1.2.2.0 -> 1.2.2.1,
filepath-1.4.0.0 -> 1.3.0.1
Cabal-1.22.0.0 (latest: 1.22.2.0) (new version)
cabal: The following packages are likely to be broken by the reinstalls:
ghc-7.10.1
Cabal-1.22.2.0
Use --force-reinstalls if you want to install anyway.
cabal-helper-wrapper: Installing Cabal version 1.22.0.0 failed.
nYou have two choices now:
- Either you install this version of Cabal in your globa/luser package-db
  somehow
n- Or you can see if you can update your cabal-install to use a different
  version of the Cabal library that we can build with:
    $ cabal install cabal-install --constraint 'Cabal > 1.22.0.0'
nTo check the version cabal-install is currently using try:
    $ cabal --version

ghc-mod: readCreateProcess: /Users/mark/.cabal/libexec/cabal-helper-wrapper "/Users/mark/work/haskell/ixberg/dist" "entrypoints" "source-dirs" "ghc-options" "ghc-src-options" "ghc-pkg-options" "--with-ghc=ghc" "--with-ghc-pkg=ghc-pkg" "--with-cabal=cabal" (exit 1): failed

Странно, он хочет, чтобы версия Cabal была установлена:

> cabal --version
cabal-install version 1.22.0.0
using version 1.22.0.0 of the Cabal library

Ответы

Ответ 1

Изменить (август 2015 г.) Лучшее исправление

Лучший инструмент командной строки для установки двоичных файлов и библиотек Haskell с помощью удивительной FPComplete группы, называемой stack означает, что вы можете установить ghc-mod с stack install ghc-mod (вне проекта, чтобы сделать его глобальным), и он будет работать. Бинарный файл будет установлен на ~/.local/bin и должен быть помещен на ваш путь, чтобы ваш редактор мог его найти.

Я оставлю это ниже для тех, кто хочет знать, что означало адское убийство.

Проблема с DanielG Fork

Я спросил о Reddit от Haskell, а NihillstDandy объяснил, что GHC для Mac OS X не регистрирует библиотеку Cabal. Это неверно для вашей установки из http://ghcformacosx.github.io/. Он регистрирует библиотеку Cabal.

ghc-mod нуждается в библиотеке cabal для работы, но она не компилируется с библиотекой cabal. Вместо этого он компилируется с помощником кабала, и он смотрит, есть ли у вас зарегистрированная версия библиотеки cabal. Если он не найдет, то cabal-helper-wrapper установит личную копию, и в этом случае устал устанавливать ту же версию, что и с компиляцией cabal-install, cabal-1.22.0.0.

Когда я установил DanielG Fork, он работал для моего текущего проекта, но после тестирования в других проектах я получаю ту же ошибку, что и вы. Это проблема с вилкой, а не с Haskell (насколько я могу судить).


Оригинальный ответ

Итак, пока я писал этот пост, ghc-mod был исправлен для GHC-7.10. Благодаря DanielG!

  • git clone https://github.com/DanielG/ghc-mod
  • cd ghc-mod
  • cabal install -j4

И если вы получите ошибки, которые говорят "setup-Simple-Cabal-1.22.2.0-x86_64-osx-ghc-7.10.1: программа" счастливая "версия >= 1.17 требуется, но его невозможно найти.

  • cabal install happy -j4

То же самое для любых других проблем, и оно должно работать. (Хотя вы счастливы установить, поэтому он должен просто работать).


Остальная часть сообщения о том, как понизить исполняемый файл cabal, также известный как cabal-install, до версии 1.20.0.3. Хотя вы действительно можете использовать это для перехода на любую версию. Так как есть рабочая вилка ghc-mod, которая работает с GHC-7.10 и cabal-1.22, вам не нужно понижать, чтобы исправить ghc-mod.

Я просто оставил остальную часть сообщения здесь, поскольку, к сожалению, это проблема с Haskell в целом. Halcyon и nix - это способы устранения недостатков Haskell в этом отношении.


Как обновить Cabal в Haskell

Когда я написал это сообщение ghc-mod и ни одну вилку, скомпилированную с GHC-7.10 и версиями ниже 7.10, сломался с песочницами cabal-1.22.

Однако, даже если вы скомпилируете ghc-mod с GHC-7.8.4 (версия до 7.10) и cabal-1.20.0.3, вы по-прежнему не можете использовать ghc-mod внутри песочницы, созданной cabal-1.22 и выше. Таким образом, единственный способ использовать ghc-mod - либо понизить всю вашу систему до cabal-1.20.0.3, либо не использовать песочницы. Это означает, что вы все еще можете использовать GHC-7.10, но вам нужно использовать более старую версию cabal. То есть, если вы не хотите дождаться, пока координатор или кто-то другой его исправят для GHC-7.10. Его уже больше недели, но какой-то программист Haskell зафиксировал его в вилке (см. Выше).


Если вам здесь все-таки нужно, как скомпилировать ghc-mod с GHC-7.8.4 и cabal-1.20.0.3. Кроме того, я заменяю исполняемый cabal-1.22 на старый cabal-1.20.0.3. Обратите внимание: неважно, в какой каталог вы загружаете источники.

  • загрузите источник GHC-7.8.4 для вашей ОС из здесь
  • tar -xf path_to_zipped_source
  • cd path_to_ghc-7.8.4

Следующие шаги установят ghc-7.8.4 как ghc-7.8.4 в той же папке, что и ghc-7.10 для вас. -j4 должен сказать make использовать 4 потока для его компиляции.

  • ./configure
  • make install -j4

Чтобы получить правильную версию cabal, мы можем просто попросить cabal получить ее.

  • cabal get cabal-install-1.20.0.3
  • cd cabal-install-1.20.0.3

Теперь установите cabal с помощью ghc-7.8.4. Здесь cabal-1.22 потянет все приличия и должен дать вам некоторое предупреждение об установке другой версии библиотеки cabal (не путать с установкой cabal), это не должно вызывать проблем.

  • cabal --with-compiler=ghc-7.8.4 install

Итак, теперь вы должны установить cabal-1.20.0.4, но не на своем пути. Он будет в ~/.cabal/bin. Нам нужно сделать это глобальным, так что удалите cabal-1.22 (он удаляет только символическую ссылку).

  • rm `which cabal`

И создайте символическую ссылку на cabal-1.20.0.4. Btw, вам нужно будет удалить любые песочницы, сделанные вами с помощью cabal-1.22, и переделать их с помощью cabal-1.20.0.4.

Если у вас нет realpath, вы можете просто ввести полный путь к кабалу. Я использую его для попустительства.

  • cd ~/.cabal/bin
  • ln -s `realpath cabal`/usr/local/bin

Теперь вот как я скомпилировал ghc-mod на моем mac (вы можете столкнуться с собственными проблемами). Я не уверен, почему кабала не могла сделать это за один звонок, но это сработало в конце.

  • cabal --with-compiler=ghc-7.8.4 install happy
  • cabal --with-compiler=ghc-7.8.4 install haskell-src-exts-1.16.0.1
  • cabal --with-compiler=ghc-7.8.4 install hlint-1.9.19
  • cabal --with-compiler=ghc-7.8.4 install ghc-mod

Теперь вы сможете называть ghc-mod из любого места. Чтобы проверить это, просто введите ghc-mod после того, как у вас есть cabal sandbox init. Если он не вызывает никаких ошибок, тогда ваш в ясном.

Ответ 2

Версия исполняемого cabal, которая используется для настройки этого проекта, должна быть такой же, как версия глобального пакета cabal.

Легче установить совместимую версию cabal-install than cabal следующим образом:

$ ghc-pkg list | grep Cabal
    Cabal-1.22.2.0
$ cabal install cabal-install-1.22.2.0

Или создайте одно в песочнице и замените/теневой оригинал.

Затем не забудьте повторно сконфигурировать проект с помощью нового cabal:

$ cabal clean && cabal configure

Теперь ghc-mod должен работать.

Ответ 3

Если Cabal-1.22 не зарегистрирован (ghc-pkg list cabal), cabal-helper-wrapper установит личную копию, потому что ему нужна библиотека, установленная для работы, но она не хочет топать ничем, что может сломаться путем непосредственного обновления Cabal.

GHC для Mac OS X не регистрирует библиотеку Cabal, она поставляется в комплекте с версией cabal-install, построенной против нее.