Кабал не устанавливает зависимости при необходимости профилирующих библиотек?

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

$ 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 ответов

Решение

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

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

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

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

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

Задача установки профилирующих версий всех установленных библиотек стала менее трудоемкой, cabal (cabal-install) теперь следит за тем, что было установлено, используя его в world файл в .cabal каталог (на Linux, это было бы $HOME/.cabal, на винде что-то вроде 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это плохой знак, если вы не знаете, как с этим справиться, спросите #haskell IRC канал, один из списков рассылки, или здесь для руководства. Если не удается найти согласованный план установки из-за новых версий при взломе некоторых пакетов, которые несовместимы друг с другом, обычно это можно решить путем редактирования world файл и ограничение допустимых версий некоторых пакетов.

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

$ 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 Systems:

sudo apt-get install ghc-prof

Arch Linux Systems:

sudo pacman -S ghc-prof

Другие вопросы по тегам