蟹さんも3.0

FreeBSDで開発していた[蟹さん](https://github.com/yamori813/rtlbm-mruby)をCeleron Dな[2005年くらいのPC](https://www.inversenet.co.jp/pclist/product/SOTEC-desk/PD331.html)にDebian 10/i386をインストールしてビルドを試してみました。Debianは最初GUI有りでインストールしてみたのですが、インストールはできましたが、重くて使い物にならず、GUI無しで再インストールしました。

まずは普通にホストでmrubyがビルドできるようにgccやruby,bisonなどのパッケージをapt-getでインストールします。あとmakeも使うのでインストールしておきます。

以前使っていたsourcefogeにあるアーカイブがダウンロードに失敗するので、githubにあるtoolchainを使うことにします。

% git clone https://github.com/frederic/rtl819x-toolchain.git

rtl819x-toolchain/toolchain/rsdk-1.5.5-5281-EB-2.6.30-0.9.30.3-110714/mips-linux/binにあるar,as,cc,ld,objcopy,objdump,ranlibをmips-付のシンボリックリンクを作ります。

```
% ls -l
total 9600
-rwxr-xr-x 1 hiroki hiroki  813318 Nov 21 14:32 ar
-rwxr-xr-x 1 hiroki hiroki 1222247 Nov 21 14:32 as
-rwxr-xr-x 1 hiroki hiroki  243605 Nov 21 14:32 c++
-rwxr-xr-x 1 hiroki hiroki  243605 Nov 21 14:32 g++
-rwxr-xr-x 1 hiroki hiroki  240947 Nov 21 14:32 gcc
-rwxr-xr-x 1 hiroki hiroki 1761824 Nov 21 14:32 ld
lrwxrwxrwx 1 hiroki hiroki       2 Nov 21 15:29 mips-ar -> ar
lrwxrwxrwx 1 hiroki hiroki       2 Nov 21 15:29 mips-as -> as
lrwxrwxrwx 1 hiroki hiroki       3 Nov 21 15:29 mips-cc -> gcc
lrwxrwxrwx 1 hiroki hiroki       2 Nov 24 06:48 mips-ld -> ld
lrwxrwxrwx 1 hiroki hiroki       7 Nov 24 07:01 mips-objcopy -> objcopy
lrwxrwxrwx 1 hiroki hiroki       7 Nov 24 07:00 mips-objdump -> objdump
lrwxrwxrwx 1 hiroki hiroki       6 Dec  2 09:46 mips-ranlib -> ranlib
-rwxr-xr-x 1 hiroki hiroki  798017 Nov 21 14:32 nm
-rwxr-xr-x 1 hiroki hiroki  961563 Nov 21 14:32 objcopy
-rwxr-xr-x 1 hiroki hiroki 1049819 Nov 21 14:32 objdump
-rwxr-xr-x 1 hiroki hiroki  813349 Nov 21 14:32 ranlib
lrwxrwxrwx 1 hiroki hiroki      14 Nov 21 14:32 rlxisa.bin -> rlxisa-rlx.bin
-rw-r--r-- 1 hiroki hiroki  176664 Nov 21 14:32 rlxisa-jupiter.bin
-rw-r--r-- 1 hiroki hiroki  182964 Nov 21 14:32 rlxisa-mars.bin
-rw-r--r-- 1 hiroki hiroki  161880 Nov 21 14:32 rlxisa-rlx.bin
-rw-r--r-- 1 hiroki hiroki  169272 Nov 21 14:32 rlxisa-venus.bin
-rwxr-xr-x 1 hiroki hiroki  961562 Nov 21 14:32 strip
 % ./mips-cc -v
Using built-in specs.
Target: mips-linux
Configured with: RSDK Builder release 1.5
Thread model: posix
gcc version 4.4.5-1.5.5p4 (GCC)
```

必要なソースを用意します。

% git clone --recursive https://github.com/yamori813/rtlbm-mruby.git
% wget ftp://sourceware.org/pub/newlib/newlib-2.5.0.20171222.tar.gz
% wget http://download.savannah.nongnu.org/releases/lwip/lwip-2.1.2.zip
% cd rtlbm-mruby
% git clone https://www.bearssl.org/git/BearSSL
% tar zxf ../newlib-2.5.0.20171222.tar.gz
% tar zxf ../lwip-2.1.2.zip

まずnewlibですが、4.0も先日リリースされていましたが、とりあえず以前使っていた2.5をビルドします。

```
#!/bin/bash

NEWLIB=newlib-2.5.0.20171222

sed -i -e '/__deprecated__/d' ${NEWLIB}/newlib/libc/include/stdlib.h
sed -i -e '/Unable to determine/d' ${NEWLIB}/newlib/libc/include/sys/_intsup.h

TOOLPATH=$HOME/rtl819x-toolchain/toolchain/rsdk-1.5.5-5281-EB-2.6.30-0.9.30.3-110714

PATH=$PATH:${TOOLPATH}/mips-linux/bin:${TOOLPATH}/libexec/gcc/mips-linux/4.4.5-1.5.5p4

cd ${NEWLIB};./configure --target=mips;make
```

次はlwip 2.1.2です。以前書いたMakefileがgmakeで動かなかったので、修正しました。

```
#!/bin/bash

LWIP=lwip-2.1.2

rm -rf ${LWIP}/realtek

cp -r build/lwip ${LWIP}/realtek

TOOLPATH=$HOME/rtl819x-toolchain/toolchain/rsdk-1.5.5-5281-EB-2.6.30-0.9.30.3-110714

PATH=$PATH:${TOOLPATH}/mips-linux/bin:${TOOLPATH}/libexec/gcc/mips-linux/4.4.5-1.5.5p4

cd ${LWIP}/realtek;make
```

BearSSLをビルドします。

```
#!/bin/bash

rm -rf BearSSL/build

cp build/BearSSL/RTL.mk BearSSL/conf/

TOOLPATH=$HOME/rtl819x-toolchain/toolchain/rsdk-1.5.5-5281-EB-2.6.30-0.9.30.3-110714

PATH=$PATH:${TOOLPATH}/mips-linux/bin:${TOOLPATH}/libexec/gcc/mips-linux/4.4.5-1.5.5p4

cd BearSSL;make CONF=RTL
```

BearSSLは乱数のパッチが必要なんですが、とりあえず後回しにします。

mrubyをビルドします。

```
#!/bin/bash

TOOLPATH=$HOME/rtl819x-toolchain/toolchain/rsdk-1.5.5-5281-EB-2.6.30-0.9.30.3-110714

PATH=$PATH:${TOOLPATH}/mips-linux/bin:${TOOLPATH}/libexec/gcc/mips-linux/4.4.5-1.5.5p4

cd mruby;rake MRUBY_CONFIG=/home/hiroki/rtlbm-mruby/build/mruby/build_config.rb
```

コミットしてないですが、build_config.rbはclangになっているところをgccに代えてます。

最後にvmをビルドします。

```
#!/bin/bash

TOOLPATH=$HOME/rtl819x-toolchain/toolchain/rsdk-1.5.5-5281-EB-2.6.30-0.9.30.3-110714

PATH=$PATH:${TOOLPATH}/mips-linux/bin:${TOOLPATH}/libexec/gcc/mips-linux/4.4.5-1.5.5p4

make
```

Debianはtftpコマンドが入っていないのでインストールします。

% sudo apt-get install tftp-hpa

インターフェースに蟹さんのサブネットのIPアドレスを設定します。

% sudo ip a add 192.168.1.1/24 dev enp0s14

パーマネントに設定しておく場合にはDebian 10の場合/etc/network/interfaceに以下を追加するだけでよいようです。

```
iface enp0s14 inet static
        address 192.168.1.1
        netmask 255.255.255.0
```

スクリプトのmrbイメージを作ります。

% ./mkmrb.rb samples/morse_hsc.rb


リセットを押しながら蟹さんに電源を入れて、ファーム焼きこみ受付状態にします。


% ./flash.sh samples/morse_hsc.img

% ./flash.sh main.rtl

vmのmain.rtlを焼くとリブートするので、先にスクリプトのバイナリを焼いています。

チカチカしました。

最近のマシンに比べればずいぶん遅いマシンですが、フルビルドしても1時間くらいでできます。

~~今のところsimplehttpが使えない状態です。事情があり自宅ではないところにいるためデバッグが極めて困難な状態です。誰かデバッグ手伝ってください。(2020/12/11)~~直りました(2021/01/03)