【问题标题】:Cabal not installing dependencies when needing profiling libraries?Cabal 在需要分析库时没有安装依赖项?
【发布时间】:2010-12-14 20:02:35
【问题描述】:

我想用分析编译我的程序,所以我运行:

$ 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 像普通图书馆一样独立完成工作?

【问题讨论】:

  • 我在~/.cabal/config 文件中启用了library-profiling: True。从那时起,任何新安装都将自动启用分析。不幸的是,这仍然意味着我必须手动重新安装已经安装的旧软件包。虽然,在手动执行此操作一段时间后,我现在已重新安装大多数软件包并启用了分析...
  • @Tom Lokhorst:谢谢。此外,这似乎是最好/唯一的答案。因此,如果您愿意,可以将其作为答案记下来,以便我接受
  • 好吧,拒绝免费投票是不礼貌的 :-) 但是,我确实希望有人能提出更好的答案,下次不需要我手动重新安装完整的 Haskell 平台.
  • 如果您使用 Stack 并遇到此问题,this question and its answers 可能会帮助您。

标签: haskell profiling cabal


【解决方案1】:

我在~/.cabal/config 文件中启用了library-profiling: True。从那时起,任何新安装都将自动启用分析。

不幸的是,这仍然意味着我必须手动重新安装已安装的旧软件包。虽然,在手动执行此操作一段时间后,我现在已重新安装大多数软件包并启用了分析...

【讨论】:

  • 我想这是很多人都熟悉的例行公事。如果只有一个命令可以自动化这个原本费力的任务,例如cabal reinstall-all --with-library-profiling-enabled.
  • 真的需要重新编译所有库来分析我的应用程序吗?有没有办法在完全优化版本(内部没有分析代码)和分析版本之间更快地切换?
  • 经过数周令人沮丧的重新安装后,我建议您在对~/.cabal/config 进行上述更新后完全卸载所有内容。有几种方法可以做到这一点。一个是rm -rf ~/.ghc
【解决方案2】:
【解决方案3】:

来自 Tom Lokhorst 的评论:

我确实希望有人能提供一个更好的答案,这样下次我就不需要手动重新安装完整的 Haskell 平台了。

对于未来的访客:

安装所有已安装库的分析版本的任务变得不那么繁琐了,cabal (cabal-install) 现在可以在.cabal 目录中的world 文件中跟踪使用它安装的内容(在 linux 上,这将是$HOME/.cabal,在Windows 上类似于C:\Users\%YOU%\AppData\Roaming\cabal\,在OSX 上??)。

因此,在config 文件(在同一目录中)中启用分析后,并清除 GHC 的包数据库(您可以根据ghc-pkg list nonexisting 找到全局和用户 db 的位置;从带有ghc-pkg unregister packagename 的全局数据库,如果你有的话,重命名或删除整个用户db - 这是必要的,因为world 文件只跟踪显式安装的包,而不是它们的依赖项),安装所有具有分析支持的东西应该如下工作:

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

在实际重新安装任何东西之前,首先使用--dry-run 运行以检查问题。如果它会重新安装像 processdirectory 这样的引导包,这是一个不好的迹象,如果您不知道如何处理它,请在 #haskell IRC 频道、邮件列表之一或此处寻求指导.如果由于hackage上的一些软件包的新版本相互不兼容而无法找到一致的安装计划,通常可以通过编辑world文件并限制某些软件包的允许版本来解决。

那么,如果你乐观地认为不会出现严重问题,

$ cabal install --reinstall world

在 GHC 忙于编译的时候喝上一壶好茶。

【讨论】:

  • 如果在配置中设置为True,这实际上会启用分析吗?当我对现有软件包进行 --reinstall 时,它似乎需要 -p 标志
  • 我刚试过,cabal install --reinstall world 确实在启用分析的情况下重新安装。 library-profiling: True 可能在配置文件中被注释掉了吗?
  • 嘿,谢谢。我正在阅读 -- 作为命令行标志而不是评论。哎呀!
  • 我已经删除了~usr/lib/ghc/package.conf.d 中的数据库,当我尝试运行cabal install --reinstall world 时出现错误can't find a package database。您确定我们需要删除数据库吗?
  • @FordO。这看起来像全局包数据库,用户 db 通常在~/.ghc/$GHC_Version 下。只有用户 db 可以删除,删除整个全局包数据库会破坏您的 GHC。如果您有包 db 的备份,请恢复它,否则恐怕您需要重新安装 GHC。从全局数据库中,只有使用 cabal 安装的包才应该被注销。
【解决方案4】:

Daniel Fischer 的回答看起来不错,但由于某种原因,我的 ~/.cabal/world 库仅包含直接安装的库的条目,而不包含它们的依赖项。

相反,我使用

导出了所有已安装库的列表
$ ghc-pkg list > list

这列出了系统范围和本地安装的库。因此,我编辑了list 文件以删除第一部分(包含安装在系统范围内的库),只留下/home/<user>/.ghc/... 之后的行。最后,我跑了

$ cabal install --reinstall $(cat list) 

这对我有用。你也许应该先做--dry-run。然后去泡一壶茶。或者烤一个蛋糕。

【讨论】:

  • 根据丹尼尔上面的回答,世界文件应该只包含直接安装的包。我认为这个想法是 cabal 将为您解决依赖关系,并且它们可能会随着时间而改变。
  • 这里还有一些有用的 cmets:github.com/haskell/cabal/issues/275
【解决方案5】:

对于 2016 年以上的访问者:只需安装 ghc-prof

Debian Linux 系统:

sudo apt-get install ghc-prof

Arch Linux 系统:

sudo pacman -S ghc-prof

【讨论】:

  • pacman 仓库中目前没有包ghc-prof
猜你喜欢
  • 1970-01-01
  • 2018-10-22
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
相关资源
最近更新 更多