Кабал не устанавливает зависимости при необходимости профилирующих библиотек? - PullRequest
44 голосов
/ 10 ноября 2009

Я хочу скомпилировать свою программу с профилированием, поэтому я запускаю:

$ 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 работать самостоятельно, как это делается для обычных библиотек?

Ответы [ 5 ]

45 голосов
/ 10 ноября 2009

Я включил library-profiling: True в моем ~/.cabal/config файле. С этого момента при любой новой установке автоматически включается профилирование.

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

30 голосов
/ 01 февраля 2012

Из комментария Тома Локхорста:

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

Для будущих посетителей:

Задача установки профилирующих версий всех установленных библиотек стала менее трудоемкой, cabal (cabal-install) теперь отслеживает то, что было установлено с ее использованием, в файле world в каталоге .cabal (в linux, что быть $HOME/.cabal, в Windows что-то вроде C:\Users\%YOU%\AppData\Roaming\cabal\, в OSX ??).

Таким образом, после включения профилирования в файле config (в том же каталоге) и очистки базы данных пакетов GHC (вы можете найти расположение глобальной и пользовательской базы данных для ghc-pkg list nonexisting; удалите установленные кабалой пакеты из глобальная база данных с ghc-pkg unregister packagename, если у вас есть, переименуйте или удалите всю пользовательскую базу данных - это необходимо, потому что файл world отслеживает только явно установленные пакеты, а не их зависимости), установка всего с поддержкой профилирования должна работать следующим образом:

$ cabal install --reinstall world --dry-run

Сначала запустите --dry-run, чтобы проверить наличие проблем, прежде чем что-либо переустанавливать. Если он будет переустанавливать загрузочные пакеты, такие как process или directory, это плохой признак, если вы не знаете, как с этим справиться, спросите на IRC-канале #haskell, одном из списков рассылки, или здесь для руководства , Если не удается найти согласованный план установки из-за новых версий на hackage некоторых пакетов, которые несовместимы друг с другом, это обычно можно решить, отредактировав файл world и ограничив допустимые версии некоторых пакетов. .

Тогда, если вы настроены оптимистично, что ничего не сломается,

$ cabal install --reinstall world

и выпейте чашку чая, пока GHC занят компиляцией.

15 голосов
/ 01 мая 2012

Ответ Даниэля Фишера выглядит хорошо, но по какой-то причине моя библиотека ~ / .cabal / world содержала только записи для непосредственно установленных библиотек, а не их зависимости.

Вместо этого я выкинул список всех установленных библиотек, используя

$ ghc-pkg list > list

В этом списке перечислены библиотеки, установленные для всей системы и локально. Поэтому я отредактировал файл list, чтобы удалить первую часть (содержащую библиотеки, установленные для всей системы), оставляя только строки после /home/<user>/.ghc/.... Наконец-то я побежал

$ cabal install --reinstall $(cat list) 

Это сработало для меня. Возможно, вам следует сначала сделать --dry-run. Тогда иди приготовь чай. Или испечь торт.

0 голосов
/ 11 августа 2016

Для посетителей 2016+: Просто установите ghc-prof

Системы Debian Linux:

sudo apt-get install ghc-prof

Arch Linux Systems:

sudo pacman -S ghc-prof

...