Кабал не устанавливает зависимости при необходимости профилирующих библиотек?
Я хочу скомпилировать свою программу с профилированием, поэтому я запускаю:
$ 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
первый. Тогда иди приготовь чай. Или испечь торт.
Кажется, что сейчас нет никакого способа: билет № 282 - профилирование версий библиотек не удалось должным образом: "Как обычно, проблема заключается в нехватке времени для реализации всех этих замечательных функций, которые мы все хотим".
Для посетителей 2016+: просто установите ghc-prof
Debian Linux Systems:
sudo apt-get install ghc-prof
Arch Linux Systems:
sudo pacman -S ghc-prof