給 PI zero 編譯 Haskell 的應(yīng)用

直接在 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, 并沒有想象中的那么難,使用本文介紹的兩種方法,就可以完全解決這個問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容