RXのコンパイラをビルドし直した際のメモ

メモです。
以前の記事で Mac で使えるように GCC をビルドしたよという記事を流したのですが、不用意にライブラリバージョン名を限定してパスを指定してしまったため、バージョンアップで動かなくなるというポンコツっぷりを発揮してしまったのでビルドし直しました。その時にやった忘れそうなことをメモっておきます。

使用バージョン

こちらの GitHub リポジトリによると、どうやら以前入れた gcc 6.2.0 は微妙に動かないという。まあ実際微妙に動かない時あったなあ。
ということで 4.9.4 を入れることにしました。その他も含めて使用したバージョンは以下。

  • binutils-2.27
  • gcc-4.9.4
  • newlib-2.2.0

実行コマンド

コマンドはパクリですが、ログとして記載しておきます。

追記(2018/2/2): newlib に -enable-newlib-hw-fp を追加

# binutils
$ ../configure --target=rx-elf --prefix=/usr/local/rx-elf --disable-nls --with-system-zlib

# gcc(その1)
$ ./contrib/download_prerequisites # 展開したディレクトリのルートで実行
$ CXX='g++-7' ../configure --prefix=/usr/local/rx-elf --target=rx-elf --enable-languages=c --disable-libssp --with-newlib --disable-nls --disable-threads --disable-libgomp --disable-libmudflap --disable-libstdcxx-pch --disable-multilib --enable-lto --with-system-zlib

# newlib
$ ../configure --target=rx-elf --prefix=/usr/local/rx-elf -enable-newlib-hw-fp

# gcc(その2)
$ CXX='g++-7' ../configure --prefix=/usr/local/rx-elf --target=rx-elf --enable-languages=c,c++ --disable-libssp --with-newlib --disable-nls --disable-threads --disable-libgomp --disable-libmudflap --disable-libstdcxx-pch --disable-multilib --enable-lto --with-system-zlib

以下、ハマった点と解決策です。

ハマリポイントと解決策

「MPC とか、ちゃんとしたバージョンの奴使えよ」って言われた

brew で入れているのに言われました。と思ったら、brewmpfr が要件の 0.8.0+ を満たしていないことが判明。そこで
./contrib/download_prerequisites を実行することで、プロジェクト内に mpc やら mpfr やらのファイルをダウンロードできます。これを実行することでバージョンの不整合を防げました。

make中に fancy_abort だなんだってキレられる

なんかこれは Xcode に入っている llvm では無理ということらしい。ということで、CXX='g++-7' とすることで、ビルド時に使用する C++ コンパイラ を llvm(clang++) でなく gnu gcc(g++) として回避しました。それにしても、.c ファイルに #include <new> ってなんだよ。

実際にこれを使ってコンパイルすると -M= なんて知らねえよって言われる

このバージョンではまだ map ファイルの保存先を引数指定できないようです。代わりに単に -M とするだけで標準出力に内容が出ますから、-M とし、最後に > hoge.map としてリダイレクトで対処します。

おわりに

木曜の全休をコンパイラビルドに費やしてしまった。やっぱ素直に Linux 使ったほうがこういうのに向いてるよね(言っちゃった)。
同様に SH 用コンパイラーも実行不能となっていましたが、同様にやって解決しました。疲れた。

あと、ビルド中にターミナルのタイトルに sed って出ると「あぁ、gcc 開発者もシェル芸やるんだなあ」と思いますね(謎)