TOPPERSのビルドで困ったときのヒント

何回か問い合わせがあったものをピックアップしました。
誰かが幸せになれますように…。

# EV3RTではまりがちなもの

ETロボコンに参加するひとは、[ETrobo環境]( https://github.com/ETrobocon/etrobo )を使ってください。
**ETrobo環境ではここに紹介するものはすべて解消されています。**
ここでは、TOPPERS関係のみ扱います。ETrobo環境に関する問い合わせはETロボコン実行委員会の方にしてくださいね。 [^f1]
ETロボコン以外でEV3RTを使いたくて、ご自身で環境構築する時に気をつけてほしいことを書いています。

## ケース1) mkimageのリンク先がなくなっている（windows）
Mac版はTOPPERSの中の人がビルドしたものを提供しているので影響はないのですが、Windows版のリンク先がなくなっています。
新しいリンク先は [#1 Windows(Cygwin)版開発環境構築【後輩たちのためのEV3rt講座(改)】 Step3 U-bootのmkimage]( https://qiita.com/koushiro/items/6edd0a41803d06de7541#step3-u-boot%E3%81%AEmkimage )にわかりやすく書いてくれているので、そちらを参照してください。
おそらくこちらが移行先ではないかと思います。(TODO: 根拠の説明をかく)

Thanks:J.Arai(https://github.com/AlfortVanilla)

## ケース2) ビルドできたけどアプリを実行したら電源が落ちる（ローディング形式の場合）

:::note warn
ローディング形式の不具合の対処法ですが、スタンドアローン形式の場合もARM GCCのバージョンはこちらに合わせましょう。
:::

### まずはARM GCCのバージョンを確認する
EV3RTの場合、ARM GCCのバージョンが新しすぎるとダメです。
`arm-none-eabi-gcc -v` でバージョン表示してみてください。

```
gcc-arm-none-eabi-6-2017-q1-update (おそらく作者のテスト環境)
gcc-arm-none-eabi-6-2017-q2-update (私が使っているバージョン)
```
これ以上新しいものであれば、まずは、 `gcc-arm-none-eabi-6-2017-q1-update` に変えて試してみてください。
古いバージョンってどこにあるの？って方は [#1 Windows(Cygwin)版開発環境構築【後輩たちのためのEV3rt講座(改)】 ダウンロード]( https://qiita.com/koushiro/items/6edd0a41803d06de7541#%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89-1 )を参照してください。

参考：
https://dev.toppers.jp/trac_user/ev3pf/wiki/DevEnvLinux
> ARM用GCCの開発状況やバージョンアップに伴って，EV3RTのアプリのビルドに関する問題（例えば，ビルドはできるが正常に動作しない）が発生するようになりました

#### helloev3をビルドして実行してみる
ARM GCCのバージョンを確認したら、まずはhelloev3 というサンプルコードをビルドして実行してみましょう。
ご自身でビルドしたhelloev3が実行できれば、この問題は解決しているでしょう。



# EV3RT以外(のTOPPERS)でも発生するもの

主にRubyのバージョンアップに伴い動作しなくなったものです。
基本的にRuby2.6以前を使えば大丈夫です。

## ケース３）`require': cannot load such file -- shell (LoadError)

例えば以下のような感じのエラーが出た場合です。

```
Traceback (most recent call last):
        2: from ../configure.rb:47:in `<main>'
        1: from /usr/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'
/usr/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require': cannot load such file -- shell (LoadError)
```
Ruby2.7以降でshellライブラリが標準添付でなくなったため、RubyGemsとして外部からインストールする必要があります。
**おそらく最新バージョンのTOPPERSを使えば修正されているので、出なくなっているはず**
ですが、そうもいかない場合がありますよね…。
そんな場合の解決方法は２つ

1. `gem install shell` でshellをインストールする
1. RubyのバージョンをRuby2.6に下げる

参考）
[Ruby 2.7.0 リリース　その他の注目すべき 2.6 からの変更点](https://www.ruby-lang.org/ja/news/2019/12/25/ruby-2-7-0-released/)

> 以下のライブラリは標準添付ライブラリから削除されました。2.7 以降で使いたい場合は rubygems から利用してください。
CMath (cmath gem)
Scanf (scanf gem)
Shell (shell gem) 
（以下略


## cfgでRubyの警告

例えば、こんな感じ
3.0以降ではエラー？（未確認）

```
（パスを省略）/cfg/pass1.rb:178: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
/usr/lib/ruby/2.7.0/csv.rb:635: warning: The called method `open' is defined here
```

修正済み（未リリース 2021/12現在）のようですので、今後は出なくなるでしょう。

とりあえず、１箇所しか使われていないようなので、ご自身で修正するのも手ですね。
cfg/pass1.rbの修正箇所は以下を参考にしてください。
https://github.com/mROS-base/asp3-f767zi/commit/1f21cdaac246995d2a0fabe42bb4ce5028614035


## ケース4) tecsgenでRubyの警告もしくは、 ArgumentError (tried to create Proc object without a block)

Ruby 3.0以降では、メソッドがブロックを受け取る際、呼び出し元のブロックを暗黙に受け取ることができなくなりました。（Ruby 2.7では警告）

```
(PATH省略)/tecsgen/tecslib/core/bnf.tab.rb:5156: warning: Capturing the given block using Proc.new is deprecated; use `&block` instead
(PATH省略)/tecsgen/tecslib/core/componentobj.rb:4521: warning: Capturing the given block using Proc.new is deprecated; use `&block` instead
```

修正済み（未リリース 2021/12現在）のようですので、今後は出なくなるでしょう。
とりあえずは、Ruby2.6にして使う感じでしょうか。


参考）
[Ruby 2.7.0 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Procクラス > new]( https://docs.ruby-lang.org/ja/2.7.0/method/Proc/s/new.html)
> ただし、ブロックを指定しない呼び出しは推奨されていません。呼び出し元のメソッドで指定されたブロックを得たい場合は明示的に & 引数でうけるべきです。

[Ruby 3.0.0 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Procクラス > new](https://docs.ruby-lang.org/ja/3.0.0/method/Proc/s/new.html)
> [EXCEPTION] ArgumentError:
ブロックを省略した呼び出しを行ったときに発生します。


# さいごに

ひとまずわかってる範囲でまとめてみました。
妥協案の紹介ばかりでごめんなさいという感じですが、ひとまず先に進む手がかりになれば幸いです。
原因究明に協力くださった方、情報をくださった方、ありがとうございました！


[^f1]: 聞かれてもわからないので…