stackとraspberry pi
raspberry pi で stack buildできなかった問題,解決
Rover Mini の ECUデータ読み出しプログラムを動作させるためにRaspberryPiを用意したのだが,Haskellのコンパイルがstackを使ってはできなかった。stackが使えないと,ライブラリの準備とかが大変。
発生していた問題
stack buildすると,アセンブラが,この機械語はARMでは使えないとのたまうエラー発生。
/tmp/ghc2452_0/ghc_6.s:44:0: error:
Error: selected processor does not support `movt r7,:upper16:stg_bh_upd_frame_info' in ARM mode
|
44 | movt r7, :upper16:stg_bh_upd_frame_info
| ^
原因と対策
原因はコンパイル時にCPUアーキテクチャがGHCに伝わらないstackのバグ。
対策は海外サイトのブログを参考に,GHCの設定ファイルにアーキテクチャ指示オプションの追加。以下は上記の参考サイトに書いてあるものだが,実際にはGHCの8.6.3がインストールされていたので,適宜8.0.1を8.6.3に読み替え。
$ vi ~/.stack/programs/arm-linux/ghc-8.0.1/lib/ghc-8.0.1/settings
...
("C compiler flags", " -marm -fno-stack-protector -mcpu=cortex-a7"),
...
あとがき
しかし,一昨日,車室内で冷却液の噴出をやらかしてくれたRover Miniはあえなく修理にまわすことに...。当面,ラズパイによるECUのモニタリングソフトの出番は先です。
あとがきその2
古いラズパイ上でHaskellを走らせたりWiFiドングルを使ったりしているのですが,いくつか注意点がありました(現在は解決済みのものもある):
- apt-get で入れられる stack のバージョンが古い。現在はRaspberianのもとになるディストリビューションが変更されたためか,関係者のご尽力により普通に入れられます(ただし,前述のGHCのコンパイルオプションが渡されないバグに注意)。
- 大型のライブラリをコンパイルしたり,インストール直後の何もコンパイルされていない状態から大量のライブラリをコンパイルすると,メモリとディスク上のスワップ領域を使い切ってOSごと固まってしまう模様。恒久的にスワップファイルのサイズを変える方法,恒久的にスワップファイルのサイズを変える方法その2,一時的にスワップファイルのサイズを変える方法
- WiFiドングルにはドライバが必要(ただし,ヤマダ電機で購入したElecomのドングル(型式:●●)は最新のOSだと初期設定でそのまま動きました)。