Как настроить 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, также известный как 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 (он удаляет только символическую ссылку).
И создайте символическую ссылку на 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
, построенной против нее.