Cabal не устанавливает зависимости при необходимости библиотек профилирования?
Вопрос
Я хочу скомпилировать свою программу с профилированием, поэтому запускаю:
$ cabal configure --enable-executable-profiling
...
$ cabal build
...
Could not find module 'Graphics.UI.GLUT':
Perhaps you havent installed the profiling libraries for package 'GLUT-2.2.2.0'?
...
$ # indeed I have not installed the prof libs for GLUT, so..
$ cabal install -p GLUT --reinstall
...
Could not find module 'Graphics.Rendering.OpenGL':
Perhaps you havent installed the profiling libraries for package 'OpenGL-2.4.0.1'?
...
Итак, проблема в том, что в отличие от обычного приветственного поведения Cabal, Cabal не разрешает зависимости и не устанавливает их, когда требуются библиотеки профилирования.
Я могу обойти это, разрешив зависимости вручную (путем следующих ошибок, которые появляются через некоторое время компиляции):
$ cabal install -p OpenGLRaw --reinstall
$ cabal install -p StateVar --reinstall
$ cabal install -p Tensor --reinstall
$ cabal install -p ObjectName --reinstall
$ cabal install -p GLURaw --reinstall
$ cabal install -p OpenGL --reinstall
$ cabal install -p GLUT --reinstall
А затем повторите для моей следующей зависимости..
Есть лучший способ сделать это?то есть заставить Cabal выполнять работу самостоятельно, как это делается для обычных библиотек?
Решение
я включил library-profiling: True
в моем ~/.cabal/config
файл.С этого момента любые новые установки будут автоматически включать профилирование.
К сожалению, это по-прежнему означает, что мне пришлось вручную переустанавливать уже установленные старые пакеты.Хотя, спустя некоторое время, делая это вручную, я сейчас большинство пакетов переустановлено с включенным профилированием...
Другие советы
Из комментария Тома Локхорста:
Я очень надеюсь, что кто-нибудь предложит лучший ответ, который не потребует от меня в следующий раз переустанавливать всю платформу Haskell вручную.
Для будущих посетителей:
Задача установки профилирующих версий всех установленных библиотек стала менее рутинной. cabal (cabal-install)
теперь отслеживает, что было установлено с его помощью в world
файл в .cabal
каталог (в Linux это будет $HOME/.cabal
, в Windows что-то вроде C:\Users\%YOU%\AppData\Roaming\cabal\
, на OSX ??).
Итак, после включения профилирования в config
файл (в том же каталоге) и очистку базы данных пакетов GHC (вы можете найти расположение глобальной и пользовательской базы данных для каждого файла). ghc-pkg list nonexisting
;удалите пакеты, установленные Cabal, из глобальной базы данных с помощью ghc-pkg unregister packagename
если они у вас есть, переименуйте или удалите всю пользовательскую базу данных — это необходимо, потому что world
file отслеживает только явно установленные пакеты, а не их зависимости), установка всего с поддержкой профилирования должна работать следующим образом:
$ cabal install --reinstall world --dry-run
Первый запуск с --dry-run
чтобы проверить наличие проблем, прежде чем что-либо переустанавливать.Если бы он переустановил загрузочные пакеты, такие как process
или directory
, это плохой знак, если не знаешь, как с этим справиться, спроси на #haskell
Канал IRC, один из списков рассылки или здесь для получения инструкций.Если не удается найти согласованный план установки из-за появления новых версий на хакерство некоторых пакетов, несовместимых друг с другом, обычно это можно решить, отредактировав файл world
file и ограничение допустимых версий некоторых пакетов.
Тогда, если вы оптимистичны и уверены, что ничего серьезно не сломается,
$ cabal install --reinstall world
и выпейте чашечку чая, пока GHC занят компиляцией.
Ответ Дэниела Фишера выглядит хорошо, но по какой-то причине моя библиотека ~/.cabal/world содержала только записи для непосредственно установленных библиотек, а не их зависимостей.
Вместо этого я выгрузил список всех установленных библиотек, используя
$ ghc-pkg list > list
Здесь перечислены библиотеки, установленные общесистемно и локально.Поэтому я отредактировал list
файл, чтобы удалить первую часть (содержащую библиотеки, установленные для всей системы), оставив только строки после /home/<user>/.ghc/...
.Наконец я побежал
$ cabal install --reinstall $(cat list)
Это сработало для меня.Возможно, тебе стоит сделать --dry-run
первый.Тогда иди заваривай чай.Или испечь пирог.
Для посетителей 2016+:Просто установите ghc-prof
Системы Debian Linux:
sudo apt-get install ghc-prof
Архивные Linux-системы:
sudo pacman -S ghc-prof