在树莓派上编译 Haskell

Posted

技术标签:

【中文标题】在树莓派上编译 Haskell【英文标题】:Compiling Haskell on the Raspberry Pi 【发布时间】:2013-07-19 20:31:58 【问题描述】:

我正在尝试在 Raspberry Pi 上编译 GHC 7.6.3。 Raspbian 附带的 GHC 7.4 版本不支持 ghci。 我打算打包 v 7.6.3 并使其可用。

过了很长一段时间,我在 Pi 上收到了这个错误:

HC [stage 0] utils/hp2ps/dist/build/Key.o
HC [stage 0] utils/hp2ps/dist/build/PsFile.o
HC [stage 0] utils/hp2ps/dist/build/Shade.o
HC [stage 0] utils/hp2ps/dist/build/Utilities.o
"inplace/bin/mkdirhier" utils/hp2ps/dist/build/tmp//.
HC [stage 0] utils/hp2ps/dist/build/tmp/hp2ps
Warning: -rtsopts and -with-rtsopts have no effect with -no-hs-main.
Call hs_init_ghc() from your main() function to set these options.
"cp" -p utils/hp2ps/dist/build/tmp/hp2ps inplace/bin/hp2ps
cp driver/ghc-usage.txt inplace/lib/ghc-usage.txt
cp driver/ghci-usage.txt inplace/lib/ghci-usage.txt
HC [stage 0] utils/genapply/dist/build/GenApply.o
"inplace/bin/mkdirhier" utils/genapply/dist/build/tmp//.
HC [stage 0] utils/genapply/dist/build/tmp/genapply
"cp" -p utils/genapply/dist/build/tmp/genapply inplace/bin/genapply
HC [stage 1] libraries/ghc-prim/dist-install/build/GHC/Types.o
Stack dump:
0.  Program arguments: /usr/bin/llc -O3 -relocation-model=static /tmp/ghc467_0/ghc467_0.bc  -o /tmp/ghc467_0/ghc467_0.lm_s --enable-tbaa=true 
1.  Running pass 'Function Pass Manager' on module '/tmp/ghc467_0/ghc467_0.bc'.
2.  Running pass 'ARM Instruction Selection' on function '@ghczmprim_GHCziTypes_Dzh_info'
/tmp/ghc467_0/ghc467_0.lm_s: openBinaryFile: does not exist (No such file or directory)
make[1]: *** [libraries/ghc-prim/dist-install/build/GHC/Types.o] Error 1
make: *** [all] Error 2

real    308m59.437s
user    292m8.320s
sys     10m18.220s

知道出了什么问题吗?

我怎样才能丢失构建系统生成的中间文件?

【问题讨论】:

看起来像是构建工具链中的某个错误。也许最好在 x86 系统上尝试交叉编译器。交叉编译器是一个薄弱环节(很可能会暴露一些错误),但至少其他工具经过了很好的测试。有关说明,请参见此处(从 x86 Linux 到 Raspberry Linux 的交叉似乎得到了很好的支持):ghc.haskell.org/trac/ghc/wiki/CrossCompilation Debian 提供了GHC 7.6.3 on arm,所以你不妨看看Debian 申请的ARM 相关的Patched。 谢谢你们。实际上我试图暂时切换到 sid 存储库来安装 ghc,但这最终导致了依赖关系的噩梦(它坚持要升级我的 libc)。所以我决定自己编译。 我尝试在 Raspberry Pi 上编译 Debian sid 版本的 ghc,并遇到与您完全相同的错误。告诉你是否可以让交叉编译工作! 呃,前两天编译也到这一步了。我想知道7.8是否存在同样的问题?可能会尝试编译。 【参考方案1】:

我从上游来源获得了使用 Raspberry PI 编译的 GHC-7.8.3。它不是很快,但它可以完成工作:

pi@arlanda ~ $ ghci
GHCi, version 7.8.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> 1+1
2

关键是做到以下几点:

    有足够的内存。插入外部硬盘并创建一个 4 GB 的交换分区。首先在fdisk 中选择分区类型为Linux swap,然后执行mkswap /dev/sdXX,最后执行swapon /dev/sdXX,其中XX 是磁盘id 字母和分区号。 使用rpi-update 将内核更新到最新版本以防止挂起。我还在/boot/cmdline.txt 文件的内核命令行末尾添加了smsc95xx.turbo_mode=N slub_debug=FP。 使用apt-get install binutils-gold 安装黄金链接器,因为常规ld.bfd 将无法创建动态库。问题是您不能使用gold 链接所有内容,而是需要将阶段1 与ld.bfd 链接。您需要按照说明进行操作 in this script (original information from here),但您还需要使用 ld.bfd 来运行初始的 ./configure 调用。 请耐心等待 - 编译需要几天时间。

【讨论】:

谢谢。按照这些说明,我设法在我古老的 Rev1 Raspberry Pi 上构建了 GHC 7.8.3。作为附加步骤,我不得不将adjust the GPU memory allocation 降至 16G。编译花了一周时间,我不得不重新启动编译几次,因为它被杀死了。【参考方案2】:

您可以随时查看 R-Pi 的官方 haskell 页面。希望它对你的帮助比对我的帮助更大。那里有一些非常有用的链接。

http://www.haskell.org/haskellwiki/Raspberry_Pi

【讨论】:

以上是关于在树莓派上编译 Haskell的主要内容,如果未能解决你的问题,请参考以下文章

树莓派4B刷入OpenHarmony 3.0,目前可显示与触控

树莓派编译构建 OpenCV C++ 项目

树莓派如何便捷的使用pi4j

Seetaface 向树莓派 移植

树莓派上的 Qt OpenGL 上下文

如何在树莓派2上安装Android系统