如何在eeePc 701 / Ubuntu Netbook Remix 1.6(Lucid)上构建cabal-install

时间:2010-06-29 21:04:44

标签: haskell ghc cabal ubuntu-10.04 eeepc

不是编程问题,但我第一次看到这样的事情。
UNR 1.6(基于Ubuntu 10.04)安装了6.12.1版本的GHC 所以,为了构建cabal-install-0.8.2,我必须安装
 parsec,mtl,network和zlib的libghc6-包 然后,在启动'sh ./bootstrap.sh'后,我得到:

检查已安装的包ghc-6.12.1 ...
parsec已安装且版本正常。
网络已安装且版本正常。
Cabal已安装且版本正常。
mtl已安装且版本正常。
HTTP已经安装且版本正常 zlib已经安装且版本正常。
[1/1]编译Main(Setup.hs,Setup.o)
链接设置...
配置cabal-install-0.8.2 ...
为cabal-install-0.8.2预处理可执行文件...
建筑cabal-install-0.8.2 ...
[1/40]编译Distribution.Client.BuildReports.Types(Distribution / Client / BuildReports / Types.hs,dist / build / cabal / cabal-tmp / Distribution / Client / BuildReports / Types.o)
[2 of 40]编译Distribution.Client.Utils(Distribution / Client / Utils.hs,dist / build / cabal / cabal-tmp / Distribution / Client / Utils.o)

......关于未使用addPackageExcludeConstraint和响应的两个警告...

[39 of 40]编译Distribution.Client.Install(Distribution / Client / Install.hs,dist / build / cabal / cabal-tmp / Distribution / Client / Install.o)
[40/40]编译Main(Main.hs,dist / build / cabal / cabal-tmp / Main.o)
链接dist / build / cabal / cabal ...
collect2:ld以信号9结束[Processusarrêté]

cabal-install bootstrap期间出错:
构建cabal-install软件包失败

在链接和收集2之间(一分钟左右),我的硬盘驱动器的LED闪烁 好像很多文件都被写入或读取。

我不知道它是否相关,但这里是依赖项的版本
惊天动地-1.8.0.2
HTTP-4000.0.6
MTL-1.1.0.2
网络2.2.1.7
秒差距-2.1.0.1
zlib-0.5.2.0

3 个答案:

答案 0 :(得分:7)

正在发生的事情是内核正在杀死ld链接器进程,因为它使用了太多内存。

ld使用如此多内存的原因是因为一个名为“split objs”的功能,其结果是像libHSbase.a这样的标准库包含数以千计的小数.o文件。链接器没有针对此用例进行优化,最终使用大量内存。

“split objs”功能旨在通过仅链接实际使用的标准库的位来使编译的程序更小。它的工作原理是将每个编译的Haskell模块拆分为每个函数的单独.o文件。

所以对于内存较少的系统来说,这显然是一个问题,比如你的上网本。您链接的任何内容都可能发生,而不仅仅是cabal。可以在关闭splitobjs功能的情况下从源构建ghc。例如,Gentoo会自动为512Mb或更低RAM的机器执行此操作。因此,如果您想在上网本上可靠地使用ghc,则可能需要build it from source而不需要splitobjs。您可以在功能稍强的机器上构建ghc,然后将其传输到上网本。

将来,当我们在Linux上切换到默认使用共享库时,这个问题就会消失。

答案 1 :(得分:1)

我有同样的问题。我在ghc- .ebuild中随时添加splitobjs = NO。然后我重建ghc,但cabal-install仍然无法通过ld。因为我的gentoo框没有交换分区。所以我用2G usb磁盘创建一个临时交换分区。然后我可以建立cabal-install成功。 我发现它将使用额外的100M交换空间,而我的eeepc有512M内存。所以我认为你可以使用一个超过100M空间的USB磁盘。 只是: mkswap / dev / sd * swapon / dev / sd *

答案 2 :(得分:0)

dd if = / dev / zero of = / swapfile bs = 1024 count = 2048k mkswap / swapfile swapon / swapfile