给 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, 并没有想象中的那么难,使用本文介绍的两种方法,就可以完全解决这个问题。