直接在 PI zero 上編譯
在 PI zero 上面我們可以很方便的安裝 haskell 的編譯環(huán)境。
$ sudo apt update
$ sudo apt install ghc
$ sudo apt install haskell-stack
安裝后發(fā)現(xiàn) ghc 的版本 8.0.1, 相對應(yīng) stack 的版本 1.1.2。
我們通過 https://www.stackage.org/ 找到 resolver: lts-7.24。
我們來編譯一個小應(yīng)用
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
經(jīng)過漫長的等待中,我們編譯出來了。
我們能不能使加快編譯速度呢?答案誰可以的。
在服務(wù)器上編譯
用 Ubuntu 打包 PI zero 的系統(tǒng),并拷到服務(wù)器上。
mount /dev/sdb2 /mnt
cd /mnt
tar cjvf ~/rpi.tar.bz2 *
scp ~/rpi.tar.bz2 myserver:
登陸服務(wù)器為 PI zero 創(chuàng)建 chroot 環(huán)境
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 .
重新編譯剛才的應(yīng)用
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 上面發(fā)現(xiàn)跑不了,它掛了。
這個讓我郁悶了好久,后來找到了一篇老外的文章 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 上運(yùn)行了。
編譯 ghc 8.2.2
官方預(yù)編譯好的 ghc 8.2.2 無法在 PI zero 上安裝,由于 PI zero 內(nèi)存有限我們無法直接在 PI zero 上編譯。
我們拿到 chroot 環(huán)境上編譯。
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 上運(yùn)行,我們需要在 chroot 環(huán)境下自己編譯。
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 上。
小結(jié)
移植 haskell 應(yīng)用到 Raspberry PI, 并沒有想象中的那么難,使用本文介紹的兩種方法,就可以完全解決這個問題。