CrystalのプログラムをRaspberry pi上で動かす

この記事は MCC Advent Calendar 2017 - Adventar の7日目の記事です。

早くも3投稿目になりますががんばって行きましょう。

パッと記事の投稿予定をみると技術系の記事が多かったので同調圧力に負けてそういった記事を書いてみようと思います。

背景

ラズパイのGPIOとマイコンを連携(もしくはGPIOをそのまま使うなど)して、センサーから色々データをとったり家電を操作しようということ試みる。

インターフェースとしてWebサーバーを置こうということを思い立ったが、Railsとかいじるのも癪なのでなんか面白そうなWebフレームワークを探し始める。

Rubyライクな「Crystal」という言語でつくられた「Amethyst」というフレームワークを見つけたので使ってみようということになった。

そうメジャーな言語ではないと思うがCrystalについては最近いろいろな人がいじって話題にしているのでそちらを参考にしてほしい。

ポストRubyだなんだといっているがそういうのには興味なくて、使いやすい場面で使ってくれといったかんじ*1

問題点

紆余曲折*2あって、とりあえずラズパイにCrystalのコンパイラを乗せることにするがここで問題が発生する。

ARM向けのバイナリがない

さらに

コンパイラはCrystalで記述されている

対処

ザッと調べてみたところ、以前に「ARM向けコンパイラをつくる」というissueが立っていた。

このissueは「クロスコンパイルオプションを実装する」というissueにmergeされていた。

つまり、クロスコンパイルで自分でARM向けバイナリをビルドしろということか・・・

# helloworld.cr
puts "Hello world!"
$ crystal build --cross-compile -D arm --target=arm-unknown-linux-gnueabihf helloworld.cr --release --mcpu=arm1176jzf-s

今回つかったのはRaspberry pi zeroでCPUがARM1176JZF-Sですが、2や3ではCortexだったと思うのでまたオプションが変わってくるとおもいます。(試していないので性格なことはわかりませんが)

コンパイルすると、ターゲット環境で以下のコマンドを実行しろよ、といった雰囲気の文字列が表示されます

cc 'helloworld.o' -o 'helloworld'  -rdynamic  -lpcre -lgc -lpthread /usr/local/Cellar/crystal-lang/0.23.1_3/src/ext/libcrystal.a -levent -lrt -ldl -L/usr/lib -L/usr/local/lib

なるほど、ターゲット環境にもCrystalのソースはあったほうがいいわけだな。

いい感じにgit cloneして先程のコマンドを実行したところ実行形式バイナリがポンと吐かれました

$ ./helloworld
Hello world!

やりました。

まとめ

時間がなくてなんとかHelloWorldをするところまでしかこぎつけられませんでしたが、いい感じにやればいい感じに行くんじゃないかなという気がしています(がどうなんでしょうか)

なにはともあれ近いうちにAmethystを動かすところまで漕ぎ着けたいです。


明日の予定はありません!!!!各位!!!

adventar.org

*1:といった点ではWebに静的型付き言語はどうなのかと思うところもあるが...

*2:かどうかは諸説ある