Haskell 网络编程系列教程HaskellHaskell

给 PI zero 编译 Haskell 的应用

2019-04-10  本文已影响27人  Lupino

直接在 PI zero 上编译

在 PI zero 上面我们可以很方便的安装 haskell 的编译环境。

$ sudo apt update
$ sudo apt install ghc
$ sudo apt install haskell-stack

安装后发现 ghc 的版本 8.0.1, 相对应 stack 的版本 1.1.2
我们通过 https://www.stackage.org/ 找到 resolver: lts-7.24

我们来编译一个小应用

sudo apt install git
git clone https://github.com/Lupino/func.git
cd func
sed -i  "s/-rtsopts -with-rtsopts=-N//" func.cabal
stack --resolver lts-7.24 --system-ghc build
stack exec func

经过漫长的等待中,我们编译出来了。

我们能不能使加快编译速度呢?答案谁可以的。

在服务器上编译

用 Ubuntu 打包 PI zero 的系统,并拷到服务器上。

mount /dev/sdb2 /mnt 
cd /mnt
tar cjvf ~/rpi.tar.bz2 *
scp ~/rpi.tar.bz2 myserver:

登陆服务器为 PI zero 创建 chroot 环境

ssh myserver
apt update
apt install qemu-user-static
mkdir pi0
cd pi0
tar xvf ../rpi.tar.bz2
cp /usr/bin/qemu-arm-static usr/bin
chroot .

重新编译刚才的应用

cd /root
git clone https://github.com/Lupino/func.git
cd func
sed -i  "s/-rtsopts -with-rtsopts=-N//" func.cabal
stack --resolver lts-7.24 --system-ghc build
stack --resolver lts-7.24 --system-ghc --local-bin-path /root/bin install

把编译完的 func 拿到 PI zero 上面发现跑不了,它挂了。

这个让我郁闷了好久,后来找到了一篇老外的文章 Haskell on Raspberry Pi 3
按照它介绍的方法改了一下 /usr/lib/ghc/settings

$ vim /usr/lib/ghc/settings
...
 ("C compiler flags", " -marm -fno-stack-protector -mcpu=arm1176jzf-s"),
...
 ("Haskell CPP flags","-E -undef -traditional -mcpu=arm1176jzf-s"),
...

然后重新编译下,可以在 PI zero 上运行了。

编译 ghc 8.2.2

官方预编译好的 ghc 8.2.2 无法在 PI zero 上安装,由于 PI zero 内存有限我们无法直接在 PI zero 上编译。

我们拿到 chroot 环境上编译。

wget https://downloads.haskell.org/~ghc/8.2.2/ghc-8.2.2-src.tar.xz
tar cjvf ghc-8.2.2-src.tar.xz
cd ghc-8.2.2
./configure --prefix=/usr/local/ghc-8.2.2

我们修改一下 settings

...
 ("C compiler flags", " -marm -fno-stack-protector -mcpu=arm1176jzf-s"),
...
 ("Haskell CPP flags","-E -undef -traditional -mcpu=arm1176jzf-s"),
...
 ("LLVM llc command", "/usr/bin/llc-3.9"),
 ("LLVM opt command", "/usr/bin/opt-3.9")

编译 ghc

make 
make install
cd /usr/local
tar cjvf ghc-8.2.2.tar.bz2 ghc-8.2.2

把它安装到 PI zero 上

cd /usr/local
tar xvf /path/to/ghc-8.2.2.tar.bz2 
export PATH=/usr/local/ghc-8.2.2/bin:$PATH

升级 stack 1.9.3

stack-1.9.3-linux-arm.tar.gz 无法在 PI zero 上运行,我们需要在 chroot 环境下自己编译。

wget https://github.com/commercialhaskell/stack/releases/download/v1.9.3/stack-1.9.3-linux-arm.tar.gz
tar xvf stack-1.9.3-linux-arm.tar.gz
cp stack-1.9.3-linux-arm/stack /usr/local/bin

wget https://github.com/commercialhaskell/stack/archive/v1.9.3.tar.gz
tar xvf v1.9.3.tar.gz
cd stack-1.9.3
export PATH=/usr/local/ghc-8.2.2/bin:$PATH
stack --system-ghc --local-bin-path bin install

然后将编译好的 stack 安装到 PI zero 上。

小结

移植 haskell 应用到 Raspberry PI, 并没有想象中的那么难,使用本文介绍的两种方法,就可以完全解决这个问题。

上一篇 下一篇

猜你喜欢

热点阅读