OpenWRTにmrubyを入れてみた

七転八倒してどうにかこうにかOpenWRTをDebian/i686でビルドできるようになったのでmrubyを追加してみます。

OpenWRTでバイナリーの構成はfeedsという仕組みになるようです。これのカスタム版を追加すればよいようです。

https://openwrt.org/docs/guide-developer/feeds

下のリポジトリのmrubyをcustom-feedディレクトリにコピーして、上のCustom Feedsの追加を行います。

https://github.com/MaksimAbramchuk/openwrt-mruby-package

これでmenuconfigにmrubyがで出てくるので選択してsaveしてexitしてmakeするとmruby入りイメージができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/09af1841-d405-84bd-f12d-881fe6e45a26.png)

```
$ make
 make[1] world
 make[2] target/compile
 make[3] -C target/linux compile
 make[2] buildinfo
 make[3] diffconfig buildversion feedsversion
 make[2] package/cleanup
 make[2] package/compile
 make[3] -C package/libs/libjson-c host-compile
 make[3] -C package/libs/libubox host-compile
 make[3] -C package/system/opkg host-compile
 make[3] -C package/libs/toolchain compile
 make[3] -C package/libs/libnl-tiny compile
 make[3] -C package/libs/libjson-c compile
 make[3] -C package/utils/lua compile
 make[3] -C package/libs/libubox compile
 make[3] -C package/system/ubus compile
 make[3] -C package/system/uci compile
 make[3] -C package/network/config/netifd compile
 make[3] -C package/firmware/linux-firmware compile
 make[3] -C package/firmware/prism54-firmware compile
 make[3] -C package/kernel/linux compile
 make[3] -C package/system/ubox compile
 make[3] -C package/libs/ncurses host-compile
 make[3] -C package/libs/zlib compile
 make[3] -C package/libs/ncurses compile
 make[3] -C package/utils/util-linux compile
 make[3] -C package/system/fstools compile
 make[3] -C package/system/fwtool host-compile
 make[3] -C package/system/fwtool compile
 make[3] -C package/system/usign host-compile
 make[3] -C package/system/ucert host-compile
 make[3] -C package/utils/jsonfilter compile
 make[3] -C package/system/openwrt-keyring compile
 make[3] -C package/system/usign compile
 make[3] -C package/base-files compile
 make[3] -C package/boot/uboot-envtools compile
 make[3] -C custom-feed/mruby compile
 make[3] -C package/firmware/wireless-regdb compile
 make[3] -C package/kernel/gpio-button-hotplug compile
 make[3] -C package/firmware/b43legacy-firmware compile
 make[3] -C package/libs/openssl compile
 make[3] -C package/libs/gettext compile
 make[3] -C package/libs/libiconv compile
 make[3] -C package/libs/libtool compile
 make[3] -C package/libs/wolfssl compile
 make[3] -C package/network/services/hostapd compile
 make[3] -C package/network/utils/iw compile
 make[3] -C package/kernel/mac80211 compile
 make[3] -C package/libs/mbedtls compile
 make[3] -C package/libs/ustream-ssl compile
 make[3] -C package/libs/uclient compile
 make[3] -C package/network/utils/iptables compile
 make[3] -C package/network/config/firewall compile
 make[3] -C package/network/config/swconfig compile
 make[3] -C package/network/ipv6/odhcp6c compile
 make[3] -C package/network/services/dnsmasq compile
 make[3] -C package/network/services/dropbear compile
 make[3] -C package/network/services/odhcpd compile
 make[3] -C package/libs/libpcap compile
 make[3] -C package/network/utils/linux-atm compile
 make[3] -C package/network/utils/resolveip compile
 make[3] -C package/network/services/ppp compile
 make[3] -C package/network/utils/iwinfo compile
 make[3] -C package/system/ca-certificates compile
 make[3] -C package/system/mtd compile
 make[3] -C package/system/opkg compile
 make[3] -C package/libs/libsepol compile
 make[3] -C package/libs/uclibc++ compile
 make[3] -C package/libs/pcre compile
 make[3] -C package/libs/musl-fts compile
 make[3] -C package/libs/libselinux compile
 make[3] -C package/system/procd compile
 make[3] -C package/system/urandom-seed compile
 make[3] -C package/system/urngd compile
 make[3] -C package/utils/busybox compile
 make[2] package/install
 make[2] target/install
 make[3] -C target/linux install
 make[2] package/index
 make[2] json_overview_image_info
 make[2] checksum
```

このホストではmrubyをビルドしたことがあったので、rubyなどのパッケージが入っていて、それが使われたものと思われます。

u-bootのオペレーションで出来上がったbin/targets/ath79/generic/openwrt-ath79-generic-buffalo_wzr-hp-g300nh-s-initramfs-kernel.binを焼いてみたところ、なんだか古いmrubyがビルドされていました。

```
root@OpenWrt:/# mruby -v
mruby 1.2.0 (2015-11-17) 
```

なぜこれをしたかったかと言うと、ZRouterでビルドして焼いたAtherosのmrubyが[パフォーマンスが悪く](https://qiita.com/yamori813/items/7d42dbdd4d5eb24d0c98)FreeBSDがまたしっくってるのではないかという疑念があったからです。

FreeBSD/armでv5のSOCをポートをしたらとんでもなく遅くて、どうもv6の対応入れた時にv5を壊してしまったようです。FreeBSDはプロジェクトの管理ができてません。

とりあえず古いmrubyでもいいのでfib(32)を実行してみました。

55秒です。[やっぱり遅い](https://qiita.com/yamori813/items/038027275d21e87388cd)です。

同時期のRalinkのチップなどと比較すると、おそらく適正なパフォーマンスは倍くらいで25秒くらいで処理できないとおかしいです。

想像ですがCPUのL1 Cacheやメモリコントローラーが言語系の処理に向いてないアーキテクチャになってしまっているのではないでしょうか。

Atheros最後の頃の74Kのチップでは適正なパフォーマンスが出ているのでAtherosも気がついていたような気がします。

FreeBSD/mipsは白のようです。