Подтвердить что ты не робот

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

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

$ 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

И затем повторите для моей следующей зависимости..

Есть ли лучший способ сделать это? i.e делают ли кабальную работу самостоятельно, как для обычных библиотек?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

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

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

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

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

$ cabal install --reinstall world

и у вас есть хороший горшок с чаем, в то время как GHC занят компиляцией.

Ответ 3

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

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

$ ghc-pkg list > list

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

$ cabal install --reinstall $(cat list) 

Это сработало для меня. Вы должны сначала сделать --dry-run. Затем сделайте чайник с чаем. Или испечь торт.

Ответ 5

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

Debian Linux Systems:

sudo apt-get install ghc-prof

Arch Linux Systems:

sudo pacman -S ghc-prof