R8C の開発環境が作れないとのツイートをもらう・・
先日、Twitter で 過誤出来ないツイートをもらった。
ツイートは短く、詳細は不明なので、実際にどんな事が起きているのか判らなかった。
何度かやりとりをする中で、どうやら、これは Linux 環境で発生している事が判った。
その要因は、最新の gcc 環境(Version 11)などで、gcc-4.9.4 の C++ ビルドで失敗する事が判った。
そういえば、Windows の MSYS2 環境もしばらくアップデートしていない、そこで、まずは、MSYS2 をアップデートする事から始めた。
※Linux 環境は、ノートPC にあり、古いので、新しい環境に入れ直す必要があり、確認するのも時間がかかる。
pacman -Sy pacman
pacman -Syu
この段階で、データベースの更新に失敗して、先に進まない・・
MSYS2 は、かなり更新しているようで、根本的にシステムが大幅に変わったようだ、そこで、インストールからやり直す事にした。
念の為、MSYS2 のコア部分、「C:\msys64」をリネームして、残しておいた。
最新版をインストールして、必要なツールをインストール。
※複数パッケージのインストールが、マルチスレッドで同時進行するようになっているw
MSYS2 はアイコンが少し新しくなり、大きな変更があったようだ。
また、新たな環境が二つ追加された:
- MSYS
- mingw32
- mingw64
- ucrt64(追加)
- clang64(追加)
※追加された環境が、どのような特徴があるのか調べていない。(clang64 は何となく判る)
MSYS のカレント gcc は11系になっている。
gcc (GCC) 11.3.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
次に、R8C 用 gcc のビルドにとりかかる。
gcc のビルドは、MSYS で行う。(この環境がもっとも Linux などに近い)
手順を進めていって、やはり、gcc C++ の構築でエラーが発生して止まる・・・
うーーん、これは、どうしたものか・・・
そもそも、gcc-4.9.4 は古すぎると以前から思っていた。
しかし、開発環境を変更する事で、発生する別の問題を恐れて「まぁ動いているから枯れた方がいいかな」とも思っていた。
この機会に、手始めに R8C の開発環境をアップデートして、gcc-11 でエラー無くコンパイル出来るようにした方が建設的ではと思った。
この段階で、エラーを報告してくれた人は、ネットの情報を精査して、configure で生成された Makefile に、C++11 のオプションを付ける事で回避したようだ。
※なるほど、その回避もあるよなぁーと思ったが、やはり、gcc のビルドで特別な事を行うのは少し抵抗がある。
RX マイコンの開発環境では、最近は GNU-RX(魔改造されている)を使っている為、素の gcc を使う事が無くなっている。
RX のツールチェインは、以下の組み合わせとなっている。
binutils-2.34
gcc-7.5.0
newlib-2.4.0
組み合わせは重要で、リリースが同じくらいのパッケージを組み合わせないと、ビルドが通っても、コンパイル中にインターナルエラーで止まったり、
出来たコンパイラで作ったバイナリーをマイコンに焼いても動作しないなど、色々なトラブルが起こったりする。
そこで、R8C(m32c-elf)のビルドを上記組み合わせで作ってみた。
ビルド途中で、エラーで、失敗する・・・
うーーーん・・・
この組み合わせは、m32c-elf では相性が悪い・・・
そこで、少し古いバージョンの組み合わせで、色々試してみた。
m32c-elf は多分、メンテナンスされていないので、欲張らずにそこそこ新しい物で我慢する方が安全と考えた。
SSD(1TB) と、大きな主記憶(32GB)で武装された、最新の PC(Rizen7) でも、gcc のビルドは、そこそこの時間を要する。
色々、試して:
- binutils-2.28.1.tar.gz
- gcc-6.4.0.tar.gz
- newlib-2.4.0.tar.gz
この組み合わせで、ビルドが通った。
boost 問題・・・
r8cprog など、一部のコードは、boost を使っている。
本来なら、MSYS 環境に boost を入れるのが良いと思うが、mingw64 などには対応しているが、MSYS 環境には無い。
そこで、mingw64 環境に入れた boost を間借りする形で使っていた。
しかし、新しい MSYS2 ではそのやり方では問題が発生する事が判った。
そこで、boost_1_74_0 のアーカイブを取ってきて、C ドライブのルートに展開し、そのパスを食わせる事で解決した。
この変則的なやり方は、あまりスマートとは言えないが、手順は難しく無いので、まぁ及第点だろうか・・
R8C のプロジェクトを全ビルド
新しく出来たツールチェインを使って、R8C のプロジェクトを全てビルドしてみた。
エラー無くビルドが通った。
とりあえず、「UART_sample」を動かしてみて、ちゃんと動作するバイナリーが出来る事も確認した。
RX 関係も確認
RX 関係も、一応確認した。
RX の gcc ビルドは問題無く通ったので、「良し」としたが、boost のパスは、R8C と同じく変更した。
RL78 環境
RL78 も、R8C と同じ環境にして、gcc をビルドしてみた。
これも、順調に通り、構築出来た。
しかし、プロジェクトをビルドすると、gcc がインターナルエラーで停止する・・・
rl78-elf-g++ -c -std=c++17 -Wall -Werror -Wno-unused-variable -Wno-exceptions -Wno-unused-function -Os -mmul=g13 -DSIG_G13 -DF_CLK=32000000 -I. -I../ -I../G13 -o release/main.o main.cpp
In file included from main.cpp:15:0:
../common/format.hpp: In member function 'void utils::basic_format<CHAOUT>::out_fixed_point_(VAL, uint8_t, bool) [with VAL = long long unsigned int; CHAOUT = utils::stdout_chaout]':
../common/format.hpp:589:3: internal compiler error: in push_reload, at reload.c:1348
}
^
unrecognized DWARF version in .debug_info at 6
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.
make: *** [Makefile:112: release/main.o] Error 1
うーーーん、これは痛い・・・
そーいえば、ルネサスさん、RL78 用に LLVM ベースのコンパイラをリリースしているんだよなぁー、アレ試してみたいんだよなぁー
今ここ。
まとめ
とりあえず、R8C、RX 関係は、何とかなったので、RL78 も何とかしたいけど、時間切れ。
Linux 環境も試しておく必要があるし、まだ、時間がかかる。
R8C の教材も中途だし、中々先に進まない。
しかし、Windows の最新環境にマッチするように改修したのは、大きな進歩と思える。